Ситуация типичная: форма Contact Form 7 на странице есть, поля работают, но капча не отображается или после отправки форма зависает на проверке. Чаще всего проблема не в самом плагине, а в конфликте скриптов, неверной интеграции reCAPTCHA/hCaptcha или в том, что тема/кеш-оптимизация ломает загрузку внешних ресурсов.
Как выглядит проблема на практике
Обычно пользователь видит один из сценариев:
- капча вообще не рендерится на странице;
- в консоли браузера есть ошибки загрузки
api.jsилиhcaptcha.com; - форма отправляется только после отключения минификации JS;
- после клика по кнопке отправки появляется бесконечный спиннер, но письмо не уходит;
- в админке Contact Form 7 настройки защиты заполнены, но на фронтенде виджет пустой.
Если форма работает в режиме без капчи, а с защитой ломается, значит нужно проверять не только сам плагин, но и весь путь загрузки скриптов: тему, кеш, CDN, оптимизатор, CSP-заголовки и блокировщики рекламы в браузере.
Диагностика: что проверить первым делом
1. Откройте консоль и сеть браузера
На странице с формой откройте DevTools и посмотрите вкладки Console и Network. Ищите:
- ошибки
Refused to load the script; - 404/403 на
api.jsили ресурсах hCaptcha; - ошибки JavaScript после загрузки темы или плагина оптимизации;
- блокировку по
Content-Security-Policy.
Если скрипт капчи не загружается, Contact Form 7 не сможет завершить проверку формы, даже если разметка виджета на странице есть.
2. Временно отключите оптимизацию JS
Если используется плагин кеша или ускорения, на время теста отключите:
- отложенную загрузку JavaScript;
- объединение скриптов;
- defer/delay для внешних доменов;
- оптимизацию inline-скриптов.
Это самый быстрый способ понять, ломает ли фронтенд именно оптимизатор, а не Contact Form 7.
3. Проверьте, не режет ли капчу CSP
Если на сайте включены строгие заголовки безопасности, в script-src и frame-src должны быть разрешены домены провайдера капчи. Иначе виджет не загрузится, а в консоли будет ошибка политики безопасности.
Пошаговое решение
Шаг 1. Сначала убедитесь, что выбран один способ защиты
Не стоит одновременно включать несколько антиспам-механизмов, если вы не понимаете их взаимодействие. Для одной формы обычно достаточно одного варианта: reCAPTCHA, hCaptcha или дополнительной серверной проверки через хук. Когда защит много, они начинают мешать друг другу: один скрипт блокирует другой, а форма получает некорректный статус отправки.
Если вы уже используете плагин антиспама, проверьте, не добавляет ли он свою капчу поверх Contact Form 7. В этом случае лучше оставить один механизм и убрать дублирующий.
Шаг 2. Исключите скрипты капчи из агрессивной оптимизации
В плагинах кеша и оптимизации обычно есть список исключений. Для проверки добавьте внешние домены капчи в исключения от defer/delay/combining. Для reCAPTCHA это обычно домены Google, для hCaptcha — домены hCaptcha.
Если у вас есть доступ к настройкам оптимизатора, логика простая: внешние скрипты, которые отвечают за валидацию формы, не должны откладываться до взаимодействия пользователя, иначе Contact Form 7 может отправить запрос раньше, чем капча инициализируется.
Шаг 3. Проверьте, не ломает ли тема вывод шорткода формы
Иногда проблема не в капче, а в том, что тема оборачивает форму в нестандартный контейнер, скрывает блоки через CSS или подменяет порядок загрузки скриптов. Для проверки переключитесь на стандартную тему и откройте ту же страницу. Если капча появилась, значит искать нужно в теме или её функциях.
Особенно часто это проявляется в шаблонах, где есть собственные скрипты для модальных окон, lazy-load или анимаций появления блоков.
Шаг 4. Если нужна серверная проверка, добавьте свой антиспам-хук
Когда внешняя капча конфликтует с оптимизацией или политиками безопасности, иногда проще добавить дополнительную проверку на стороне сервера. Например, можно проверять скрытое поле-ловушку и отклонять форму до отправки письма.
<?php
add_filter( 'wpcf7_validate_text', 'cf7_honeypot_validation', 20, 2 );
add_filter( 'wpcf7_validate_text*', 'cf7_honeypot_validation', 20, 2 );
function cf7_honeypot_validation( $result, $tag ) {
$name = $tag->name;
if ( 'your-honeypot' !== $name ) {
return $result;
}
$value = isset( $_POST[ $name ] ) ? trim( wp_unslash( $_POST[ $name ] ) ) : '';
if ( '' !== $value ) {
$result->invalidate( $tag, 'Проверка не пройдена.' );
}
return $result;
}
Это не заменяет полноценную капчу во всех случаях, но помогает, если внешний сервис нестабилен или блокируется на части устройств.
Шаг 5. Очистите кеш и проверьте страницу в приватном окне
После изменений обязательно очистите:
- кеш плагина;
- серверный кеш, если он есть;
- CDN-кеш;
- кеш браузера.
Затем откройте форму в приватном окне без расширений. Это важно: блокировщики рекламы и анти-трекинг расширения часто режут капчу, и в обычном окне вы можете видеть ложную картину.
Сравнение подходов: капча, антиспам-плагин или код
| Подход | Когда подходит | Минус |
|---|---|---|
| reCAPTCHA / hCaptcha | Нужна стандартная защита без доработок | Зависит от внешнего скрипта и настроек оптимизации |
| Антиспам-плагин | Нужно быстро закрыть спам без кода | Может конфликтовать с кэшем и темой |
| Свой хук в PHP | Нужен контроль и предсказуемость | Требует поддержки и аккуратной валидации |
Как проверить, что решение сработало
После правок не ограничивайтесь визуальной проверкой. Пройдите по чек-листу:
- капча отображается на странице без ошибок в консоли;
- форма отправляется с первого раза;
- в Network нет 4xx/5xx на скриптах капчи;
- в письме приходит корректное содержимое формы;
- в приватном окне и в обычном окне поведение одинаковое;
- после включения кеша форма не ломается снова.
Если капча видна, но отправка всё равно блокируется, проверьте, не подменяет ли тема событие submit или не перехватывает ли его сторонний скрипт аналитики.
Частые ошибки и как их исправить
Капча добавлена, но ключи не совпадают
Убедитесь, что site key и secret key относятся к одному проекту и одному типу капчи. Ошибка в ключах часто выглядит как пустой блок или отказ валидации без понятного сообщения.
Скрипт капчи отложен через оптимизатор
Если включён delay JS, добавьте домены капчи в исключения. В противном случае виджет инициализируется слишком поздно, а форма уже пытается отправиться.
Капча блокируется CSP
Проверьте заголовки Content-Security-Policy. Для внешних виджетов нужно разрешить соответствующие источники в script-src, frame-src и иногда connect-src.
Форма находится в модальном окне или вкладке-аккордеоне
Если блок с формой скрыт при загрузке страницы, некоторые виджеты инициализируются некорректно. В таких случаях капчу лучше перерисовывать после открытия модального окна или отказаться от рендеринга в скрытом контейнере.
Безопасность и производительность: что не стоит делать
Не отключайте проверку формы полностью ради того, чтобы «лишь бы отправлялось». Это быстро приводит к спаму и мусорным заявкам. Но и перегружать страницу несколькими антиспам-решениями тоже не стоит: каждый дополнительный внешний скрипт увеличивает риск конфликтов и ухудшает загрузку.
Если на сайте важна стабильность, практичный вариант — минимизировать внешние зависимости, оставить один механизм защиты и проверить его в связке с кешем, CDN и мобильными браузерами. Для чистки лишних дублей, служебных скриптов и SEO-мусора иногда помогает аккуратная настройка через Clearfy Pro, но только если вы понимаете, какие опции отключаете и как это влияет на форму и фронтенд.
Если после всех проверок капча всё равно нестабильна, не пытайтесь лечить это случайными правками в шаблоне. Сначала зафиксируйте, на каком этапе ломается цепочка: загрузка скрипта, инициализация виджета, submit или серверная валидация. Это экономит время и не создаёт новых ошибок в админке и на фронтенде.