WooCommerce: авторизация через телефон без плагинов

Проблема: стандартная авторизация WooCommerce не поддерживает вход по телефону

По умолчанию WooCommerce использует email и пароль для авторизации. Если вы хотите реализовать вход через номер телефона (без использования сторонних плагинов), нужно доработать функционал регистрации и авторизации, а также корректно сохранять и проверять телефон пользователя.

Диагностика: как понять, что авторизация по телефону не работает

  • Пользователи не могут войти по номеру телефона — форма принимает только email.
  • В админке отсутствует поле для телефона в профиле пользователя.
  • При попытке использовать номер телефона для входа — появляется ошибка «Неверное имя пользователя».

Пошаговое решение: добавляем авторизацию по номеру телефона

1. Добавляем поле телефона в профиль пользователя и регистрацию

В functions.php вашей темы или дочерней темы добавьте следующий код, чтобы расширить профиль пользователя:

function add_phone_field_to_user_profile( $user ) {
    ?>
    <h3>Дополнительные данные</h3>
    <table class="form-table">
        <tr>
            <th><label for="phone">Телефон</label></th>
            <td>
                <input type="text" name="phone" id="phone" value="<?php echo esc_attr( get_user_meta( $user->ID, 'phone', true ) ); ?>" class="regular-text" /><br />
                <span class="description">Введите номер телефона пользователя.</span>
            </td>
        </tr>
    </table>
    <?php
}
add_action( 'show_user_profile', 'add_phone_field_to_user_profile' );
add_action( 'edit_user_profile', 'add_phone_field_to_user_profile' );

function save_phone_field( $user_id ) {
    if ( !current_user_can( 'edit_user', $user_id ) ) {
        return false;
    }
    update_user_meta( $user_id, 'phone', sanitize_text_field( $_POST['phone'] ) );
}
add_action( 'personal_options_update', 'save_phone_field' );
add_action( 'edit_user_profile_update', 'save_phone_field' );

2. Добавляем поле телефона в форму регистрации WooCommerce

В functions.php добавьте:

function add_phone_field_to_registration() {
    ?>
    <p class="form-row form-row-wide">
        <label for="reg_phone">Телефон <span class="required">*</span></label>
        <input type="text" class="input-text" name="phone" id="reg_phone" value="<?php if ( ! empty( $_POST['phone'] ) ) echo esc_attr( wp_unslash( $_POST['phone'] ) ); ?>" />
    </p>
    <?php
}
add_action( 'woocommerce_register_form_start', 'add_phone_field_to_registration' );

function validate_phone_field_registration( $errors, $username, $email ) {
    if ( empty( $_POST['phone'] ) || ! preg_match( '/^\+?\d{10,15}$/', $_POST['phone'] ) ) {
        $errors->add( 'phone_error', 'Пожалуйста, введите корректный номер телефона.' );
    }
    return $errors;
}
add_filter( 'woocommerce_registration_errors', 'validate_phone_field_registration', 10, 3 );

function save_phone_field_registration( $customer_id ) {
    if ( isset( $_POST['phone'] ) ) {
        update_user_meta( $customer_id, 'phone', sanitize_text_field( $_POST['phone'] ) );
    }
}
add_action( 'woocommerce_created_customer', 'save_phone_field_registration' );

3. Реализуем вход через телефон вместо email

Заменим обработку логина, чтобы можно было ввести телефон или email:

function login_with_phone_or_email( $user, $username, $password ) {
    if ( is_email( $username ) ) {
        return $user; // Стандартная авторизация по email
    }
    // Поиск пользователя по телефону
    $user_query = new WP_User_Query( array(
        'meta_key' => 'phone',
        'meta_value' => sanitize_text_field( $username ),
        'number' => 1,
        'count_total' => false,
    ) );
    if ( ! empty( $user_query->results ) ) {
        $user = $user_query->results[0];
        if ( wp_check_password( $password, $user->user_pass, $user->ID ) ) {
            return $user;
        }
    }
    return new WP_Error( 'invalid_login', 'Неверный номер телефона или пароль.' );
}
add_filter( 'authenticate', 'login_with_phone_or_email', 20, 3 );

Проверка результата после внедрения

  • Зарегистрируйтесь новым пользователем, указав телефон.
  • Войдите на сайт, используя номер телефона в поле логина.
  • Проверьте, что в профиле пользователя в админке отображается и сохраняется телефон.
  • Попробуйте войти с неверным номером или паролем — должна появиться ошибка.

Частые ошибки и как их исправить

  • Номер телефона не сохраняется в профиле: Проверьте, что в форме есть поле с name="phone" и что функция сохранения вызывается.
  • Ошибка «Неверный номер телефона или пароль» даже при правильных данных: Проверьте формат телефона, он должен совпадать с записью, используйте единый формат с кодом страны.
  • Не работает вход по email после внедрения: Убедитесь, что фильтр authenticate корректно обрабатывает email и не блокирует стандартный процесс.

Практические советы по безопасности и производительности

  • Используйте единый формат телефона, например E.164, чтобы избежать дублирования записей и ошибок при поиске.
  • Не храните пароли в открытом виде, используйте стандартные функции WordPress (wp_hash_password, wp_check_password).
  • Ограничьте число попыток входа, чтобы предотвратить подбор паролей по телефону.
  • Кэшируйте запросы пользователей, если трафик большой, но избегайте кэширования авторизационных запросов.

Сравнение способов реализации авторизации по телефону

Способ Плюсы Минусы
Код в functions.php Контроль, отсутствие сторонних плагинов, можно кастомизировать под проект Требует знаний PHP, возможность ошибок, сложнее поддерживать
Плагины авторизации по телефону Быстрая установка, готовый функционал, поддержка Зависимость от плагина, возможные конфликты, лишний код
Сторонний сервис SMS + кастомный код Повышенная безопасность, подтверждение номера по SMS Стоимость SMS, сложнее в настройке
Как отключить комментарии на отдельных страницах WordPress
31.03.2026
Отложенный запуск задач в WordPress без пингов: практическое руководство
14.04.2026
Как удалить избитые шорткоды в WordPress: практические методы и примеры кода
11.03.2026
Как создать динамический список постов по таксономии в WordPress
24.02.2026
Отсутствие категории в URL WordPress: как исправить и настроить
16.02.2026