
🐛 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. Доберіться до файлу
Шлях до файлу всередині папки плагіна:
1 wp-content/plugins/contact-form-7/includes/controller.php
Два способи дістатися. Через панель хостингу: файловий менеджер у cPanel (File Manager) або аналог, розкрийте дерево папок за шляхом вище. Через FTP: підключіться клієнтом на кшталт FileZilla і перейдіть у директорію сайту.
Крок 2. Знайдіть блок із WP_CACHE
Відкрийте controller.php у будь-якому текстовому редакторі. Знайдіть три рядки:
1 if ( 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 іноді тримає стару версію файлу в пам’яті).

Що потрібно знати після фіксу
Правка не вічна. Кожне оновлення 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 теми:
1 add_filter( 'wpcf7_load_js', '__return_false' ); 2 add_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 як джерело проблем, повністю.



