Skip to content

Alles für WordPress, Webentwicklung — und mehr

🐛 Contact Form 7 - das Refill-Caching-Problem beheben

🐛 Contact Form 7 - das Refill-Caching-Problem beheben

Contact Form 7 läuft auf über 5 Millionen Websites. Es arbeitet jahrelang ohne Überraschungen: installieren, konfigurieren, vergessen. Doch sobald Sie Caching aktivieren, zeigen die Berichte von PageSpeed Insights eine hartnäckige Zeile: /wp-json/contact-form-7/v1/contact-forms/<id>/refill. Die Seite stürzt nicht ab, visuell sieht alles sauber aus, nur ein orangefarbener Geschwindigkeitsindikator, der das Bild trübt.

Der Übeltäter ist nicht das Plugin selbst, sondern der Refill-Mechanismus. Wenn CF7 in der wp-config.php die Konstante WP_CACHE erkennt, löst es AJAX-Updates für CAPTCHA und dynamische Elemente aus, was für gecachte Seiten sinnvoll ist. Das Problem: Refill feuert global an den Server. Auch auf Seiten, auf denen sich überhaupt kein Formular befindet.

Die Lösung ist ein chirurgischer Eingriff in eine einzige Datei, controller.php. Drei Zeilen, fünf Minuten, und die Refill-Requests verschwinden aus den Berichten. Die Methode funktioniert mit allen aktuellen Contact-Form-7-Versionen (einschließlich 6.1.6, Mai 2026) und WordPress von 6.0 bis 7.0.

💡 Kurzüberblick:

  • Öffnen Sie die Datei controller.php im Plugin-Ordner
  • Suchen Sie den Block mit der WP_CACHE-Prüfung, drei Zeilen
  • Kommentieren Sie diese aus oder löschen Sie sie
  • Speichern Sie die Datei und leeren Sie den Cache auf allen Ebenen

Was Refill macht und warum es der Geschwindigkeit schadet

Wenn die Konstante define('WP_CACHE', true) in der wp-config.php gesetzt ist, behandelt Contact Form 7 jede Seite als gecacht. Die Logik des Entwicklers ist nachvollziehbar: Statisches HTML aktualisiert CAPTCHA nicht von selbst, man benötigt einen AJAX-Endpunkt, der einen frischen Verifizierungscode abruft. Refill ist genau dieser Endpunkt.

Allerdings arbeitet es ohne Rücksicht auf den Kontext. Requests an /wp-json/contact-form-7/v1/contact-forms/<id>/refill gehen von allen Seiten der Reihe nach aus: Startseite, Blog, Archiv, alles. Auf schwachem Hosting oder einem Projekt mit nennenswertem Traffic verlangsamen dutzende unnötige REST-Aufrufe pro Seitenaufruf die Ladezeit spürbar. GTmetrix und PageSpeed Insights heben Refill als ressourcenblockierend für das Rendering hervor.

Und das Tückischste daran: Visuell funktioniert die Seite. Ihr Geschwindigkeitswert wird lediglich „gelb", und Sie verstehen nicht sofort, wo Sie graben müssen. Die Browser-Konsole schweigt, keine Fehler, nur Zahlen im Bericht.

Video: Was Sie sonst noch mit Contact-Form-7-Skripten tun können

Dieses kurze englischsprachige Video zeigt einen alternativen Ansatz, das bedingte Laden von CF7-Skripten und -Styles. Die Techniken aus dem Video lassen sich perfekt mit unserer Lösung kombinieren (wir gehen weiter unten darauf ein).

Schritt-für-Schritt-Lösung: Refill in controller.php deaktivieren

Schritt 1. Zur Datei navigieren

Pfad zur Datei innerhalb des Plugin-Ordners:

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

Zwei Wege führen dorthin. Über das Hosting-Panel: Dateimanager in cPanel (File Manager) oder Äquivalent, navigieren Sie den Ordnerbaum entlang des obigen Pfades. Via FTP: Verbinden Sie sich mit einem Client wie FileZilla und navigieren Sie zum Website-Verzeichnis.

Schritt 2. Den WP_CACHE-Block finden

Öffnen Sie controller.php in einem beliebigen Texteditor. Suchen Sie drei Zeilen:

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

Die Mechanik ist einfach: Wenn WP_CACHE definiert und aktiv ist, setzt das Plugin das Flag cached = 1. Dieses Flag löst eine Kaskade von Refill-Requests aus. Laut Contact-Form-7-Quellcode befindet sich der Block in Version 6.1.6 (Mai 2026) an derselben Stelle und hat sich nicht verändert, im gesamten Verlauf des 6.x-Zweigs wurde er kein einziges Mal angefasst.

Schritt 3. Auskommentieren oder löschen

Auskommentieren ist sicherer. Setzen Sie // an den Anfang jeder Zeile:

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

Warum auskommentieren statt löschen: Beim nächsten Plugin-Update wird controller.php überschrieben und die Änderung geht verloren. Den auskommentierten Block erkennen Sie sofort: Datei geöffnet, // gesehen, erinnert. Löschen funktioniert genauso gut, aber nach ein oder zwei Monaten vergisst man leicht, was genau man entfernt hat. Speichern Sie die Datei.

Schritt 4. Cache leeren und erneut prüfen

Leeren Sie nach der Bearbeitung unbedingt den Cache auf allen Ebenen:

  • Plugin-Cache: WP Rocket → Dashboard → Cache leeren; W3 Total Cache → Performance → Alle Caches leeren; LiteSpeed Cache → LiteSpeed Cache → Alle leeren; FlyingPress → FlyingPress → Cache leeren.
  • Server-Cache: Wenn der Hoster Varnish, Nginx FastCGI oder serverseitiges LiteSpeed LSCache einsetzt, gibt es eine Schaltfläche zum Leeren im Hosting-Panel.
  • CDN: Cloudflare oder QUIC.cloud → Alles leeren.

Führen Sie nun einen Wiederholungstest in PageSpeed Insights oder GTmetrix durch. Öffnen Sie ihn im Inkognito-Modus, der Browser-Cache könnte die alte Version des Berichts anzeigen.

Der Fehler mit /wp-json/contact-form-7/v1/contact-forms/<id>/refill sollte aus dem Abschnitt „Render-blockierende Ressourcen eliminieren" oder „Ungenutztes JavaScript reduzieren" verschwinden. Immer noch da? Überprüfen Sie controller.php (die Änderung wurde möglicherweise nicht gespeichert) und den Objekt-Cache (Redis/Object Cache behält manchmal die alte Dateiversion im Speicher).

Contact Form 7-Refill-Fehler im PageSpeed Insights-Bericht

Was Sie nach der Lösung wissen müssen

Die Änderung ist nicht dauerhaft. Jedes Contact-Form-7-Update überschreibt controller.php, und die drei Zeilen kehren zurück. Öffnen Sie nach einem Update die Datei, vergewissern Sie sich, dass der Block wieder aktiv ist, und kommentieren Sie ihn erneut aus. Eine Minute Arbeit, aber leicht zu vergessen, führen Sie eine Checkliste.

CAPTCHA könnte kaputtgehen. Refill war ursprünglich für CAPTCHA auf gecachten Seiten konzipiert. Wenn Sie das integrierte CAPTCHA von Contact Form 7 verwenden (nicht Google reCAPTCHA), wird der Verifizierungscode nach der Deaktivierung von Refill nicht mehr aktualisiert und das Formular lässt sich nicht absenden. Zwei Lösungen: Wechseln Sie zu Google reCAPTCHA v3, es arbeitet über eine separate API und ist nicht von Refill abhängig; oder kommentieren Sie controller.php nicht aus, sondern richten Sie das bedingte Laden von CF7-Assets über Filter ein (mehr dazu weiter unten). Nach der Änderung getestet, Formular wird normal gesendet? Hervorragend, dann vergessen Sie es.

Alternativer Ansatz, Filter wpcf7_load_js und wpcf7_load_css. Sie deaktivieren Refill nicht, verhindern aber, dass Contact Form 7 Skripte und Styles auf Seiten ohne Formular lädt. Fügen Sie dies in die functions.php des Themes ein:

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

Und auf der Seite mit dem Formular, innerhalb des wp_head-Hooks, setzen Sie die Flags wieder auf true. Das entfernt unnötige Assets von allen Seiten außer denen mit Formularen. Kombinieren Sie dies mit der Deaktivierung von Refill über controller.php, um maximale Performance zu erzielen.

⁉️🤔 Häufig gestellte Fragen

Ist es zwingend erforderlich, controller.php zu bearbeiten, wenn ich kein CAPTCHA verwende?

Ja, zwingend. Refill-Requests an /wp-json/contact-form-7/v1/contact-forms/<id>/refill werden bei jedem AJAX-Zyklus gesendet, unabhängig von den CAPTCHA-Einstellungen. Visuell bemerkt man sie nicht, aber GTmetrix und Query Monitor zeichnen unnötige REST-API-Aufrufe auf. Nach dem Auskommentieren der drei Zeilen reagiert der Endpunkt nicht mehr und die Geschwindigkeit steigt.

Warum nicht einfach WP_CACHE in der wp-config.php deaktivieren?

Die Konstante WP_CACHE ist ein Signal für das gesamte WordPress-Ökosystem, dass Seiten gecacht werden können. WP Rocket, W3 Total Cache, FlyingPress und andere Plugins sind darauf angewiesen. Wenn Sie WP_CACHE entfernen, zerstören Sie das Caching vollständig, der Geschwindigkeitsverlust wäre weitaus spürbarer als ein einzelner Refill-Request. Der richtige Weg: Caching beibehalten, aber seinen Nebeneffekt in CF7 kappen.

Funktioniert die Lösung mit Multisite?

Sie funktioniert, aber wp-content/plugins/contact-form-7/includes/controller.php wird netzwerkweit gemeinsam genutzt. Die Änderung betrifft alle Kind-Websites gleichzeitig. Prüfen Sie vor der Änderung, ob andere Websites im Netzwerk Formulare mit dem integrierten CAPTCHA von Contact Form 7 haben. Wenn ja, testen Sie das Absenden auf jeder einzelnen nach der Änderung oder erwägen Sie eine Filter-Ausnahme anstelle einer globalen Bearbeitung.

Kann man das Wiederherstellen der Änderung nach einem Plugin-Update automatisieren?

Die Contact-Form-7-Dokumentation bietet keinen fertigen Filter, um genau diese drei Zeilen zu ersetzen. In der Praxis ist eine Checkliste „nach CF7-Update → controller.php prüfen" zuverlässiger als jedes maßgeschneiderte mu-Plugin. Die Datei ändert sich selten, im gesamten 6.x-Zweig wurde der WP_CACHE-Block kein einziges Mal bearbeitet.

Das Formular lässt sich nach der Änderung nicht mehr absenden, was tun?

Prüfen Sie zuerst den CAPTCHA-Typ: Contact Form 7 → Integration. Das integrierte CAPTCHA des Plugins (nicht reCAPTCHA) ist auf Refill angewiesen, um den Verifizierungscode zu wechseln. Wechseln Sie zu Google reCAPTCHA v3, es arbeitet über eine eigene API und ist nicht an Refill gebunden. Zweite Option: Machen Sie die Änderung in controller.php rückgängig, lassen Sie Refill aktiviert und richten Sie das bedingte Laden von CF7-Assets nur auf Seiten mit Formularen über wpcf7_load_js und wpcf7_load_css ein.

Contact Form 7 und Caching: Was 2026 zu tun ist

Die Bearbeitung von controller.php ist ein mikrochirurgischer Eingriff, der den einzigen engen Flaschenhals des Plugins beseitigt. Eine Minute Zeit, keine zusätzlichen Plugins, funktioniert mit WordPress von 6.0 bis 7.0 und allen aktuellen Contact-Form-7-Builds.

Möchten Sie das Maximum herausholen? Kombinieren Sie: Deaktivieren Sie Refill über controller.php und richten Sie das bedingte Laden von Assets über die Filter wpcf7_load_js und wpcf7_load_css ein. Ersteres entfernt die Refill-Requests, Letzteres verhindert, dass Formularskripte auf Seiten ohne Formulare hängen. Zusammen nehmen sie Contact Form 7 vollständig als Problemquelle aus den PageSpeed-Insights-Berichten.

🔗 Contact Form 7 auf WordPress.org