Währungsumschalter funktioniert nicht mit Cache-Plugin in WordPress: Lösungen
Ein Währungsumschalter, der in WordPress nicht mit einem Cache-Plugin funktioniert, zeigt meist eines von vier Symptomen: Die Preise bleiben nach dem Umschalten in der Basiswährung, die Währung springt auf der nächsten Seite auf den Standard zurück, ein Klick auf den Umschalter bewirkt nichts, oder alles funktioniert, solange Sie angemeldet sind, und versagt für Besucher. Dafür gibt es zwei verschiedene Ursachen. Ein Seitencache liefert gespeichertes HTML aus, das für einen anderen Besucher aufgebaut wurde, und die JavaScript-Optimierung (Verzögern, Aufschieben, Minimieren, Zusammenfassen) bringt die Reihenfolge durcheinander, in der die Skripte des Umschalters laufen. Für beides gibt es eine Lösung, die Ihren Cache und Ihre Geschwindigkeitswerte erhält.
Warum ein Seitencache den Währungswechsel stört
Der Shortcode [wpcs_price] rechnet den Betrag in PHP um, während WordPress die Seite aufbaut. Ein Seitencache speichert dieses fertige HTML und sendet dieselbe Kopie an die nächsten Besucher, die alle die Währung des Besuchers sehen, der den Cache gefüllt hat. Die vom Besucher gewählte Währung wird weiterhin gemerkt, aber PHP läuft für eine gecachte Seite nie, daher nutzt nichts sie.
Die Lösung finden Sie unter Einstellungen → Currency Switcher → Optionen (Options): Stellen Sie Ich verwende ein Cache-Plugin auf meiner Website (I am using cache plugin on my site) auf Ja (Yes). Bei aktivierter Option wird die Seite wie gecacht geladen, und dann führt das Skript front.js des Plugins Folgendes aus:
- Es sammelt alle mit
[wpcs_price]ausgegebenen Preise (jeder ist einspan.wpcs_price, der seinen ursprünglichen Betrag indata-amountträgt); - es sendet eine POST-Anfrage an
/wp-admin/admin-ajax.phpmitaction=wpcs_get_prices_html; - es ersetzt die Preise durch die Antwort, die für diesen Besucher berechnet wurde, und stellt den Umschalter auf die Währung des Besuchers.
Drei Details sind bei der Fehlersuche wichtig:
- Bis diese Antwort eintrifft, ignoriert der Umschalter Klicks, sodass er nie aus einem veralteten Zustand heraus umschaltet. Wird die Anfrage blockiert oder schlägt sie fehl, bleibt der Umschalter tot. Das ist eine typische Ursache für „Klicken bewirkt nichts“.
- Die Option wird als kleine Skriptvariable in die Seite geschrieben. Seiten, die vor Ihrer Änderung gecacht wurden, tragen noch den alten Wert; leeren Sie daher nach dem Speichern jede Cache-Ebene: Cache-Plugin, Server-Cache und CDN.
- Nur Preise von
[wpcs_price]werden neu gezeichnet. Eine Beschriftung mit[wpcs_current_currency]oder Werte, die PHP-Code in einem Template mit $WPCS->wpcs_exchange_value() ausgibt, bleiben wie gecacht. Nehmen Sie Seiten, die sich darauf verlassen, vom Seitencache aus.
Dieselbe Anfrage wendet auch GeoIP-Regeln auf Besucher gecachter Seiten an; ist die Erkennung selbst falsch, lesen Sie GeoIP-Währungserkennung funktioniert nicht.
Bremst die Anfrage wpcs_get_prices_html die Website aus?
Geschwindigkeitstests wie GTmetrix listen gegen Ende des Wasserfalldiagramms einen POST an admin-ajax.php mit wpcs_get_prices_html auf, manchmal mit einer langen Zeit daneben. Das kostet sie tatsächlich:
- Es ist eine Anfrage pro Seitenaufruf, gesendet auf jeder Seite, die das Skript des Plugins lädt, weil der Umschalter die Währung des Besuchers auch dort braucht, wo kein Preis angezeigt wird. In einer Anfrage werden höchstens 500 Preise gesendet.
- Sie startet, nachdem das HTML geparst wurde, und hindert die Seite nicht an der Anzeige. Der Besucher sieht zuerst die Seite; die Preise aktualisieren sich einen Moment später.
- Ihre Dauer entspricht ungefähr der Zeit, die WordPress ohne Seitencache zum Laden braucht. Auf einer gesunden Website ist das ein Bruchteil einer Sekunde. Dauert sie mehrere Sekunden, ist jede ungecachte Anfrage der Website so langsam, und die Ursache liegt in den Plugins oder im Hosting, nicht in dieser Anfrage.
- Wird JavaScript bis zur ersten Interaktion verzögert, startet die Anfrage erst, wenn das Testwerkzeug eine solche simuliert; sie erscheint also spät und verlängert die „Fully loaded“-Zeit, ohne zu beeinflussen, was der Besucher sieht.
Schalten Sie die Option nur aus, wenn kein Seitencache Ihre Seiten speichert: kein Cache-Plugin, kein Server-Cache und kein CDN, das HTML zwischenspeichert. Dann gibt PHP direkt die richtige Währung aus. Bei jedem Seitencache bricht das Ausschalten das Umschalten für Besucher.
JavaScript-Fehler finden, bevor Sie Einstellungen ändern
Testen Sie in einem privaten Fenster, in dem Sie nicht angemeldet sind. Seitencaches und die meisten Optimierungs-Plugins überspringen angemeldete Administratoren, weshalb der Umschalter bei Ihnen einwandfrei funktionieren und bei jedem Besucher versagen kann. Öffnen Sie die Entwicklertools (F12), laden Sie neu und sehen Sie in die Konsole:
| Meldung in der Konsole | Was passiert ist |
|---|---|
wpcs_array_of_get is not defined oder wpcs_current_currency is not defined | Das kleine Inline-Skript mit den Einstellungen des Umschalters wurde verzögert oder hinter die Skriptdateien des Plugins verschoben |
jQuery is not defined | jQuery wurde verzögert oder aufgeschoben, während Skripte liefen, die es brauchen |
| Fehler in einer zusammengefassten oder minimierten Datei | Jeder Fehler in einer zusammengefassten Datei stoppt den Code danach, den Umschalter eingeschlossen |
Öffnen Sie dann den Tab Netzwerk, geben Sie admin-ajax in den Filter ein und klicken Sie auf die Anfrage mit wpcs_get_prices_html. Eine funktionierende Antwort hat den Status 200 und beginnt mit {"prices":. Status 403 bedeutet, dass die Anfrage blockiert wird (siehe den letzten Abschnitt). Text oder HTML vor der öffnenden Klammer bedeutet, dass ein anderes Plugin oder ein PHP-Hinweis Ausgaben in die Antwort geschrieben hat; das Skript kann sie nicht lesen, sodass die Preise wie gecacht bleiben und der Umschalter gesperrt bleibt. Keine Anfrage bei aktivierter Option bedeutet, dass das Skript nie lief: Gehen Sie zurück zur Konsole.
WP Rocket, Perfmatters und andere Optimierer: was auszunehmen ist
Der Umschalter braucht drei Dinge, die in dieser Reihenfolge laufen müssen: jQuery, das Inline-Skript mit den Einstellungen, das das Plugin im Seitenkopf ausgibt, und die Dateien im Ordner js des Plugins (front.js plus die Bibliothek der Dropdown-Darstellung: ddslick, chosen oder wSelect, und die Designer-Skripte, falls Sie sie verwenden). Werden nur einige davon verzögert, führt das zu den oben genannten not defined-Fehlern.
Gehen Sie in WP Rocket zu Dateioptimierung (File Optimization) und fügen Sie diese Zeilen unter Ausgeschlossene JavaScript-Dateien (Excluded JavaScript Files) bei JavaScript-Ausführung verzögern (Delay JavaScript execution) hinzu:
/wp-content/plugins/currency-switcher/
wpcs_
/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js
/jquery-migrate(.min)?.js
Die erste Zeile deckt die Dateien des Plugins ab, wpcs_ ist ein Schlüsselwort, das im Inline-Skript mit den Einstellungen vorkommt, und die letzten beiden Zeilen verhindern, dass jQuery verzögert wird. Bleiben Fehler bestehen, während JavaScript verzögert laden (Load JavaScript deferred) aktiviert ist, nehmen Sie den Plugin-Ordner auch dort aus. WP Rocket erklärt beide Felder in Delay JavaScript execution und Exclude files from Load JavaScript deferred.
Andere Werkzeuge haben dieselben Schalter unter anderen Namen: die Skriptverzögerung in Perfmatters, Minimieren und Zusammenführen in WP-Optimize, Minimieren und Zusammenfassen in W3 Total Cache. Nehmen Sie denselben Plugin-Ordner und jQuery aus oder schalten Sie das Zusammenfassen testweise ab. Funktioniert der Umschalter bei ausgeschaltetem Optimierer, liegt das Problem in dessen Konfiguration, und die Konsole zeigt, welche Datei betroffen ist.
Leeren Sie nach jeder Änderung den Cache und die vom Optimierer erzeugten Dateien (die meisten Plugins erstellen minimierte und zusammengefasste Dateien neu, wenn Sie ihren Cache leeren), leeren Sie das CDN und laden Sie mit Strg+F5 neu. Der Test gegen alte optimierte Dateien ist der häufigste Grund, warum ein korrekter Ausschluss scheinbar nicht wirkt.
Server-Cache, den Sie nicht abschalten können
Managed Hoster betreiben oft einen eigenen Seitencache, der sich nicht deaktivieren lässt. Stellen Sie Ich verwende ein Cache-Plugin auf meiner Website (I am using cache plugin on my site) auf Ja (Yes) und leeren Sie nach der Änderung den Cache des Hosters.
Lassen Sie Keine GET-Daten im Link (No GET data in link) auf Nein (No): Der Umschalter leitet den Besucher dann auf dieselbe Seite mit ?currency=EUR weiter, PHP baut diese Seite auf und speichert die Auswahl. Das funktioniert nur, solange URLs mit diesem Parameter nicht aus dem Cache ausgeliefert werden. Viele Seitencaches überspringen URLs mit Query-Strings, doch einige Host-Caches speichern jede davon als eigene Seite. Dann wird die Auswahl nie gespeichert, und die nächste Seite fällt auf die vorherige Währung zurück. Bitten Sie den Hoster, den Cache für den Parameter currency zu umgehen. Kann er das nicht, stellen Sie Keine GET-Daten im Link (No GET data in link) auf Ja (Yes). Die Auswahl wird dann durch eine Anfrage an admin-ajax.php (wpcs_set_currency_ajax) gespeichert, die Seitencaches nicht speichern, und die neu geladene Seite bekommt ihre Preise neu gezeichnet. Mit demselben Parameter ?currency= können Sie auch auf eine Seite in einer bestimmten Währung verlinken, wie in Währungslinks ohne Shortcode gezeigt.
Blockierte Anfragen: „You do not have sufficient permissions“ und 403
Sehen nicht angemeldete Besucher beim Umschalten You do not have sufficient permissions to access this page oder liefern die oben genannten Anfragen 403, blockiert etwas admin-ajax.php für anonyme Anfragen: die Firewall eines Sicherheits-Plugins, eine Funktion zum Verbergen oder Sperren von wp-admin, eine Firewall-Regel des Hosters oder der Passwortschutz des Ordners /wp-admin/. Das Plugin verwendet admin-ajax.php für diese Aktionen:
wpcs_get_prices_html: Neuzeichnen der Preise auf gecachten Seiten;wpcs_set_currency_ajax: Umschalten, wenn Keine GET-Daten im Link (No GET data in link) auf Ja (Yes) steht;wpcs_convert_currencyundwpcs_rates_current_currency: die Shortcodes für Konverter und Kurse.
Deaktivieren Sie Sicherheits- und Optimierungs-Plugins nacheinander auf einer Staging-Kopie, bis die Anfrage 200 liefert, und erlauben Sie dann admin-ajax.php mit diesen Aktionen in den Einstellungen dieses Plugins oder bitten Sie den Hoster, es von seiner Firewall-Regel auszunehmen.
Checkliste
- Abgemeldet in einem privaten Fenster getestet, nachdem alle Caches geleert wurden und Strg+F5 gedrückt wurde.
- Ich verwende ein Cache-Plugin auf meiner Website (I am using cache plugin on my site) steht auf Ja (Yes), wo immer ein Seitencache aktiv ist.
- Keine roten Fehler in der Konsole; die Anfrage
wpcs_get_prices_htmlliefert 200 und beginnt mit{"prices":. - Der Plugin-Ordner, das Inline-Skript
wpcs_und jQuery sind vom Verzögern, Aufschieben und Zusammenfassen ausgenommen. admin-ajax.phpwird für Besucher nicht blockiert.- URLs mit
?currency=werden nicht aus dem Cache ausgeliefert, oder Keine GET-Daten im Link (No GET data in link) steht auf Ja (Yes).
Versagt der Umschalter weiterhin, eröffnen Sie ein Thema im WPCS-Support-Forum mit dem Link zur Seite, den Konsolenfehlern, dem Status und der Antwort der Anfrage an admin-ajax sowie der Liste der Cache- und Optimierungswerkzeuge auf der Website.