FOX - WooCommerce Currency Switcher Professional

Währungsumrechner springt auf der nächsten Seite auf die Standardwährung zurück

Ein Besucher wählt Euro, öffnet die nächste Seite und sieht wieder die Standardwährung. Oder die Währung springt: Euro auf der Shop-Seite, Dollar beim Produkt, nach dem Hinzufügen zum Warenkorb wieder Euro. Wenn ein Währungsumrechner auf diese Weise auf die Standardwährung zurückspringt, hat FOX nichts von selbst vergessen. Es ist eines von drei Dingen passiert: Die Seite kam aus einem Cache und hat das Plugin nie erreicht, die Speicherung, die die Wahl des Besuchers festhält, hat sie nicht behalten, oder etwas auf der Website hat erneut eine andere Währung gesetzt. Im Folgenden: jede Ursache mit ihrer Lösung, eine Diagnose und die Erklärung, warum eine gecachte Seite für eine Sekunde die falsche Währung zeigen kann, bevor sie sich korrigiert.

So merkt sich FOX die gewählte Währung

Klickt ein Besucher auf eine Währung, öffnet FOX dieselbe Seite mit ?currency=EUR in der Adresse (oder sendet die Wahl per AJAX und lädt die Seite neu, wenn Keine GET-Daten im Link (No GET data in link) im Tab Optionen (Options) aktiviert ist). Das Plugin schreibt den Code in die unter Währungsspeicherung (Currency storage) gewählte Speicherung. Bei jeder späteren Anfrage liest es die Währung von dort wieder aus.

Hat die Speicherung für diesen Besucher nichts, behandelt FOX ihn als neu: Er erhält die Willkommenswährung (Welcome currency) und, falls Sie sie verwenden, die GeoIP-Regeln. Das ist oft die Standardwährung, die Leute beim „Zurückkommen“ sehen. Eine gecachte Seite zeigt wiederum eine andere: die Währung desjenigen, der zuerst gecacht wurde.

Ein Seiten-Cache liefert die Seite aus

In den meisten Fällen ist das die Ursache. Eine gecachte Seite trägt die Währung desjenigen, der sie erzeugt hat, und FOX läuft für den Besucher, der die Kopie erhält, gar nicht. Warum beides aneinandergerät und welche zwei ehrlichen Auswege es gibt, erklärt warum sich Währungsumrechner und Seiten-Cache gegenseitig bekämpfen. Diese Symptome deuten auf den Cache hin:

  • Die Währung bleibt bei Ihnen erhalten, solange Sie angemeldet sind, aber nicht in einem privaten Fenster. Die meisten Seiten-Caches überspringen angemeldete Benutzer.
  • Die Währung bleibt erhalten, sobald etwas im Warenkorb liegt. Viele Server-Caches überspringen Besucher mit dem Cookie woocommerce_items_in_cart.
  • Die Seite mit ?currency= in der Adresse stimmt, die nächste Seite ohne diesen Parameter ist falsch.
  • Zwei Browser zeigen auf derselben Seite zwei verschiedene Währungen.

Die Lösung auf Seiten von FOX ist eine einzige Einstellung: Ich verwende ein Cache-Plugin auf meiner Website (I am using cache plugin on my site) = Ja (Yes) im Tab Optionen (Options), danach jeden Cache leeren. Damit fragt jede Seite nach dem Laden den Server nach der tatsächlichen Währung des Besuchers und zeichnet die Preise neu, wenn die gecachten abweichen. Lassen Sie die Option in einem Shop ohne Seiten-Cache ausgeschaltet: Dort gibt FOX die richtigen Preise bereits auf dem Server aus.

Zwei weitere Regeln gelten für jeden Cache, gleich welcher Marke:

  • Warenkorb-, Kassen- und Kontoseiten werden nie gecacht. Cache-Plugins schließen die Standardseiten von WooCommerce aus, aber eine Kassenseite, die von einem Theme oder einem Funnel-Plugin erstellt wurde, fehlt oft in der Liste.
  • Ist Keine GET-Daten im Link (No GET data in link) aktiviert, lädt der Wechsel dieselbe Adresse neu, und ein Cache beantwortet dieses Neuladen mit der alten Währung. In einem gecachten Shop braucht diese Option die Cache-Option, sonst sieht es aus, als täte der Umschalter nichts.

Cache-Ebenen

Ein Shop kann drei Caches haben, die jeweils für sich geleert und konfiguriert werden: das Cache-Plugin, den Server-Cache des Hostings (SiteGround, Kinsta und andere Managed-Hoster betreiben einen) und ein CDN wie Cloudflare. Das Leeren des einen leert nicht die anderen. Optimierer, die JavaScript verzögern oder zusammenfassen (WP Rocket, LiteSpeed Cache, NitroPack und andere), können das Neuzeichnen ebenfalls verhindern: Die nötigen Ausschlüsse finden Sie unter FOX und WP Rocket und Währungsumrechner hängt nach JS-Optimierung beim Laden. Fragment-Caching von Seiten (etwa die mfunc-Blöcke von W3 Total Cache) ist nicht nötig: FOX zeichnet die Preise selbst neu.

Wenn das Neuzeichnen nicht läuft

Die Cache-Option hilft nur, wenn die Neuzeichnungsanfrage tatsächlich gesendet und beantwortet wird:

  • Seiten ohne Preise. FOX sendet die Anfrage nur, wenn die Seite Produktpreise enthält. Auf einer gecachten Startseite, einem Blogbeitrag oder einer Kontaktseite ohne Preise behält der Umschalter die Währung der gecachten Kopie. Die Wahl geht nicht verloren: Die nächste Seite mit Preisen zeigt sie. Ist die Beschriftung des Umschalters auf solchen Seiten wichtig, schließen Sie sie vom Seiten-Cache aus.
  • Preise, die auf nicht standardmäßige Weise ausgegeben werden. FOX findet Preise anhand des Wrappers, den es dem WooCommerce-Preis-HTML hinzufügt: <span class="woocs_price_code" … data-product-id="…">. Ein Theme, Page Builder oder Rabatt-Plugin, das das Preis-HTML selbst aufbaut, lässt diesen Wrapper weg, sodass FOX auf der Seite keine Preise sieht. Rufen Sie den Seitenquelltext auf und suchen Sie nach woocs_price_code; fehlt es rund um die Preise, deaktivieren Sie Plugins und wechseln Sie zu einem Standard-Theme, bis es auftaucht.
  • Blockiertes AJAX. Eine Firewall oder ein Sicherheits-Plugin, das /wp-admin/admin-ajax.php für Besucher blockiert, verhindert das Neuzeichnen. Die Währung wirkt dann zufällig, weil jede Seite zeigt, was gerade gecacht war.

Die Währungsspeicherung verliert die Wahl

Springt die Währung auch bei ausgeschalteten Caches zurück, behält die Speicherung die Wahl des Besuchers nicht, und jede Seite ist ein Erstbesuch. Die Währungsspeicherung (Currency storage) im Tab Optionen (Options) bestimmt, wie FOX einen Besucher wiedererkennt:

WährungsspeicherungDer Besucher wird erkannt anTypischer Grund für Rücksprünge
Transientder IP-Adresse; bei eingeschalteter Cache-Option an einem zufälligen Schlüssel, den der Browser im localStorage hältBesucher teilen sich eine IP (Büros, Mobilfunkanbieter), oder die IP wechselt während des Besuchs. Ein Server hinter einem Proxy oder Load Balancer, der X-Forwarded-For oder X-Real-IP nicht weitergibt, sieht für alle dieselbe Adresse, sodass Besucher gegenseitig ihre Währung überschreiben.
PHP-Sitzung (PHP Session)dem Cookie PHPSESSID und den Sitzungsdaten auf dem ServerDer Server löscht inaktive Sitzungen (die PHP-Standardlebensdauer beträgt 24 Minuten), das Cookie endet mit dem Schließen des Browsers, oder mehrere PHP-Server teilen sich keine Sitzungen.
FOX-Sitzung (FOX Session)einem Cookie, das mit wp_woocs_session_ beginnt und 48 Stunden gültig ist; Daten in der WooCommerce-SitzungstabelleEin Proxy oder CDN, das das Cookie entfernt; die Sitzung endet nach 48 Stunden.
Memcached, Redisder IP-Adresse, wie bei TransientEin falscher Speicherserver (Storage server) oder Speicherport (Storage port): Es wird nichts gespeichert. Nur aufgeführt, wenn die PHP-Erweiterung vorhanden ist; siehe Memcached oder Redis als Währungsspeicherung.

Ein Transient-Wert läuft einen Tag nach dem letzten Seitenaufruf des Besuchers ab, im Modus mit Browser-Schlüssel nach 30 Tagen. Springt die Währung ohne Cache zurück, wechseln Sie zu einem anderen Speichertyp, speichern Sie und testen Sie erneut. Eine Währung, die in einem Shop ohne Cache zwischen den Seiten „zufällig wechselt“, ist der Fall der gemeinsamen IP: Eine Sitzungsspeicherung behebt ihn.

Zwei Nebeneffekte sollten Sie kennen. Ein Wechsel des Speichertyps lässt einmalig jede gespeicherte Währung vergessen, sodass alle Besucher wieder neu sind. Und bei PHP-Sitzung (PHP Session) oder FOX-Sitzung (FOX Session) erhält jeder Besucher das Sitzungs-Cookie bei der ersten Anfrage; wer dieses Cookie in die „Nie cachen“-Liste eines Caches aufnimmt, schaltet den Cache für fast alle nach ihrer ersten Seite ab. Mit Seiten-Cache oder CDN ist Transient zusammen mit der Cache-Option die Kombination, die für das Caching gebaut wurde: Der Browser-Schlüssel wandert mit den Neuzeichnungs- und Warenkorb-Anfragen, und es sind keine Cookies im Spiel.

Etwas setzt die Währung erneut

Funktioniert die Speicherung und gibt es keinen Cache, springt die Währung zurück, weil etwas eine neue schreibt.

  • Links mit ?currency=. Jede Adresse mit currency=USD setzt für den Besucher, der sie öffnet, Dollar. Ein Menüeintrag, Banner oder Button, dessen Link aus dem Browser kopiert wurde, während eine Währung gewählt war, setzt jeden Besucher zurück, der darauf klickt. Durchsuchen Sie Menüs, Widgets und Seiteninhalte nach currency=.
  • Code, der auf jeder Seite set_currency() aufruft. Snippets, die die Währung nach Sprache, Benutzerrolle oder Seite wählen und bei jeder Anfrage $WOOCS->set_currency() aufrufen, überschreiben jedes Mal die Wahl des Besuchers. Durchsuchen Sie das Child-Theme und Code-Snippet-Plugins nach set_currency. Ein solches Snippet darf nur laufen, wenn es sich durchsetzen soll, nicht bei jedem Seitenaufruf.
  • Die Kasse. Ist Mehrere erlaubt (Is multiple allowed) im Tab Erweitert (Advanced) auf Nein (No) gesetzt, wechselt FOX an der Kasse zur Basiswährung, und der Besucher behält sie danach. Das ist so gewollt: Die Währung springt nach der Kasse auf die Standardwährung zurück erklärt es. Kasse nach GeoIP-Regeln (Checkout by GeoIP rules) tut dasselbe mit der Währung des Landes des Besuchers; siehe Kassenwährung nach Land des Kunden.

GeoIP-Regeln verursachen von sich aus keine Rücksprünge: Sie gelten nur beim ersten Besuch. Kehrt die GeoIP-Währung auf jeder Seite zurück, ist der Besucher auf jeder Seite „neu“, und das ist das oben beschriebene Speicherproblem.

Die Ursache Schritt für Schritt finden

  1. Reproduzieren Sie es als Besucher. Öffnen Sie ein privates Fenster, nicht angemeldet, mit leerem Warenkorb. Wählen Sie eine Währung und öffnen Sie dann eine Seite ohne Preise, eine Produktseite und den Warenkorb.
  2. Prüfen Sie, in welcher Währung die Seite aufgebaut wurde. Öffnen Sie den Seitenquelltext (Strg+U) und suchen Sie nach var woocs_current_currency; der "name" darin ist die Währung des HTML. Eine Seite, die in einer Währung aufgebaut wurde, die Sie nicht gewählt haben, kam aus einem Cache, oder die Speicherung hat die Wahl verloren.
  3. Beobachten Sie das Neuzeichnen. Öffnen Sie die Entwicklertools (F12), laden Sie neu, filtern Sie den Tab „Netzwerk“ nach admin-ajax und suchen Sie die Anfrage mit action=woocs_get_products_price_html. Die Antwort [] bedeutet, dass die gespeicherte Währung der Währung der Seite entspricht. Eine Antwort mit current_currency nennt die Währung, die FOX für Sie gespeichert hat. Keine Anfrage bedeutet: Die Cache-Option ist aus, die Seite hat keine Preise mit dem FOX-Wrapper, oder front.js wurde nicht ausgeführt; ein 403 bedeutet, dass eine Firewall sie blockiert.
  4. Umgehen Sie den Cache einmal. Fügen Sie einen Parameter hinzu, den der Cache noch nie gesehen hat, etwa ?nocache=4821, und ändern Sie die Zahl jedes Mal. Caches überspringen solche Adressen entweder oder haben noch keine Kopie davon, sodass WordPress die Seite frisch aufbaut. Stimmt die Währung dort und ist ohne den Parameter falsch, ist der Cache die Ursache.
  5. Schalten Sie die Caches aus. Deaktivieren Sie das Cache-Plugin, den Server-Cache im Hosting-Panel und den CDN-Cache und leeren Sie alle drei. Springt die Währung weiterhin zurück, ändern Sie die Währungsspeicherung (Currency storage) und suchen Sie dann nach Links mit currency= und nach Code mit set_currency.
  6. Schalten Sie die Ebenen nacheinander wieder ein und testen Sie nach jeder. Die Ebene, nach der der Rücksprung zurückkehrt, ist die, die Sie konfigurieren müssen.

Die falsche Währung erscheint für eine Sekunde und ändert sich dann

In einem gecachten Shop mit eingeschalteter Cache-Option ist dieses Flackern zu erwarten. Die gecachte Seite kommt mit den Preisen desjenigen an, der zuerst gecacht wurde. Sobald das HTML verarbeitet ist, wartet front.js 300 ms, sammelt die Preise und sendet eine Anfrage an admin-ajax.php. Der Server vergleicht die Währung der Seite mit der gespeicherten Währung des Besuchers und liefert, falls sie sich unterscheiden, neues Preis-HTML zurück, das die alten Preise ersetzt und die Umschalter aktualisiert. Die Wartezeit, die Sie sehen, ist die Zeit bis zum Start des Skripts plus diese Anfrage, die nie gecacht wird und ganz WordPress lädt. Auf einem langsamen Smartphone kann das mehrere Sekunden dauern.

So machen Sie es kürzer oder unsichtbar:

  • Verzögern Sie die Skripte von FOX nicht. Eine Einstellung „Bis zur Interaktion verzögern“ hält das Neuzeichnen zurück, bis der Besucher scrollt oder tippt. Die Ausschlüsse stehen im Artikel zur JS-Optimierung.
  • Machen Sie Seite und Server schneller. Das Neuzeichnen kann nicht beginnen, bevor die Seite verarbeitet ist, und nicht schneller enden, als der Server eine ungecachte Anfrage beantwortet.
  • Aktivieren Sie den Preis-Preloader (Prices preloader). Er erscheint im Tab Optionen (Options) unter der Cache-Option, sobald diese eingeschaltet ist. Er verbirgt die gecachten Preise hinter einem kleinen Spinner ab dem Moment, in dem die Seite erscheint, bis front.js das Neuzeichnen startet – bei einer langsamen Seite oder verzögerten Skripten der lange Teil der Wartezeit. Während die Neuzeichnungsanfrage selbst läuft, sind die gecachten Preise wieder sichtbar, sodass ein langsamer Server sie kurz weiterhin zeigt.

Der Preloader hat zwei bekannte Nebeneffekte. Produkte, die später per AJAX-Paginierung, Endlos-Scrollen oder AJAX-Filter geladen werden, werden nicht neu gezeichnet, weil das Neuzeichnen einmal pro Seitenaufruf läuft und nichts den Spinner von ihren Preisen entfernt. Deaktivieren Sie das AJAX-Laden für gecachte Produktlisten oder schalten Sie den Preloader aus. Und ein Variationen-Template eines Drittanbieters, das den Preis ohne die Standard-Variationsereignisse von WooCommerce ändert, lässt den Spinner auf dem Variationspreis stehen; verwenden Sie das Standard-Template oder lassen Sie den Autor nach jeder Änderung die Klasse woocs_preloader_ajax von .woocs_price_code entfernen.

Schalten Sie die Cache-Option aus, verschwindet das Flackern, aber der Rücksprung kehrt zurück, weil die gecachten Preise dann unverändert bleiben. Das einzige Setup ganz ohne Flackern ist, die Seiten mit Preisen nicht zu cachen. Kann der Shop die Serverlast verkraften, ist das die sauberste Wahl.

Checkliste

  • Getestet abgemeldet, in einem privaten Fenster, mit leerem Warenkorb, nachdem jede Cache-Ebene geleert wurde.
  • Ich verwende ein Cache-Plugin auf meiner Website (I am using cache plugin on my site) = Ja (Yes), wenn ein Seiten-Cache oder CDN die Shop-Seiten cacht, Nein (No), wenn keiner es tut.
  • Warenkorb-, Kassen- und Kontoseiten, auch eigene, sind von jedem Cache ausgeschlossen.
  • Preise sind in woocs_price_code-Spans eingeschlossen, und die Anfrage woocs_get_products_price_html wird mit Status 200 beantwortet.
  • Währungsspeicherung (Currency storage) geändert und getestet, falls der Rücksprung ohne jeden Cache auftritt.
  • Keine Links mit currency= in Menüs oder Inhalten, kein Code, der auf jeder Seite set_currency() aufruft, Mehrere erlaubt (Is multiple allowed) = Ja (Yes), wenn die Währung die Kasse überdauern soll.

Springt die Währung nach alledem immer noch zurück, eröffnen Sie ein Thema im FOX-Support-Forum mit dem Link zur Seite, Ihrer Cache-Konfiguration und der Antwort der Anfrage woocs_get_products_price_html, und wir werden uns das ansehen.