Диагностика задачи: зачем нужна авторизация через телефон в 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-шлюз | Низкая | Зависит от оборудования | Зависит от реализации | Самостоятельная поддержка |