Почему важно ограничить отправку формы зарегистрированными пользователями
В ряде случаев необходимо, чтобы формы Contact Form 7 были доступны к отправке только для авторизованных пользователей. Это позволяет:
- Защитить сайт от спама и фальшивых заявок;
- Обеспечить сбор данных только от проверенных посетителей;
- Автоматически связывать отправленные данные с профилем пользователя в WordPress;
- Сократить нагрузку на обработку и модерацию заявок.
Рассмотрим, как реализовать это ограничение без сторонних плагинов, используя нативные хуки Contact Form 7 и WordPress.
Диагностика проблемы: форма доступна всем, включая гостей
По умолчанию Contact Form 7 не ограничивает отправку форм — любой посетитель может заполнить и отправить форму. В результате:
- Появляется много спам-заявок;
- Трудно анализировать данные, так как нет связи с аккаунтами пользователей;
- Невозможно персонализировать сообщения и автозаполнение полей.
Шаг 1. Проверка, что пользователь авторизован, перед отправкой формы
Contact Form 7 предоставляет хук wpcf7_validate для добавления кастомных правил валидации. Используем его, чтобы блокировать отправку формы, если пользователь не залогинен.
add_filter('wpcf7_validate', 'cf7_restrict_to_logged_in_users', 20, 2);
function cf7_restrict_to_logged_in_users($result, $tags) {
if (!is_user_logged_in()) {
$result->invalidate('', 'Ошибка: для отправки формы необходимо войти на сайт.');
}
return $result;
}Этот код добавьте в файл functions.php вашей темы или в собственный плагин.
Шаг 2. Вывод сообщения и скрытие формы для гостей
Запрет отправки формы — уже хорошо, но лучше скрывать форму и показывать предупреждение гостям.
Добавим условие в шаблон формы Contact Form 7, например, с помощью шорткода:
[dynamictext is_user_logged_in "CF7_get_logged_in"]
<script>document.addEventListener('DOMContentLoaded', function() {
if (!document.body.classList.contains('logged-in')) {
document.querySelector('.wpcf7').style.display = 'none';
var warning = document.createElement('div');
warning.innerText = 'Чтобы отправить форму, пожалуйста, войдите на сайт.';
warning.style.color = 'red';
document.querySelector('.wpcf7').parentNode.insertBefore(warning, document.querySelector('.wpcf7'));
}
});</script>Но проще и правильнее добавить PHP-код, который заменяет форму на сообщение, если пользователь не авторизован:
add_filter('the_content', 'cf7_replace_form_for_guests');
function cf7_replace_form_for_guests($content) {
if (is_page() && has_shortcode($content, 'contact-form-7')) {
if (!is_user_logged_in()) {
return '<p style="color:red;">Чтобы отправить форму, пожалуйста, войдите на сайт.</p>';
}
}
return $content;
}Шаг 3. Автоматическое заполнение полей из данных пользователя
Для удобства авторизованных пользователей можно автоматически заполнять поля формы, например, email и имя.
Contact Form 7 поддерживает фильтр wpcf7_form_hidden_fields и также можно использовать wpcf7_posted_data для динамического заполнения.
add_filter('wpcf7_form_hidden_fields', 'cf7_prefill_user_data');
function cf7_prefill_user_data($hidden_fields) {
if (is_user_logged_in()) {
$user = wp_get_current_user();
$hidden_fields['your-name'] = $user->display_name;
$hidden_fields['your-email'] = $user->user_email;
}
return $hidden_fields;
}Также можно использовать shortcode с PHP:
function cf7_get_user_email() {
if (is_user_logged_in()) {
$user = wp_get_current_user();
return $user->user_email;
}
return '';
}
add_shortcode('user_email', 'cf7_get_user_email');В форме вставьте поле:
[email* your-email default:get user_email]Проверка результата после внедрения
- Выйдите из аккаунта и попробуйте открыть страницу с формой — должна показываться замена формы на сообщение.
- Попытайтесь отправить форму как гость — должна появиться ошибка валидации.
- Авторизуйтесь и проверьте, что форма доступна и поля автозаполняются.
Частые ошибки и как их исправить
- Ошибка: Форма доступна гостям, несмотря на код.
Причина: Кэширование страниц или плагин кеша не учитывает авторизацию.
Исправление: Отключите кэширование для страниц с формами или используйте динамическое кеширование. - Ошибка: Сообщение об ошибке валидации не отображается.
Причина: Некорректное использование хукаwpcf7_validate.
Исправление: Убедитесь, что фильтр добавлен с правильным приоритетом и параметрами. - Ошибка: Автозаполнение полей не работает.
Причина: Неверно указаны имена полей в коде.
Исправление: Проверьте названия полей в форме и в фильтрах совпадают.
Практические советы по безопасности и производительности
- Используйте SSL (HTTPS) для всех форм, чтобы защитить данные пользователей при отправке.
- Отключайте кэширование страниц с формами для корректной работы ограничений по авторизации.
- Рекомендуется добавлять дополнительные меры защиты от спама (reCAPTCHA, Honeypot), даже при ограничении по авторизации.
- Для сложных решений с авторизацией и формами рассмотрите возможность интеграции с плагинами пользовательских ролей и прав доступа.
Сравнение способов ограничения отправки форм
| Способ | Плюсы | Минусы |
|---|---|---|
| Хук wpcf7_validate | Простой, не требует сторонних плагинов, надежно блокирует отправку | Форма видна гостям; требуется дополнительный код для скрытия |
| Замена формы в контенте (PHP) | Гости сразу видят сообщение, форма не отображается | Требует проверки и корректировки кэширования |
| Сторонние плагины ограничения доступа | Простота настройки, готовые решения | Дополнительная нагрузка, возможные конфликты с CF7 |