Contact Form 7 — один из самых популярных плагинов для создания форм на WordPress, но по умолчанию он не поддерживает функционал авторизации пользователей. В этой статье подробно разберем, как можно реализовать авторизацию пользователя через форму Contact Form 7 с помощью кастомного PHP-кода и дополнительных хуков. Это позволит вам создавать на сайте формы входа, не используя сторонние плагины авторизации и сохраняя гибкость Contact Form 7.
Почему нужна авторизация через Contact Form 7
Стандартные формы входа WordPress удобны, но не всегда вписываются в дизайн или логику сайта. Иногда требуется интегрировать авторизацию прямо в существующие Contact Form 7 формы, например, чтобы объединить вход и регистрацию в одном интерфейсе или добавить дополнительные поля и логику.
Кроме того, Contact Form 7 легко расширять через хуки и фильтры, что дает возможность полностью кастомизировать процесс авторизации под ваши задачи.
Рассмотрим реализацию, которая позволит отправлять данные формы на сервер, проверять пользователя по логину и паролю и выполнять вход без перезагрузки страницы.
Создаем форму входа в Contact Form 7
Для начала создадим простую форму входа с полями для логина и пароля. В админке WordPress перейдите в Contact Form 7 и добавьте новую форму с таким кодом:
[text* your-login placeholder "Логин"]
[password* your-password placeholder "Пароль"]
[submit "Войти"]
Обратите внимание, что поля обязательны для заполнения — это важно для базовой валидации на клиенте.
Далее нам нужно добавить обработчик, который будет перехватывать отправку формы и выполнять авторизацию.
Обработка авторизации через хук Contact Form 7
Contact Form 7 предоставляет множество хуков. Для реализации авторизации используем событие wpcf7_before_send_mail, которое срабатывает перед отправкой письма. Мы отменим отправку письма, если авторизация успешна, и выполним вход пользователя.
Пример кода для functions.php вашей темы или плагина
add_action('wpcf7_before_send_mail', 'contactform7_handle_login_auth', 10, 1);
function contactform7_handle_login_auth($contact_form) {
$submission = WPCF7_Submission::get_instance();
if (!$submission) {
return;
}
$data = $submission->get_posted_data();
// Проверяем, что это именно наша форма, по ID или имени
$target_form_id = 123; // замените на ID вашей формы
if ($contact_form->id() != $target_form_id) {
return;
}
$login = isset($data['your-login']) ? sanitize_text_field($data['your-login']) : '';
$password = isset($data['your-password']) ? $data['your-password'] : '';
if (empty($login) || empty($password)) {
// Можно добавить ошибку
$contact_form->skip_mail = true;
$submission->set_response(array(
'status' => 'validation_failed',
'message' => 'Пожалуйста, заполните логин и пароль.'
));
return;
}
$user = wp_authenticate($login, $password);
if (is_wp_error($user)) {
// Ошибка авторизации
$contact_form->skip_mail = true;
$submission->set_response(array(
'status' => 'validation_failed',
'message' => 'Неверный логин или пароль.'
));
return;
}
// Авторизация успешна, выполняем вход
wp_set_current_user($user->ID);
wp_set_auth_cookie($user->ID);
// Отмена отправки письма
$contact_form->skip_mail = true;
// Отправляем пользователю сообщение об успешном входе
$submission->set_response(array(
'status' => 'mail_sent',
'message' => 'Вы успешно вошли на сайт!'
));
// Можно добавить редирект после входа
add_action('wp_footer', function() {
if (is_user_logged_in()) {
echo "<script>window.location.href = '/lichnyj-kabinet';</script>";
}
});
}
В этом коде мы получаем данные формы, пытаемся аутентифицировать пользователя через стандартную функцию wp_authenticate. Если все прошло успешно, выполняем вход через wp_set_auth_cookie и отменяем отправку письма Contact Form 7.
Вы можете заменить $target_form_id на ID вашей формы, чтобы код срабатывал только для конкретной формы входа.
AJAX-отправка формы и реакция на ошибки
Contact Form 7 по умолчанию использует AJAX для отправки форм. В случае ошибок или успешного входа пользователь увидит соответствующие сообщения без перезагрузки страницы. Это очень удобно для UX.
Если хотите кастомизировать поведение после успешного входа, например, сделать редирект, можно добавить JavaScript обработчик события wpcf7mailsent:
document.addEventListener('wpcf7mailsent', function(event) {
if (event.detail.contactFormId == 123) { // замените на ID вашей формы
window.location.href = '/lichnyj-kabinet'; // адрес личного кабинета
}
}, false);
Так вы сможете сделать более плавный переход после авторизации.
Расширение: добавляем капчу и защиту от перебора
Для безопасности не забудьте подключить Google reCAPTCHA, который поддерживается Contact Form 7 из коробки. Это поможет защитить форму от ботов.
Также можно добавить ограничение количества попыток авторизации с помощью сторонних плагинов или собственного кода, чтобы предотвратить подбор паролей.
Дополнительные советы и полезные плагины
Для расширения функционала авторизации через Contact Form 7 можно использовать следующие плагины:
- Contact Form 7 – Dynamic Text Extension — позволяет динамически подставлять значения в поля формы.
- Clearfy Pro — для оптимизации безопасности и улучшения работы сайта.
Кроме того, если нужна регистрация через форму, можно расширить код, добавив создание пользователя через wp_create_user и отправку письма с подтверждением.