Contact Form 7: авторизация через форму с подтверждением по телефону через SMS

Диагностика задачи: зачем нужна авторизация через телефон в Contact Form 7

В типичных проектах на WordPress иногда требуется реализовать авторизацию или регистрацию пользователя через форму, встроенную в Contact Form 7 (CF7), с подтверждением телефонного номера через SMS. Это позволяет снизить риск спама, повысить качество лидов и упростить вход.

Однако CF7 не предоставляет такой функционал из коробки, поэтому нужно интегрировать сторонние SMS-сервисы и добавить логику проверки кода подтверждения.

Шаг 1. Создание формы авторизации с полями телефона и кода подтверждения

В CF7 создайте форму с двумя основными полями:

  • Телефон (input type="tel")
  • Поле для ввода SMS-кода (input type="text")

Пример формы CF7:

[tel* phone placeholder "Введите номер телефона"]
[text* sms_code placeholder "Введите код из SMS"]
[submit "Войти"]

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

Для отправки SMS используйте популярные сервисы, например:

  • Twilio
  • SMS.ru
  • API Мегафона, Билайна и т.д.

Реализуем отправку кода после заполнения поля телефона с помощью Ajax-хука CF7 wpcf7_before_send_mail и собственного PHP-кода.

Добавьте в functions.php или в плагин следующий код:

add_action('wpcf7_before_send_mail', 'cf7_send_sms_code', 10, 1);
function cf7_send_sms_code($contact_form) {
    $submission = WPCF7_Submission::get_instance();
    if (!$submission) return;

    $data = $submission->get_posted_data();
    if (empty($data['phone'])) return;

    $phone = preg_replace('/\D+/', '', $data['phone']);

    // Генерируем случайный код из 6 цифр
    $code = rand(100000, 999999);

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

    // Отправка SMS через API - пример для SMS.ru
    $sms_api_id = 'ВАШ_API_ID';
    $message = "Ваш код подтверждения: $code";
    $url = "https://sms.ru/sms/send?api_id=$sms_api_id&to=$phone&msg=" . urlencode($message) . "&json=1";

    $response = wp_remote_get($url);
    // Логирование или обработка ошибок можно добавить здесь
}

Шаг 3. Проверка введённого кода перед авторизацией

Добавьте кастомную валидацию поля sms_code в CF7 через хук wpcf7_validate_text*:

add_filter('wpcf7_validate_text*', 'cf7_validate_sms_code', 20, 2);
function cf7_validate_sms_code($result, $tag) {
    $name = $tag->name;
    if ($name !== 'sms_code') return $result;

    $value = isset($_POST[$name]) ? trim($_POST[$name]) : '';

    if (!session_id()) { session_start(); }

    if (empty($_SESSION['cf7_sms_code']) || $value !== (string)$_SESSION['cf7_sms_code']) {
        $result->invalidate($tag, 'Неверный код подтверждения');
    }

    return $result;
}

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

  • Заполните форму, указав корректный номер телефона в международном формате.
  • Проверьте получение SMS с кодом (можно смотреть логи API).
  • Впишите полученный код в поле sms_code и отправьте форму.
  • Если код правильный, форма успешно отправится; если нет — появится ошибка валидации.
  • Проверьте, что после успешной отправки можно создать или авторизовать пользователя, если планируется интеграция с wp_signon() или пользовательской функцией.

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

  • Код не отправляется или SMS не приходит: проверьте правильность API ключа, формат номера телефона, баланс на SMS-сервисе, используйте wp_remote_get/wp_remote_post с правильными параметрами.
  • Сессии не работают, код не сохраняется: убедитесь, что session_start() вызывается до вывода контента, или используйте альтернативное хранилище (транзиенты, опции).
  • Ошибка валидации всегда появляется: проверьте, что имя поля совпадает с тем, что в коде, и что сессия не сбрасывается между запросами.
  • Форма отправляется без проверки кода: убедитесь, что фильтр валидации подключён и правильно возвращает объект результата.

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

  • Используйте HTTPS для защиты передачи данных между клиентом и сервером.
  • Ограничьте количество попыток ввода кода, чтобы предотвратить подбор.
  • Удаляйте код из сессии после успешной проверки, чтобы избежать повторного использования.
  • Кэширование страниц с формой отключите или исключите страницы с формами, чтобы сессии работали корректно.
  • Для более надёжной интеграции используйте WP Cron или очереди задач для отправки SMS, если нагрузка высокая.

Сравнение способов отправки SMS в CF7

МетодПростотаСтоимостьНадёжностьЗависимость
API SMS.ruВысокаяСредняяХорошаяВнешний сервис
TwilioСредняяВыше среднейОтличнаяВнешний сервис
Собственный SMS-шлюзНизкаяЗависит от оборудованияЗависит от реализацииСамостоятельная поддержка

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Contact Form 7: запрет отправки пустых форм с пользовательской валидацией
20.05.2026
Contact Form 7 и Jetpack формы в WordPress: практическое руководство по интеграции и настройке
02.12.2025
Contact Form 7: универсальные хуки для расширения функциональности
11.01.2026
Contact Form 7: как автоматически очищать форму после успешной отправки
20.04.2026
Contact Form 7: как реализовать авторизацию пользователя через форму на основе PHP сессий
29.04.2026
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙