WPForms: как реализовать авторизацию через SMS без пароля в WordPress

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

Традиционная авторизация через логин и пароль часто вызывает сложности у пользователей — забытые пароли, слабая безопасность, неудобство. Авторизация через SMS с одноразовым кодом (OTP) позволяет быстро войти на сайт без пароля, повышая удобство и безопасность. В WordPress с WPForms такую функцию можно реализовать с кастомной интеграцией.

Как работает авторизация через SMS с WPForms

Основная идея: пользователь вводит номер телефона в форму, получает SMS с кодом, вводит код в дополнительное поле, после проверки кода происходит авторизация или регистрация пользователя без пароля.

Требования для реализации

  • WPForms Pro для создания кастомных форм с полями;
  • SMS-шлюз (например, Twilio, SMS.ru или любой другой с API);
  • Навыки PHP для реализации проверки и авторизации;
  • Создание и хранение временных одноразовых кодов с ограничением по времени.

Пошаговое решение: создание формы и обработка SMS-авторизации

1. Создание формы с WPForms

Создайте форму с одним полем для номера телефона и кнопкой «Отправить код».

Затем добавьте второе поле — ввод кода с SMS, скрытое по умолчанию.

Можно использовать условную логику WPForms, чтобы второе поле появлялось после отправки первого.

2. Отправка SMS с одноразовым кодом

Добавьте хук wpforms_process_complete в functions.php или плагин для отправки SMS после отправки формы с телефоном:

add_action('wpforms_process_complete', 'send_sms_otp', 10, 4); function send_sms_otp($fields, $entry, $form_data, $entry_id) {     $phone = '';     foreach ($fields as $field) {         if ($field['name'] === 'Телефон') {             $phone = $field['value'];             break;         }     }     if (!$phone) return;      // Генерация кода     $otp = rand(100000, 999999);      // Сохраняем код и время в пользовательские метаданные или transient     set_transient('otp_' . md5($phone), $otp, 5 * MINUTE_IN_SECONDS);      // Отправка SMS (пример для SMS.ru)     $api_key = 'ВАШ_API_КЛЮЧ';     $message = "Ваш код для входа: $otp";     $url = "https://sms.ru/sms/send?api_id=$api_key&to=$phone&msg=" . urlencode($message);     wp_remote_get($url); }

3. Проверка кода и авторизация пользователя

Добавьте обработчик другой формы (или того же шага), где пользователь вводит код. Проверяйте код из transient, если совпадает — авторизуйте или создайте пользователя:

add_action('wpforms_process_complete', 'verify_sms_otp_and_login', 20, 4); function verify_sms_otp_and_login($fields, $entry, $form_data, $entry_id) {     $phone = '';     $input_otp = '';     foreach ($fields as $field) {         if ($field['name'] === 'Телефон') {             $phone = $field['value'];         } elseif ($field['name'] === 'Код из SMS') {             $input_otp = $field['value'];         }     }     if (!$phone || !$input_otp) return;      $stored_otp = get_transient('otp_' . md5($phone));     if ($stored_otp && $stored_otp == $input_otp) {         delete_transient('otp_' . md5($phone));          $user = get_user_by('login', $phone);          if (!$user) {             // Создаем пользователя с логином по телефону             $password = wp_generate_password(12, false);             $user_id = wp_create_user($phone, $password, $phone.'@noemail.local');             if (is_wp_error($user_id)) return;             $user = get_user_by('id', $user_id);         }          wp_set_auth_cookie($user->ID);         wp_set_current_user($user->ID);         do_action('wp_login', $user->user_login, $user);          // Редирект после успешной авторизации         wp_redirect(home_url('/dashboard'));         exit;     } }

Как проверить, что авторизация работает

  • Отправьте форму с номером телефона — проверьте получение SMS с кодом.
  • Введите код в форму — после отправки должна произойти авторизация и редирект.
  • Проверьте, что пользователь создан в разделе «Пользователи» WordPress с логином по номеру телефона.
  • Попробуйте повторно использовать код — должен быть невалиден.

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

  • SMS не отправляются: проверьте правильность API ключа, номер телефона с международным кодом, лог запросов сервиса SMS.
  • Код не сохраняется или не читается: убедитесь, что transient сохраняется и не удаляется раньше времени, проверяйте ключи и время жизни.
  • Пользователь не создается: проверяйте возвращаемые ошибки wp_create_user, уникальность логина (номер телефона должен быть уникален).
  • Не происходит авторизация после ввода кода: убедитесь, что вызываются wp_set_auth_cookie и wp_set_current_user, и что нет конфликтов с плагинами кэширования.

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

  • Ограничьте количество попыток ввода кода по IP и телефону, чтобы предотвратить перебор.
  • Используйте SSL на сайте — обязательное условие для безопасности авторизации.
  • Удаляйте or инвалидируйте OTP коды сразу после успешного входа.
  • Логи отправки SMS не храните с номерами телефонов в открытом виде.
  • Храните номера телефонов в едином формате, например, E.164.

Сравнение подходов к авторизации через SMS в WordPress

СпособПлюсыМинусыПример реализации
Через WPForms + кастомный кодГибкость, интеграция с уже используемыми формамиТребует разработки, знания API SMSКод из статьи
Плагины авторизации по SMS (например, miniOrange)Готовое решение, поддержкаПлатные, ограниченная кастомизацияminiOrange OTP Verification
Использование сторонних сервисов (Firebase Auth)Высокая надежность, масштабируемостьСложность интеграции с WordPress и WPFormsЧерез REST API и JS SDK
Как добавить многоуровневую валидацию в WPForms для WordPress
16.02.2026
WPForms и Gravity Forms: сравнение и выбор плагина форм для WordPress
10.04.2026
WPForms динамические поля с построением зависимых списков в WordPress
09.12.2025
WPForms и отправка данных форм в Google Sheets: практическое руководство
02.03.2026
WPForms: динамические поля с внешней логикой на примере кастомных условий
03.04.2026