Сценарий знакомый: форма вроде бы работает, письма приходят, но в CRM или почте оказываются пустые заявки, набор случайных символов или сообщения без обязательных полей. В Contact Form 7 это обычно не «поломка отправки», а отсутствие нормальной валидации на стороне формы, слабая защита от ботов или конфликт с кастомным кодом, который подменяет значения полей.
Ниже — практический разбор: как понять, откуда берутся пустые отправки, что можно исправить настройками CF7, а что лучше закрыть кодом или отдельным антиспам-слоем.
Как выглядит проблема и где искать причину
Пустые заявки обычно появляются в одном из трёх случаев: бот отправляет форму без заполнения, пользователь отправляет форму с отключённым JavaScript и часть логики валидации не срабатывает, либо в шаблоне формы есть поля, которые визуально обязательные, но фактически не помечены как обязательные для CF7.
Сначала проверьте саму форму в админке Contact Form 7. Важно не то, как поле выглядит на странице, а как оно описано в разметке формы. Например, поле с * в теге CF7 считается обязательным, а обычный text — нет.
[text* your-name placeholder "Ваше имя" ]
[email* your-email placeholder "Email"]
[tel your-phone placeholder "Телефон"]
[textarea your-message placeholder "Сообщение"]
[submit "Отправить"]Если у вас в письмах приходят пустые поля, но форма визуально не ругается, значит обязательность не задана на уровне CF7 или её переопределяет кастомный код.
Быстрая диагностика перед правками
- Откройте форму в браузере и отправьте её с пустыми обязательными полями.
- Проверьте, появляются ли сообщения валидации прямо под полями.
- Посмотрите, не вставлен ли в тему или плагин фильтр, который меняет поведение CF7.
- Проверьте, не используется ли один и тот же
nameу нескольких полей. - Сравните содержимое письма с тем, что реально ввёл пользователь: иногда проблема не в отправке, а в шаблоне письма.
Пошаговое решение: закрываем пустые отправки на уровне формы
Самый надёжный шаг — сделать обязательными все поля, без которых заявка бесполезна. Для Contact Form 7 это означает использование обязательных тегов с *.
[text* your-name]
[email* your-email]
[tel* your-phone]
[textarea* your-message]
[submit "Отправить"]Если поле не должно быть обязательным всегда, но вы хотите отсечь совсем пустые отправки, добавьте серверную проверку через фильтр wpcf7_validate. Это полезно, когда форма сложная или часть полей заполняется условно.
add_filter('wpcf7_validate_text*', 'cf7_require_nonempty_text', 20, 2);
add_filter('wpcf7_validate_email*', 'cf7_require_nonempty_text', 20, 2);
add_filter('wpcf7_validate_textarea*', 'cf7_require_nonempty_text', 20, 2);
function cf7_require_nonempty_text($result, $tag) {
$name = $tag->name;
$value = isset($_POST[$name]) ? trim((string) wp_unslash($_POST[$name])) : '';
if ($value === '') {
$result->invalidate($tag, 'Это поле обязательно для заполнения.');
}
return $result;
}Этот пример не заменяет стандартную валидацию CF7, а дополняет её. Он полезен, если у вас есть кастомные поля или нестандартная логика, и вы хотите жёстко отсеивать пустые значения на сервере.
Добавляем honeypot: простой барьер против ботов
Если пустые заявки идут массово, почти всегда это боты. Самый дешёвый способ отсечь часть мусора — honeypot, то есть скрытое поле, которое человек не заполняет, а бот часто заполняет автоматически.
В CF7 можно добавить скрытое поле вручную, но надёжнее использовать отдельный honeypot-плагин, совместимый с Contact Form 7. Если хотите обойтись без лишнего плагина, можно сделать простую проверку через дополнительное поле и фильтр.
[text cf7_hp class:cf7-hp tabindex:-1 autocomplete:off]add_filter('wpcf7_validate_text', 'cf7_honeypot_check', 20, 2);
function cf7_honeypot_check($result, $tag) {
if ($tag->name !== 'cf7_hp') {
return $result;
}
$value = isset($_POST['cf7_hp']) ? trim((string) wp_unslash($_POST['cf7_hp'])) : '';
if ($value !== '') {
$result->invalidate($tag, 'Ошибка проверки формы.');
}
return $result;
}Скрывать поле нужно не только визуально, но и так, чтобы оно не мешало доступности. Например, через CSS:
.cf7-hp {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
overflow: hidden;
}Сравнение подходов: что выбрать для защиты формы
| Подход | Когда подходит | Минус |
|---|---|---|
| Обязательные поля CF7 | Если проблема в забытых или неотмеченных полях | Не спасает от ботов |
Серверная валидация через wpcf7_validate | Если нужна жёсткая проверка на стороне WordPress | Требует кода и тестирования |
| Honeypot | Если идут автоматические пустые отправки | Не блокирует более умных ботов |
| Отдельный антиспам-плагин | Если поток мусора высокий и нужна быстрая защита | Дополнительная зависимость и возможные ложные срабатывания |
Проверка результата после внедрения
После правок не ограничивайтесь одной тестовой отправкой. Проверьте форму в нескольких сценариях: пустая отправка, частично заполненная форма, корректная отправка и отправка с подозрительным значением в honeypot-поле.
- Попробуйте отправить форму без имени и email, если они обязательны.
- Проверьте, что сообщение валидации показывается рядом с нужным полем.
- Убедитесь, что в письме не появляются пустые строки вместо значений.
- Посмотрите логи почтового плагина, если используете SMTP или журнал отправки.
- Проверьте мобильную версию: иногда скрытые поля ломают вёрстку на узких экранах.
Если у вас есть доступ к серверным логам или журналу запросов, полезно посмотреть, не идут ли повторяющиеся POST-запросы с одинаковыми параметрами. Это хороший признак бота, а не реального пользователя.
Частые ошибки и как их исправить
Поле выглядит обязательным, но не валидируется
Обычно причина в том, что в шаблоне формы нет * у тега CF7 или поле добавлено как обычный HTML-инпут вне механизма CF7. В таком случае форма может выглядеть правильно, но сервер не считает поле обязательным.
Пустые заявки идут только с одной страницы
Проверьте, не подключён ли на этой странице кастомный JavaScript, который меняет значения полей перед отправкой. Иногда конфликтует маска телефона, скрипт автозаполнения или сторонний конструктор блоков.
Honeypot начал блокировать живых пользователей
Такое бывает, если поле не скрыто корректно или его случайно заполняет автозаполнение браузера. Решение простое: задайте autocomplete="off", уберите поле из tab-цепочки и проверьте CSS на всех брейкпоинтах.
Проверка на сервере ломает отправку формы
Частая причина — фильтр написан слишком широко и применяется ко всем полям без учёта их типа. В примере выше логика разделена по типам тегов, чтобы не вмешиваться в поведение лишний раз.
Безопасность и производительность: что не стоит делать
Не пытайтесь решать проблему пустых заявок только фронтендом. Скрыть кнопку или поставить проверку на JavaScript недостаточно: бот может отправить запрос напрямую. Нужна серверная проверка, а фронтенд — только как дополнительный слой.
Если вы добавляете несколько антиспам-слоёв сразу, не перегружайте форму тяжёлыми скриптами. Для обычного сайта часто хватает обязательных полей, honeypot и базовой серверной валидации. Лишние внешние сервисы и виджеты лучше подключать только если реально видите поток мусора.
Если задача шире и вам нужно одновременно чистить сайт от дублей, закрывать технические хвосты и наводить порядок в SEO-настройках, уместно посмотреть в сторону инструментов вроде Clearfy Pro: https://wpshop.ru/plugins/clearfy?utm_source=contactform7.ru&utm_medium=article&utm_campaign=contact-form-7-otpravlyaet-pustye-zayavki-kak-otsech-pustye-polya-i-spam-boty. Но для самой формы это не замена валидации и антиспама, а лишь соседний инструмент для общей технички.
Если после всех правок пустые заявки продолжаются, проверьте не только Contact Form 7, но и цепочку вокруг него: кэширование страницы, сторонние скрипты, плагины масок, переводов и оптимизации. В таких задачах проблема часто не в одном плагине, а в их сочетании.