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

Почему нужна авторизация по телефону без пароля в WooCommerce?

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

Диагностика задачи: что нужно понимать перед реализацией?

Прежде чем внедрять авторизацию по телефону без пароля, уточните:

  • Имеется ли у вас SMS-шлюз для отправки кодов? Без него реализовать проверку не получится.
  • Как вы будете хранить и сопоставлять номера телефонов с пользователями в базе WooCommerce?
  • В каких местах сайта должен работать вход по телефону — только страница входа, оформление заказа, или все разделы?

Без ответа на эти вопросы простая авторизация невозможна.

Пошаговое решение: как подключить авторизацию по телефону в WooCommerce

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

Используем хук woocommerce_login_form, чтобы добавить поле:

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

2. Перехватываем отправку формы и отправляем SMS с кодом

При сабмите проверяем телефон, генерируем код и отправляем SMS. Код сохраняем в сессию или transient (лучше transient для безопасности).

add_action('woocommerce_login_post', function() {
    if (isset($_POST['phone_number'])) {
        $phone = sanitize_text_field($_POST['phone_number']);
        // Проверяем, есть ли пользователь с таким телефоном
        $user = get_users(array(
            'meta_key' => 'billing_phone',
            'meta_value' => $phone,
            'number' => 1,
            'count_total' => false
        ));
        if (!$user) {
            wc_add_notice('Пользователь с таким номером не найден', 'error');
            return;
        }
        $code = rand(100000, 999999);
        set_transient('login_sms_code_' . $phone, $code, 5 * MINUTE_IN_SECONDS);
        // Отправляем SMS через ваш шлюз
        // Например, send_sms($phone, "Ваш код: $code");
        wc_add_notice('Код подтверждения отправлен на ваш номер', 'notice');
        // После отправки показать форму для ввода кода
    }
});

3. Создаём форму для ввода кода подтверждения

Добавьте дополнительное поле на страницу входа при наличии transient с кодом:

add_action('woocommerce_login_form', function() {
    if (!empty($_POST['phone_number']) && get_transient('login_sms_code_' . sanitize_text_field($_POST['phone_number']))) {
        echo '<p class="form-row form-row-wide">';
        echo '<label for="sms_code">Код подтверждения <span class="required">*</span></label>';
        echo '<input type="text" name="sms_code" id="sms_code" class="input-text" />';
        echo '</p>';
    }
});

4. Проверяем введённый код и логиним пользователя

На обработке формы проверяем код и логиним пользователя программно:

add_action('woocommerce_login_post', function() {
    if (isset($_POST['phone_number']) && isset($_POST['sms_code'])) {
        $phone = sanitize_text_field($_POST['phone_number']);
        $code = sanitize_text_field($_POST['sms_code']);
        $saved_code = get_transient('login_sms_code_' . $phone);
        if ($code !== $saved_code) {
            wc_add_notice('Неверный код подтверждения', 'error');
            return;
        }
        delete_transient('login_sms_code_' . $phone);
        $user = get_users(array(
            'meta_key' => 'billing_phone',
            'meta_value' => $phone,
            'number' => 1,
            'count_total' => false
        ));
        if (!$user) {
            wc_add_notice('Пользователь не найден', 'error');
            return;
        }
        wp_set_current_user($user[0]->ID);
        wp_set_auth_cookie($user[0]->ID);
        wp_redirect(wp_get_referer() ?: wc_get_page_permalink('myaccount'));
        exit;
    }
});

Проверка результата: как убедиться, что всё работает?

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

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

  • Номер телефона не найден: Проверьте, что номера телефонов пользователей сохранены в мета-ключе billing_phone. Если в другом поле — измените запрос.
  • Код не приходит: Проверьте работу SMS-шлюза, настройки API и лимиты отправки.
  • Код не сохраняется или быстро истекает: Убедитесь, что transient сохраняется на 5-10 минут, и сервер поддерживает эту функцию.
  • Пользователь не логинится: Проверьте вызовы wp_set_current_user и wp_set_auth_cookie, а также отсутствие ошибок до редиректа.

Практические советы по безопасности и оптимизации

  • Обязательно используйте HTTPS для защиты данных при вводе номера и кода.
  • Ограничьте количество попыток ввода кода, чтобы избежать перебора.
  • Храните коды в transient, чтобы автоматически очищать устаревшие значения.
  • Для SMS-рассылок выбирайте проверенных провайдеров с поддержкой API и логированием.
  • Рассмотрите применение двойной авторизации для важных операций (например, изменение профиля).

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

ВариантПлюсыМинусыКомпромисс
Плагин SMS LoginБыстрая установка, готовый функционалЗависимость от плагина, ограниченная кастомизацияПодходит для быстрой реализации без навыков кода
Кастомный код с SMS APIПолный контроль, интеграция под задачиТребует разработки, поддержкаОптимально для уникальных требований
OAuth по телефону через сторонние сервисыБезопасность, поддержка 2FAСложность интеграции, стоимостьДля крупных проектов с бюджетом
Как правильно работать с post meta в WordPress без ошибок
23.01.2026
Как добавить свои поля в REST API WordPress для кастомных данных
21.12.2025
Как добавить автоматическое отслеживание изменений в WordPress
13.04.2026
WooCommerce: как использовать webhook'и для автоматизации задач
30.05.2026
Как добавить автоматические отзывы на сайт WordPress
02.03.2026

Совсем скоро здесь откроется ресурс о вордпресс.