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