Skip to content

Всё для WordPress, веб-разработки — и не только

🐛 Contact Form 7 — устраняем проблему кеширования refill

🐛 Contact Form 7 — устраняем проблему кеширования refill

Contact Form 7 стоит на 5+ миллионах сайтов. Годами работает без сюрпризов, поставил, настроил, забыл. Но стоит включить кеширование, и в отчётах PageSpeed Insights появляется настойчивая строка: /wp-json/contact-form-7/v1/contact-forms/<id>/refill. Сайт не падает, визуально всё чисто, просто оранжевый индикатор скорости, который портит картину.

Виновник не сам плагин, а механика refill. Когда CF7 видит WP_CACHE в wp-config.php, он запускает AJAX-обновление CAPTCHA и динамических элементов, логично для кешированной страницы. Беда в том, что refill дёргает сервер глобально. Даже на страницах, где формы нет и в помине.

Фикс, точечная правка одного файла, controller.php. Три строки, пять минут, и refill-запросы уходят из отчётов. Способ работает на всех актуальных версиях Contact Form 7 (включая 6.1.6, май 2026) и WordPress от 6.0 до 7.0.

💡 Быстрый обзор:

  • Открываете файл controller.php в папке плагина
  • Находите блок с проверкой WP_CACHE, три строки
  • Комментируете их, или удаляете
  • Сохраняете файл и сбрасываете кеш на всех уровнях

Что делает refill и почему он мешает скорости

Когда в wp-config.php прописана константа define('WP_CACHE', true), Contact Form 7 воспринимает каждую страницу как закешированную. Логика разработчика прозрачна: статический HTML не обновляет CAPTCHA сам по себе, нужен AJAX-энпоинт, который подтянет свежий проверочный код. Refill, именно такой энпоинт.

Но он работает без оглядки на контекст. Запросы к /wp-json/contact-form-7/v1/contact-forms/<id>/refill уходят со всех страниц подряд, главная, блог, архив, что угодно. На слабом хостинге или проекте с приличным трафиком десятки лишних REST-вызовов на каждый просмотр ощутимо просаживают время загрузки. GTmetrix и PageSpeed Insights подсвечивают refill как ресурс, блокирующий отрисовку.

И самое коварное: визуально сайт работает. Вы просто получаете «жёлтый» балл скорости и не сразу понимаете, куда копать. Консоль браузера молчит, ошибок нет, только цифры в отчёте.

Видео: что ещё можно сделать со скриптами Contact Form 7

Короткое англоязычное видео показывает альтернативный подход, условную загрузку скриптов и стилей CF7. Приёмы из ролика отлично комбинируются с нашим фиксом (разберём дальше).

Пошаговый фикс: отключаем refill в controller.php

Шаг 1. Доберитесь до файла

Путь к файлу внутри папки плагина:

1wp-content/plugins/contact-form-7/includes/controller.php

Два способа добраться. Через панель хостинга: файловый менеджер в cPanel (File Manager) или аналог, раскройте дерево папок по пути выше. Через FTP: подключитесь клиентом вроде FileZilla и перейдите в директорию сайта.

Шаг 2. Найдите блок с WP_CACHE

Откройте controller.php в любом текстовом редакторе. Найдите три строки:

1if ( defined( 'WP_CACHE' ) && WP_CACHE ) {
2 $wpcf7['cached'] = 1;
3}

Механика проста: если WP_CACHE определена и активна, плагин выставляет флаг cached = 1. С этого флага стартует каскад refill-запросов. Согласно исходному коду Contact Form 7, в версии 6.1.6 (май 2026) блок находится на прежнем месте и не изменился, за всю историю ветки 6.x его ни разу не трогали.

Шаг 3. Закомментируйте или удалите

Безопаснее комментировать. Поставьте // в начале каждой строки:

1// if ( defined( 'WP_CACHE' ) && WP_CACHE ) {
2// $wpcf7['cached'] = 1;
3// }

Почему комментирование, а не удаление: при следующем обновлении плагина controller.php перезапишется, и правка слетит. Закомментированный блок вы узнаете сразу, открыли файл, увидели //, вспомнили. Удаление работает не хуже, но через месяц-два легко забыть, что именно вырезали. Сохраните файл.

Шаг 4. Сбросьте кеш и перепроверьте

После правки обязательно очистите кеш на всех уровнях:

  • Плагинный кеш: WP Rocket → Dashboard → Clear Cache; W3 Total Cache → Performance → Purge All Caches; LiteSpeed Cache → LiteSpeed Cache → Purge All; FlyingPress → FlyingPress → Clear Cache.
  • Серверный кеш: если хостинг держит Varnish, Nginx FastCGI или серверный LiteSpeed LSCache, кнопка сброса в панели хостинга.
  • CDN: Cloudflare или QUIC.cloud → Purge Everything.

Теперь запустите повторный тест в PageSpeed Insights или GTmetrix. Открывайте в режиме инкогнито, браузерный кеш может показать старую версию отчёта.

Ошибка с /wp-json/contact-form-7/v1/contact-forms/<id>/refill должна уйти из раздела «Eliminate render-blocking resources» или «Reduce unused JavaScript». Осталась, проверьте controller.php (возможно, правка не сохранилась) и объектный кеш (Redis/Object Cache иногда держит старую версию файла в памяти).

Ошибка refill Contact Form 7 в отчёте PageSpeed Insights

Что нужно знать после фикса

Правка не вечная. Каждое обновление Contact Form 7 перезаписывает controller.php, и три строки возвращаются. После апдейта откройте файл, убедитесь, что блок снова активен, и закомментируйте его заново. Минута работы, но легко забыть, держите чек-лист.

CAPTCHA может отвалиться. Refill изначально придуман ради CAPTCHA на кешированных страницах. Если вы используете встроенную CAPTCHA Contact Form 7 (не Google reCAPTCHA), после отключения refill проверочный код перестанет обновляться, и форма не отправится. Два выхода: переключиться на Google reCAPTCHA v3, она работает через отдельный API и не зависит от refill; либо не комментировать controller.php, а настроить условную загрузку ассетов CF7 через фильтры (об этом ниже). Проверили после правки, форма отправляется нормально? Отлично, забыли.

Альтернативный подход, фильтры wpcf7_load_js и wpcf7_load_css. Они не отключают refill, но запрещают Contact Form 7 грузить скрипты и стили на страницах без формы. Добавьте в functions.php темы:

1add_filter( 'wpcf7_load_js', '__return_false' );
2add_filter( 'wpcf7_load_css', '__return_false' );

А на странице с формой, внутри хука wp_head, верните флаги в true. Это убирает лишние ассеты отовсюду, кроме страниц с формой. Комбинируйте с отключением refill через controller.php, получите максимум производительности.

⁉️🤔 Частые вопросы

Обязательно ли править controller.php, если я не использую CAPTCHA?

Да, обязательно. Refill-запросы к /wp-json/contact-form-7/v1/contact-forms/<id>/refill отправляются при каждом AJAX-цикле независимо от настроек CAPTCHA. Визуально вы их не замечаете, но GTmetrix и Query Monitor фиксируют лишние вызовы REST API. После комментирования трёх строк энпоинт перестаёт отвечать, и скорость растёт.

Почему бы просто не отключить WP_CACHE в wp-config.php?

Константа WP_CACHE, сигнал для всей экосистемы WordPress, что страницы можно кешировать. WP Rocket, W3 Total Cache, FlyingPress и другие плагины завязаны на неё. Убрав WP_CACHE, вы разрушите кеширование целиком, просадка скорости будет куда ощутимее одного refill-запроса. Правильный путь: оставить кеширование, но вырезать его побочный эффект в CF7.

Фикс сработает на мультисайте?

Сработает, но wp-content/plugins/contact-form-7/includes/controller.php общий для всей сети. Правка затронет все дочерние сайты одновременно. Перед изменением проверьте, есть ли на других сайтах сети формы с встроенной CAPTCHA Contact Form 7. Если да, протестируйте отправку на каждом после правки или рассмотрите фильтр-исключение вместо глобальной правки.

Можно ли автоматизировать возврат правки после обновления плагина?

В документации Contact Form 7 готового фильтра для подмены именно этих трёх строк нет. На практике чек-лист «после обновления CF7 → проверить controller.php» надёжнее любого самописного mu-плагина. Файл меняется редко, за всю 6.x-ветку блок WP_CACHE ни разу не редактировался.

Форма перестала отправляться после правки, что делать?

Сначала проверьте тип CAPTCHA: Contact Form 7 → Integration. Встроенная CAPTCHA плагина (не reCAPTCHA) зависит от refill для смены проверочного кода. Переключитесь на Google reCAPTCHA v3, она работает через собственный API и к refill не привязана. Второй путь: откатите правку controller.php, оставьте refill включённым и настройте условную загрузку ассетов CF7 только на страницах с формами через wpcf7_load_js и wpcf7_load_css.

Contact Form 7 и кеширование: что делать в 2026 году

Правка controller.php, микрохирургия, которая убирает единственный узкий bottleneck плагина. Минута времени, никаких дополнительных плагинов, работает на WordPress от 6.0 до 7.0 и всех актуальных сборках Contact Form 7.

Хотите выжать максимум, комбинируйте: отключите refill через controller.php и настройте условную загрузку ассетов через фильтры wpcf7_load_js и wpcf7_load_css. Первый убирает refill-запросы, второй не даёт скриптам формы висеть на страницах без формы. Вместе они выводят Contact Form 7 из отчётов PageSpeed Insights как источник проблем, полностью.

🔗 Contact Form 7 на WordPress.org