WooCommerce: как реализовать авторизацию через SMS без плагинов

Диагностика проблемы: зачем нужна авторизация через SMS в WooCommerce

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

Типичные задачи:

  • Войти в аккаунт без пароля, только по номеру телефона и коду из SMS.
  • Обеспечить безопасность с помощью одноразового пароля (OTP).
  • Избежать установки громоздких плагинов, чтобы не нагружать сайт.

Пошаговое решение: реализация авторизации через SMS с использованием собственного кода

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

Создаем кастомную форму логина, где вместо логина пользователь вводит телефон.

<form id="sms-login-form" method="post" action="">
  <input type="tel" name="sms_phone" placeholder="Ваш номер телефона" required pattern="\+?\d{10,15}" />
  <button type="submit" name="send_sms_code">Получить код</button>
</form>

2. Отправка SMS с кодом подтверждения

Подключаем обработчик в functions.php или в своем плагине:

add_action('init', function() {
    if (isset($_POST['send_sms_code'])) {
        $phone = sanitize_text_field($_POST['sms_phone']);

        // Генерируем 6-значный код
        $code = wp_rand(100000, 999999);

        // Сохраняем код и номер в сессию
        if (!session_id()) {
            session_start();
        }
        $_SESSION['sms_login_code'] = $code;
        $_SESSION['sms_login_phone'] = $phone;

        // Отправка SMS (пример с внешним сервисом, замените на ваш API)
        $message = "Ваш код для входа: $code";
        $result = send_sms($phone, $message); // функция отправки SMS

        if ($result) {
            wp_redirect(add_query_arg('sms_sent', '1', wp_get_referer()));
            exit;
        } else {
            wp_die('Ошибка при отправке SMS');
        }
    }
});

Для функции send_sms($phone, $message) нужно интегрировать любой SMS-шлюз, например, через API Twilio, Nexmo, или российского провайдера. Ниже пример простой заглушки:

function send_sms($phone, $message) {
    // Реальная реализация зависит от выбранного API
    // Здесь просто имитация успеха
    return true;
}

3. Форма ввода кода и проверка

После отправки кода показываем форму для ввода кода:

<form id="sms-code-form" method="post" action="">
  <input type="text" name="sms_code" placeholder="Введите код из SMS" required pattern="\d{6}" />
  <button type="submit" name="verify_sms_code">Войти</button>
</form>

Обрабатываем проверку кода:

add_action('init', function() {
    if (isset($_POST['verify_sms_code'])) {
        if (!session_id()) {
            session_start();
        }
        $input_code = sanitize_text_field($_POST['sms_code']);
        if (isset($_SESSION['sms_login_code'], $_SESSION['sms_login_phone']) && $_SESSION['sms_login_code'] == $input_code) {
            $phone = $_SESSION['sms_login_phone'];

            // Ищем пользователя по метаполю с телефоном
            $user = get_users(array(
                'meta_key' => 'billing_phone',
                'meta_value' => $phone,
                'number' => 1,
                'count_total' => false
            ));

            if ($user) {
                // Авторизуем пользователя
                wp_set_current_user($user[0]->ID);
                wp_set_auth_cookie($user[0]->ID);
                unset($_SESSION['sms_login_code'], $_SESSION['sms_login_phone']);

                wp_redirect(home_url());
                exit;
            } else {
                wp_die('Пользователь с таким номером не найден');
            }
        } else {
            wp_die('Неверный код');
        }
    }
});

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

  • Перейдите на страницу с формой и введите номер телефона, который есть в базе WooCommerce (обычно хранится в мета данных пользователя billing_phone).
  • Проверьте, что приходит SMS с кодом (в тестах можно логировать код в debug.log).
  • Ввод кода должен привести к успешной авторизации без пароля.
  • Проверьте, что после авторизации пользователь действительно залогинен (например, функция is_user_logged_in() возвращает true).

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

  • Код не отправляется: проверьте корректность интеграции с SMS-шлюзом и наличии ключей API.
  • Код не совпадает: убедитесь, что сессия стартует до сохранения данных, а код не перезаписывается.
  • Пользователь не найден: проверьте, что номер телефона пользователя точно совпадает с вводимым, включая формат и префиксы (+7, 8 и т.п.). Желательно нормализовать номер (удалять пробелы, скобки).
  • Авторизация не сохраняется: убедитесь, что вызваны функции wp_set_current_user и wp_set_auth_cookie и нет ошибок.

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

  • Ограничьте число попыток ввода кода в течение определенного времени, чтобы избежать перебора (например, через transient или IP-логирование).
  • Используйте короткий TTL для сессии с кодом, например, 5 минут.
  • Храните коды только в сессии, не в базе данных, чтобы снизить риски.
  • Нормализуйте телефонные номера при сохранении и при вводе (убирайте все кроме цифр и знака +), чтобы избежать несоответствий.
  • Для высокой нагрузки лучше использовать отдельный микросервис SMS или очереди для отправки.

Таблица сравнения вариантов реализации авторизации через SMS

МетодПлюсыМинусыКогда использовать
Плагин (например, WP SMS Login) Быстрая установка, готовые функции Нагрузка, лишний код, часто платные API Если нужна простота и нет времени на разработку
Своя реализация на PHP и API SMS Контроль, легковесность, можно подстроить под бизнес Требует навыков, время на разработку и тестирование Когда важна кастомизация и оптимизация
Внешние сервисы с OAuth/SMS (например, Firebase) Надежность, масштабируемость Сложнее интегрировать, зависимость от сторонних сервисов Для крупных проектов с большим трафиком
Как использовать pre_get_posts для сложных условий выборки постов в WordPress
12.07.2026
Как создать динамический список постов с фильтрами в WordPress без плагинов
19.12.2025
Логика оценки продуктивности в WordPress: практическое руководство с примерами
31.12.2025
WooCommerce: решение проблемы с неотображением вариаций товаров
02.06.2026
Как заблокировать и удалить злоупотребления в WooCommerce через .htaccess
02.05.2026