FOX - WooCommerce Currency Switcher Professional

WooCommerce Geolokalisierung zeigt die falsche Währung: Checkliste

Wenn die WooCommerce-Geolokalisierung die falsche Währung anzeigt, sind die GeoIP-Regeln in FOX selten der defekte Teil. Die Währung für einen neuen Besucher ist das Ende einer kurzen Kette: WooCommerce ermittelt das Land anhand der IP-Adresse, FOX sucht dieses Land in seinen GeoIP-Regeln, und das Ergebnis wird für den Besucher gespeichert. Eine falsche Währung bedeutet, dass ein Glied dieser Kette versagt hat: Das Land wurde nicht erkannt, das Land wurde erkannt, passte aber zu keiner Regel, oder der Besucher hat den Code nie erreicht, weil ein Cache zuerst geantwortet hat. Die folgenden Prüfungen finden in dieser Reihenfolge heraus, welches Glied es ist.

So wählt FOX die Währung für einen neuen Besucher

FOX hat keine eigene Geolokalisierungs-Datenbank. Das Plugin ruft WC_Geolocation::geolocate_ip() auf, dieselbe Funktion, die WooCommerce für Steuer- und Versandschätzungen verwendet, und erhält einen zweistelligen Ländercode zurück. Danach geht es die Listen im Tab GeoIP seiner Einstellungen (WooCommerce → Einstellungen → Währung) durch: Die erste Währung, deren Liste dieses Land enthält, wird zur Währung des Besuchers. Enthält keine Liste das Land, bleibt der Besucher bei der Willkommenswährung (Welcome currency) aus dem Tab Optionen (Options). Wie Sie die Regeln von Grund auf einrichten, steht in Währung automatisch nach Land ändern; diese Seite klärt, warum sie nicht funktionieren.

Drei Details dieser Logik erklären die meisten Meldungen der Art „Es funktioniert nicht“:

  • Die Regeln gelten einmal, beim ersten Besuch. Danach speichert FOX die Währung des Besuchers und verwendet sie auf jeder Seite, sodass ein Besucher, der die Währung von Hand gewechselt hat, seine Wahl behält. Spätere Änderungen an den Regeln betreffen keine Besucher, die bereits eine gespeicherte Währung haben.
  • Der erste Besuch gilt auch dann als verbraucht, wenn kein Land erkannt wurde. Konnte schon der allererste Seitenaufruf den Besucher nicht geolokalisieren, werden die Regeln auf der zweiten Seite nicht erneut angewendet. Der Besucher bleibt bei der Willkommenswährung, bis seine gespeicherten Daten ablaufen.
  • Die Entscheidung fällt in PHP, während WordPress die Seite aufbaut. Eine Seite, die als fertiges HTML aus einem Cache ausgeliefert wird, führt sie nicht aus.

Schritt 1: Prüfen, was WooCommerce erkennt

Legen Sie eine Entwurfsseite mit diesen beiden Shortcodes an und schließen Sie sie von jedem Cache aus (Caching-Plugin, Server-Cache, CDN):

[woocs_geo_hello] [woocs_show_current_currency]

[woocs_geo_hello] fragt WooCommerce nach dem Land der aktuellen Anfrage und gibt Your country is: ... aus, oder Your country is not defined! Troubles with GeoIp service., wenn WooCommerce nichts zurückliefert. [woocs_show_current_currency] gibt die Währung aus, die FOX für Sie verwendet. Die Seite muss ungecacht bleiben: Eine gecachte Kopie zeigt das Land desjenigen, der sie als Erster geladen hat.

Öffnen Sie die Seite als echter neuer Besucher. Ein privates Fenster reicht nicht immer aus, denn was als „neu“ gilt, hängt von der Währungsspeicherung (Currency storage) im Tab Optionen (Options) ab:

  • PHP-Sitzung (PHP Session) und FOX-Sitzung (FOX Session) halten die Daten hinter einem Browser-Cookie, sodass ein frisches privates Fenster ein neuer Besucher ist.
  • Transient, Memcached und Redis verschlüsseln die Daten nach IP-Adresse. Jeder Browser derselben Verbindung ist derselbe Besucher, und auch eine VPN-Adresse, die Sie oder jemand anderes bereits für einen Test verwendet hat, ist nicht neu. Testen Sie über eine andere Verbindung, etwa mit einem Smartphone im Mobilfunknetz, oder stellen Sie für die Dauer des Tests auf PHP-Sitzung (PHP Session) um.
Was die Testseite zeigtWo das Problem liegt
Land nicht definiertWooCommerce kann überhaupt nicht geolokalisieren
Ein falsches Land, oft das des Shops oder des ServersEine falsche IP-Adresse erreicht WooCommerce, oder der Server cacht den Standort
Richtiges Land, falsche Währung, bei einem brandneuen BesuchDie GeoIP-Regeln
Hier richtiges Land und richtige Währung, auf Shop-Seiten falsche WährungSeiten-Cache

Kein Land oder das falsche Land

Dieser Teil liegt bei WooCommerce und dem Server, und FOX kann nur verwenden, was sie liefern.

MaxMind ist nicht eingerichtet

WooCommerce schlägt die IP-Adresse in der kostenlosen MaxMind-GeoLite2-Datenbank nach, die es nur herunterlädt, wenn Sie einen Schlüssel angeben. Legen Sie ein kostenloses MaxMind-Konto an, erzeugen Sie einen Schlüssel und tragen Sie ihn unter WooCommerce → Einstellungen → Integration → MaxMind-Geolokalisierung (MaxMind Geolocation) ein. Stellen Sie Standard-Kundenstandort (Default customer location) unter WooCommerce → Einstellungen → Allgemein auf eine der beiden Optionen Geolokalisieren (Geolocate), denn WooCommerce lädt und aktualisiert die Datenbank nur, wenn die Geolokalisierung verwendet wird. Ohne die Datenbank greift WooCommerce auf öffentliche Abfragedienste mit einem Zeitlimit von zwei Sekunden zurück, was erklären kann, dass ein Land bei manchen Anfragen erkannt wird und bei anderen fehlt.

Der Server übergibt seine eigene IP-Adresse

WooCommerce entnimmt die Adresse des Besuchers zuerst dem Header X-Real-IP, dann der ersten Adresse in X-Forwarded-For und schließlich REMOTE_ADDR. Hinter einem Reverse-Proxy, einem Load Balancer oder Varnish können diese Felder die Adresse des Proxys enthalten, und alle Besucher werden dem Land des Rechenzentrums zugeordnet. Hinter Cloudflare ist die einfachste Lösung die eigene Einstellung IP-Geolokalisierung (IP Geolocation) von Cloudflare: Sie fügt einen Header CF-IPCountry hinzu, und WooCommerce liest ein Land aus diesem Header, bevor es irgendeine IP-Adresse betrachtet. Andernfalls muss der Server die echte Adresse wiederherstellen; bei nginx sind das die Direktiven real_ip_header und set_real_ip_from, die Ihr Hoster setzen kann.

Um zu sehen, welche Adresse bei WooCommerce ankommt, fügen Sie diesen temporären Shortcode hinzu und setzen Sie [geo_debug] auf die ungecachte Testseite:

/*
 * Temporary geolocation check. Child theme functions.php or a code snippets plugin.
 * Remove it when you are done.
 */
add_shortcode('geo_debug', function () {
    if (!class_exists('WC_Geolocation')) {
        return '';
    }
    $geo = WC_Geolocation::geolocate_ip();
    return 'IP seen by WooCommerce: ' . esc_html(WC_Geolocation::get_ip_address())
        . '<br>Country: ' . esc_html($geo['country']);
});

Ist die IP die Ihres Servers oder immer dieselbe Adresse, egal wer die Seite öffnet, liegt die Ursache beim Proxy.

Das Hosting cacht den Standort

Manche Managed-Hoster betreiben vor WordPress einen eigenen Seiten- oder „dynamischen“ Cache, und manche cachen den erkannten Standort pro Seite. Die Testseite zeigt dann für jeden Besucher dasselbe Land, obwohl kein Caching-Plugin installiert ist. Bitten Sie den Hoster, Ihre Seiten von dieser Ebene auszuschließen oder sie nach Land zu unterscheiden, oder testen Sie zur Bestätigung mit ausgeschaltetem Cache.

Richtiges Land, falsche Währung: die GeoIP-Regeln

Zeigt die Testseite bei einem brandneuen Besuch das richtige Land und die Währung ist trotzdem falsch, öffnen Sie den Tab GeoIP:

  • Leere Listen. Sind keiner Währung Länder zugewiesen, wechselt FOX nie nach Standort, und jeder Besucher erhält die Willkommenswährung.
  • Ein Land in zwei Listen. FOX nimmt die erste Währung in der Reihenfolge des Tabs Währungen (Currencies), deren Liste das Land enthält. Ein Land, das in der USD-Liste verbleibt, hält diese Besucher bei USD, unabhängig davon, welchen anderen Währungen es zugewiesen ist. Wer für eine Währung auf Alle auswählen (Select all) klickt und danach anderen Währungen Länder zuweist, gerät leicht in diese Situation.
  • Ein Land, das in keiner Liste steht. Der Versand in einen neuen Markt nimmt ihn nicht in die Regeln auf; fügen Sie das Land der richtigen Währung hinzu.
  • Eine Regel für eine Währung, die es im Shop nicht mehr gibt. Regeln werden nach Währungscode gespeichert. Wenn Sie im Tab Währungen (Currencies) eine Währung entfernen oder umbenennen, verweist eine übrig gebliebene Regel auf einen Code, zu dem FOX nicht wechseln kann, und diese Besucher erhalten die Basiswährung. Erneutes Speichern der Einstellungen schreibt die Regeln nur für die aktuellen Währungen neu.
  • Das integrierte Profil EU-Länder (EU countries). Es führt Polen unter dem Code PO auf, der kein Ländercode ist, sodass Polen beim Anwenden des Profils fehlt. Fügen Sie Polen von Hand hinzu.

Zwei weitere Ursachen liegen außerhalb der Regeln. Eigener Code, der auf jeder Seite $WOOCS->set_currency() aufruft, zum Beispiel in wp_head, überschreibt die GeoIP-Auswahl; suchen Sie im Theme und in den Snippets danach. Und ein Währungs-Dropdown, das vom Theme oder einem Page Builder erzeugt wird, ist nicht der FOX-Switcher und gibt die aktive Währung unter Umständen schlicht nicht wieder; vergleichen Sie mit dem Shortcode [woocs].

Die Geolokalisierung zeigt die falsche Währung nur auf gecachten Seiten

Ein Full-Page-Cache speichert eine fertige Kopie einer Seite und gibt sie an alle weiter, sodass die Währung des ersten Besuchers dem nächsten angezeigt wird und der GeoIP-Code für den Besucher, der die Kopie erhalten hat, nie läuft. Warum sich Währungsumrechner und Seiten-Cache gegenseitig bekämpfen erklärt den Konflikt ausführlich; für die Geolokalisierung greifen diese vier Einstellungen ineinander:

  1. Standard-Kundenstandort (Default customer location) = Geolokalisieren (mit Unterstützung für Seiten-Caching) (Geolocate (with page caching support)). WooCommerce leitet dann auf URLs mit einem Schlüssel ?v= weiter, der aus dem Standort des Besuchers gebildet wird. Ein Cache, der Seiten nach der vollständigen URL ablegt, speichert so für jeden Standort eine eigene Kopie, die von einem Besucher aus diesem Standort erzeugt wurde. Der Cache darf den Query-Parameter v nicht ignorieren.
  2. Ich verwende ein Cache-Plugin auf meiner Website (I am using cache plugin on my site) im FOX-Tab Optionen (Options). Nachdem eine gecachte Seite geladen wurde, fragt das Plugin den Server nach der gespeicherten Währung des Besuchers und zeichnet die Preise neu, wenn sie von der Währung im gecachten HTML abweicht.
  3. Eine Speicherung, die der Cache nicht zwischen Besuchern teilen kann. Fügen Sie bei PHP-Sitzung (PHP Session) das Cookie PHPSESSID zur „Nie cachen“-Cookie-Liste des Cache-Plugins hinzu, bei FOX-Sitzung (FOX Session) das Cookie, das mit wp_woocs_session_ beginnt. Steht ein CDN vor der Website, vermeidet Transient zusammen mit der Cache-Option Cookies ganz.
  4. Warenkorb-, Kassen- und Kontoseiten vom Cache ausgeschlossen, einschließlich eigener Kassenseiten, die von einem Theme oder einem Funnel-Plugin erstellt wurden.

Eine Einschränkung von FOX 2.5.5 spielt hier eine Rolle: Die Neuzeichnungsanfrage vergleicht die Währung der gecachten Kopie mit der aktuellen Währung des Besuchers, bevor sie den GeoIP-Schritt erreicht. Ein neuer Besucher startet in der Willkommenswährung (Welcome currency), sodass auf Seiten, die in der Willkommenswährung (Welcome currency) gecacht wurden, die GeoIP-Regeln übersprungen werden und der Besucher sie behält. Der Artikel zu Cloudflare APO enthält ein kurzes Snippet, das den GeoIP-Schritt zuerst ausführt; es funktioniert mit jedem Seiten-Cache, nicht nur mit Cloudflare.

Speziell für WP Rocket listet FOX und WP Rocket die nötigen Skript-Ausschlüsse auf. Um zu bestätigen, dass der Cache die Ursache ist, leeren Sie jede Ebene (Plugin, Server, CDN), deaktivieren Sie den Cache für einen Test und wiederholen Sie den Test des ersten Besuchs.

VPN-Nutzer, Grenzorte und das Rechnungsland

Die IP-Geolokalisierung sagt Ihnen, wo die Verbindung ins Internet geht, nicht, wo der Kunde wohnt. Ein VPN, ein Firmennetzwerk, ein Mobilfunkanbieter, der über ein Nachbarland routet, oder eine Stadt nahe der Grenze führen alle zum „falschen“ Land, und WooCommerce meldet es aus Sicht der IP-Adresse korrekt. Kostenlose VPNs sind zum Testen besonders unzuverlässig, und eine VPN-Adresse, die schon jemand benutzt hat, ist bei IP-basierter Speicherung kein erster Besuch.

Soll die Währung zum Kunden und nicht zur Verbindung passen, entscheiden Sie an der Kasse anhand der Adresse, die der Kunde eingibt. Währung nach Rechnungsadresse statt nach Geolokalisierung wechseln enthält dafür fertigen Code, und Währung nach Lieferland ändern leistet dasselbe für das Versandland. Wenn Sie feste Preise pro Währung verwenden, sorgt stattdessen die Option Kasse nach GeoIP-Regeln (Checkout by GeoIP rules) im Tab Erweitert (Advanced) dafür, dass die Kasse die GeoIP-Währung des Landes des Besuchers verwendet, unabhängig davon, was er beim Stöbern gewählt hat.

Checkliste

  • Die ungecachte Testseite zeigt für einen brandneuen Besucher das richtige Land.
  • MaxMind-Schlüssel gespeichert, Standard-Kundenstandort (Default customer location) auf eine Option Geolokalisieren (Geolocate) gestellt.
  • Hinter einem Proxy oder CDN erreicht die echte Besucher-IP oder ein Länder-Header WordPress.
  • Jedes Zielland steht in genau einer GeoIP-Liste, und diese Währung existiert im Shop.
  • Mit Seiten-Cache: Geolokalisieren (mit Unterstützung für Seiten-Caching) (Geolocate (with page caching support)), Ich verwende ein Cache-Plugin auf meiner Website (I am using cache plugin on my site), eine Speicherung pro Besucher und die Kasse ausgeschlossen.
  • Tests als neuer Besucher für die verwendete Speicherung, nicht in einem Browser, der bereits eine gespeicherte Währung hat.

Zeigt die Testseite für einen neuen Besucher das richtige Land und die Währung ist bei deaktivierten Caches weiterhin falsch, eröffnen Sie ein Thema im FOX-Support-Forum mit dem Link zur Testseite, Ihren GeoIP-Regeln und der Speichereinstellung, und wir werden uns das ansehen.