WooCommerce: авторизация по номеру телефона без SMS проверки

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

В WooCommerce часто требуется упростить процесс входа, позволяя пользователям авторизоваться по номеру телефона. Однако интеграция SMS-провайдеров может быть дорогой и сложной. Задача — реализовать авторизацию по телефону без отправки SMS, используя только внутренние механизмы WordPress и WooCommerce.

Диагностика: почему стандартные методы не подходят

По умолчанию WooCommerce и WordPress не поддерживают вход по телефону. Попытки заменить email на телефон без дополнительной логики приведут к проблемам:

  • Отсутствие проверки владельца номера снижает безопасность.
  • Стандартный логин по email не работает с телефонными номерами.
  • Плагины SMS-авторизации требуют SMS-провайдеров и не подходят для данной задачи.

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

Решение: пошаговая реализация авторизации по телефону без SMS

1. Добавление поля ввода телефона на страницу входа WooCommerce

Добавим поле для телефона и скроем стандартный email/логин, чтобы пользователь вводил только номер телефона и пароль.

add_action('woocommerce_login_form_start', function() {
    echo '<p class="form-row form-row-wide"><label for="phone">Номер телефона</label><input type="text" class="input-text" name="phone" id="phone" autocomplete="tel" /></p>';
});

add_filter('woocommerce_login_form_fields', function($fields) {
    unset($fields['username']); // Убираем стандартное поле логина
    return $fields;
});

2. Переопределение процесса аутентификации по номеру телефона

Создадим функцию, которая будет искать пользователя по мета-данным с номером телефона и выполнять аутентификацию.

add_filter('authenticate', function($user, $username, $password) {
    if (empty($_POST['phone'])) {
        return new WP_Error('empty_phone', 'Введите номер телефона.');
    }
    $phone = sanitize_text_field($_POST['phone']);
    $user_query = new WP_User_Query(array(
        'meta_key' => 'billing_phone',
        'meta_value' => $phone,
        'number' => 1
    ));
    $users = $user_query->get_results();
    if (empty($users)) {
        return new WP_Error('invalid_phone', 'Пользователь с таким номером не найден.');
    }
    $user = $users[0];
    if (!wp_check_password($password, $user->user_pass, $user->ID)) {
        return new WP_Error('incorrect_password', 'Неверный пароль.');
    }
    return $user;
}, 20, 3);

3. Добавление минимальной валидации номера телефона

Для повышения надежности добавим проверку формата номера телефона перед поиском пользователя.

function is_valid_phone($phone) {
    // Пример: только цифры, от 10 до 15 символов
    return preg_match('/^\+?\d{10,15}$/', $phone);
}

add_filter('authenticate', function($user, $username, $password) {
    $phone = isset($_POST['phone']) ? sanitize_text_field($_POST['phone']) : '';
    if (!is_valid_phone($phone)) {
        return new WP_Error('invalid_phone_format', 'Неверный формат номера телефона.');
    }
    // Остальной код как выше
    return $user;
}, 10, 3);

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

  • Откройте страницу входа WooCommerce — должно отображаться поле «Номер телефона» вместо email.
  • Введите номер телефона, который сохранен в мета-поле billing_phone пользователя, и правильный пароль — вход должен быть успешным.
  • Попробуйте ввести неправильный номер или пароль — должны появиться соответствующие ошибки.
  • Проверьте, что стандартный вход по email не доступен.

Частые ошибки и их устранение

  • Пользователь с номером телефона не найден
    Убедитесь, что у пользователя действительно заполнено поле billing_phone в WooCommerce и номер совпадает по формату.
  • Проблемы с форматом номера
    Проверьте регулярное выражение в функции is_valid_phone() и подстройте под ваш формат (с кодом страны, без пробелов и т.д.).
  • Ошибка пустого телефона
    Проверьте, что поле phone корректно передается из формы, и что форма не кэшируется.
  • Конфликты с другими плагинами аутентификации
    Отключите сторонние плагины для теста и убедитесь, что приоритет фильтра authenticate достаточен (20 или больше).

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

  • Рассмотрите добавление капчи на страницу входа, чтобы минимизировать риск брутфорса при упрощенной авторизации.
  • Ограничьте количество попыток входа с одного IP через плагин или собственный код.
  • Храните номера телефонов в стандартизированном формате, например, с кодом страны без пробелов, чтобы избежать дубликатов.
  • Регулярно проверяйте и обновляйте список пользователей, чтобы исключить неактивные или подозрительные аккаунты.
  • Если безопасность критична, можно добавить дополнительный шаг верификации по email после входа по телефону.

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

МетодОписаниеПлюсыМинусы
Использование SMS-провайдераОтправка одноразового кода на телефонВысокая безопасность, проверка владенияСтоимость и зависимость от внешнего сервиса
Авторизация по телефону без SMS (описано в статье)Поиск пользователя по мета-полю и парольПростота и отсутствие расходовНизкая безопасность, возможно злоупотребление
Авторизация через email с телефоном как дополнительным полемСтандартный вход по email, телефон для уведомленийСтандартные механизмы безопасностиНе решает задачи входа по телефону
WordPress SAML авторизация: установка и настройка с примерами кода
27.03.2026
WordPress кастомные редиректы после входа: настройка и практические примеры
13.11.2025
WordPress регистрация без подтверждения по Email: как реализовать и зачем
03.02.2026
WooCommerce: автоматическое отключение подписки и удаление пользователя при отмене
10.07.2026
WooCommerce: автоматическое удаление пользователя при отмене подписки
07.07.2026