WordPress-Währungsumschalter: GeoIP funktioniert nicht – Ursachen und Lösungen
Wenn die GeoIP-Regeln des WordPress-Währungsumschalters nicht funktionieren, sind die Symptome unterschiedlich: Jeder Besucher erhält dieselbe Währung, Besucher aus einem Land sehen weiterhin die Willkommenswährung, oder der Test-Shortcode zeigt ein leeres Land an. Meistens schlägt das Plugin genau die Adresse nach, die ihm übergeben wird. Die eigentliche Ursache ist die IP-Adresse, die der Server an PHP weitergibt, ein Seitencache, der die Seite eines Besuchers an alle ausliefert, oder ein Test, der kein Erstbesuch war. Im Folgenden erfahren Sie, wie die Erkennung funktioniert, wie Sie in wenigen Minuten herausfinden, welche dieser Ursachen vorliegt, und wie Sie jede davon beheben.
Wie GeoIP die Währung auswählt
Im Tab GeoIP-Regeln (GeoIP rules) unter Einstellungen → Currency Switcher hat jede Währung eine Liste von Ländern. Beim ersten Besuch eines Besuchers ermittelt das Plugin das Land seiner IP-Adresse und wechselt zu der Währung, in deren Liste dieses Land steht. Länder, die in keiner Liste stehen, erhalten die Willkommenswährung (Welcome currency) aus dem Tab Optionen (Options). Nach diesem ersten Besuch merkt sich das Plugin die Währung im Währungsspeicher (Currency storage) und wendet die Regeln nicht erneut an, sodass eine vom Besucher von Hand gewählte Währung erhalten bleibt. Die vollständige Einrichtung ist in Währung nach Land des Besuchers festlegen beschrieben; diese Seite zeigt, wie Sie herausfinden, was sie stört.
Zwei Details erklären die meisten der folgenden Probleme:
- Welche Adresse verwendet wird. Das Plugin liest zuerst den Request-Header
X-Real-IP, dann die erste Adresse inX-Forwarded-Forund dannREMOTE_ADDR, die Adresse des Rechners, der mit dem Webserver verbunden ist. - Welche Datenbank verwendet wird. Die Option Geoposition (Geo position) bietet Open Geo IP, die mit dem Plugin gelieferte Datenbank (
lib/GeoIP.dat), und GeoIP2 (MaxMind API key is required), die GeoLite2-Datenbank von MaxMind, die mit einem kostenlosen Schlüssel von MaxMind auf Ihre Website geladen wird. Bei Open Geo IP übernimmt das Plugin den Ländercode aus dem HeaderCF-IPCountryvon Cloudflare statt aus der eigenen Abfrage, wenn eine Anfrage diesen Header enthält.
Zuerst die Diagnose: eine Testseite und ein echter Erstbesuch
Erstellen Sie eine Seite mit diesen beiden Shortcodes und nehmen Sie ihre URL von jedem Seitencache aus (Cache-Plugin, Server-Cache, Cloudflare):
[wpcs_check_country] [wpcs_price value=10]
[wpcs_check_country] gibt Your current country is: Germany, Code: DE aus. Er führt bei jedem Seitenaufruf eine neue Abfrage durch und ignoriert die gemerkte Währung, beantwortet also nur eine Frage: Stimmt das Land? Der Betrag von [wpcs_price] zeigt, welche Währung für Sie aktiv ist. Ohne die Cache-Ausnahme wird die Länderzeile selbst gecacht und zeigt das Land dessen, der die Seite zuerst geladen hat.
Um auch die Währung zu prüfen, muss jeder Test ein Erstbesuch sein, und was als neuer Besucher gilt, hängt vom Währungsspeicher (Currency storage) ab:
| Währungsspeicher | Der Besucher wird gemerkt über | Ein echter Erstbesuch zum Testen |
|---|---|---|
| transient (Standard) | IP-Adresse, für einen Tag | Eine andere Verbindung (VPN, mobile Daten). Ein privates Fenster über dieselbe Verbindung ist nicht neu. |
| cookie | Das Cookie wpcs_guest_id, für einen Tag | Ein neues privates Fenster. Ein VPN im selben Fenster einzuschalten ist nicht neu. |
| session | Das PHP-Session-Cookie | Ein neues privates Fenster. Ein VPN im selben Fenster einzuschalten ist nicht neu. |
Ein VPN in einem Browser ein- und auszuschalten, der die Website schon besucht hat, ist der häufigste Fehlalarm: Die Länderzeile ändert sich, die Währung nicht, und genau so ist es vorgesehen. Das realistischste Ergebnis liefert ein Webdienst, der Ihre Seite aus mehreren Ländern lädt. Vergleichen Sie nun, was die Testseite anzeigt, mit dieser Tabelle:
| Was die Testseite anzeigt | Ursache |
|---|---|
| Bei jedem Test dasselbe Land, oft das Land Ihres Servers oder CDN | Der Server übergibt für alle Besucher dieselbe IP |
| Bei jedem Test United States | PHP sieht die Loopback-Adresse eines lokalen Proxys |
| Das richtige Land, aber der Preis bleibt in der Willkommenswährung | Kein Erstbesuch, eine gecachte Seite oder keine Regel für dieses Land |
| Name und Code leer | Keine verwendbare Adresse oder ein IPv6-Besucher mit Open Geo IP |
| DB is empty. Please download the database. mit dem Code error | GeoIP2 ist ausgewählt, aber die Datenbank wurde nie heruntergeladen |
| Europe oder Asia/Pacific Region | Die mitgelieferte Datenbank kennt für diese Adresse nur die Region |
Alle erhalten dasselbe Land: IP-Weiterleitung korrigieren
Steht ein CDN, Reverse-Proxy, Load Balancer oder Cache-Server (Cloudflare, Nginx vor Apache, Varnish, ein Hosting-Proxy) vor WordPress, stammt die Verbindung, die PHP sieht, von diesem Rechner und nicht vom Besucher. Solange der Server nicht angewiesen wird, die ursprüngliche Adresse wiederherzustellen, erhält jeder Besucher die Adresse des Proxys und damit dessen Land. Eine häufige Variante: Nginx ist so eingestellt, dass es X-Real-IP mit seiner eigenen $remote_addr sendet, was hinter Cloudflare die Adresse des Cloudflare-Servers ist. Das Plugin liest diesen Header zuerst, sodass alle im Land des Cloudflare-Rechenzentrums erkannt werden.
Die Lösung liegt auf dem Server. Bei Nginx ersetzt das Real-IP-Modul die Adresse des Proxys durch die Adresse des Besuchers, bevor PHP sie sieht:
# nginx.conf, inside the http {} or server {} block.
# Add one set_real_ip_from line for every range listed at https://www.cloudflare.com/ips/
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 2400:cb00::/32;
real_ip_header CF-Connecting-IP;
Unter Apache erledigt mod_remoteip dasselbe mit RemoteIPHeader CF-Connecting-IP und einer Zeile RemoteIPTrustedProxy für die Cloudflare-Bereiche. Die Anleitung von Cloudflare Restoring original visitor IPs enthält beide Konfigurationen. Ohne Cloudflare ist der Header meist X-Forwarded-For, und die vertrauenswürdige Adresse ist die Ihres eigenen Proxys. Bei Managed Hosting können Sie diese Dateien nicht bearbeiten: Bitten Sie den Hoster, die echte IP des Besuchers PHP in REMOTE_ADDR oder X-Real-IP zur Verfügung zu stellen. Laden Sie die Testseite aus zwei verschiedenen Netzwerken neu; sie sollte zwei verschiedene Länder anzeigen.
Cloudflare: den Länder-Header von Cloudflare verwenden
Liegt die Website hinter Cloudflare, aktivieren Sie IP Geolocation im Bereich Network des Cloudflare-Dashboards (siehe Cloudflare IP Geolocation). Cloudflare fügt dann jeder Anfrage einen Header CF-IPCountry hinzu, und wenn Geoposition (Geo position) auf Open Geo IP steht, verwendet das Plugin ihn automatisch. Auf der Testseite stammt der Code dann von Cloudflare, während der Ländername weiterhin aus der IP-Abfrage kommt; stimmen beide nicht überein, verwenden die Regeln den Code. Bei GeoIP2 wird der Header nicht gelesen, Sie können ihn aber mit dem Filter wpcs_geo_position an die Regeln übergeben:
/*
* WPCS: take the visitor country from Cloudflare's CF-IPCountry header.
* Child theme functions.php or a code snippets plugin.
*/
add_filter('wpcs_geo_position', function ($country) {
if (!empty($_SERVER['HTTP_CF_IPCOUNTRY'])) {
$cf = strtoupper(sanitize_text_field(wp_unslash($_SERVER['HTTP_CF_IPCOUNTRY'])));
// two-letter country codes only; XX means unknown
if (preg_match('/^[A-Z]{2}$/', $cf) && $cf !== 'XX') {
return $cf;
}
}
return $country;
});
Der Filter ändert das Land, das zur Auswahl der Währung verwendet wird. [wpcs_check_country] gibt weiterhin die eigene Abfrage des Plugins aus; prüfen Sie das Ergebnis daher mit dem Preis-Shortcode und einem Erstbesuch.
Jeder Besucher wird in den Vereinigten Staaten erkannt
Läuft Nginx oder Varnish auf demselben Rechner und reicht Anfragen an Apache weiter, sieht PHP die eigene Loopback-Adresse des Servers. Das Plugin behandelt diese Adresse als Entwicklungskopie, die auf einem Computer läuft, und ersetzt sie durch eine feste öffentliche Testadresse in den Vereinigten Staaten, ohne einen Header zu lesen. Apache muss die Adresse des Besuchers mit mod_remoteip wiederherstellen:
# Apache 2.4 configuration, mod_remoteip enabled.
# Use the header your front proxy sends (X-Real-IP or X-Forwarded-For).
RemoteIPHeader X-Real-IP
RemoteIPInternalProxy 127.0.0.0/8
Nebeneffekt: eine gemerkte Währung für alle
Der Standardspeicher transient ordnet sein Gedächtnis der IP-Adresse zu. Solange alle Besucher mit einer einzigen Adresse ankommen, teilen sie sich ein Gedächtnis: Der erste Besucher des Tages bestimmt die Währung für alle, und wer die Währung wechselt, wechselt sie auch für alle anderen. Die Korrektur der Weiterleitung löst das. Auch die Einstellung Währungsspeicher (Currency storage) auf cookie hilft, denn so wird jeder Browser getrennt gemerkt, unabhängig von seiner IP.
Das Land stimmt, aber die Währung ändert sich nicht
- Kein Erstbesuch. Testen Sie erneut nach der Speichertabelle oben.
- Eine gecachte Seite. Ein Seitencache liefert gespeichertes HTML aus, und der GeoIP-Schritt läuft für den nächsten Besucher nie. Stellen Sie im Tab Optionen (Options) Ich verwende ein Cache-Plugin auf meiner Website (I am using cache plugin on my site) auf Ja (Yes). Mit
[wpcs_price]ausgegebene Preise werden dann nach dem Laden der Seite durch eine AJAX-Anfrage (wpcs_get_prices_html) neu gezeichnet, die für den aktuellen Besucher läuft, GeoIP-Regeln eingeschlossen, und der Umschalter wird auf die zurückgegebene Währung gesetzt. Leeren Sie nach der Änderung der Option jede Cache-Ebene; aktualisieren sich die Preise trotzdem nicht, lesen Sie Währungsumschalter funktioniert nicht mit einem Cache-Plugin. - Keine Regel für dieses Land. Die Regeln enthalten nur Länder; einen Eintrag Europe gibt es nicht, fügen Sie also jedes Land seiner Währung hinzu. Ein Land, das unter zwei Währungen steht, geht an die erste.
- Feste Preise.
[wpcs_price type="fixed" value="USD:15,GBP:45"]zeigt none für eine Währung, die invaluefehlt. Auch typografische Anführungszeichen (”), die aus einer Textverarbeitung eingefügt wurden, zerstören die Attribute; tippen Sie gerade Anführungszeichen. - Falsche Beträge nach dem Umschalten. Die Basiswährung im Tab Währungen (Currencies) muss den Kurs 1 haben; Umrechnungen werden von ihr aus berechnet.
Leeres oder falsches Land bei einigen Besuchern
- Leer bei einigen Besuchern. Die Abfrage mit Open Geo IP verarbeitet nur IPv4-Adressen. Besucher, die den Server über IPv6 erreichen, was in Mobilfunknetzen verbreitet ist, erhalten kein Land. GeoIP2 verarbeitet beides. Leer bei allen bedeutet, dass die Adresse, die PHP erhält, fehlt oder zu einem privaten Netzwerk gehört (Container oder Load Balancer): Korrigieren Sie die Weiterleitung wie oben.
- Europe oder Asia/Pacific Region. Keine Länderregel kann hier greifen. Wechseln Sie zu GeoIP2.
- Falsches Land. Adressbereiche wechseln den Besitzer, und Plugin-Updates bringen eine neuere Kopie der mitgelieferten Datenbank, aktualisieren Sie also zuerst das Plugin. Für bessere Genauigkeit wählen Sie GeoIP2 (MaxMind API key is required) unter Geoposition (Geo position), fügen einen kostenlosen Schlüssel aus Ihrem MaxMind-GeoLite2-Konto in MaxMind-Lizenzschlüssel (MaxMind license key) ein und klicken auf Optionen speichern (Save options). Die Schaltfläche Datenbank aktualisieren/herunterladen (Update/Download DB) erscheint erst, nachdem der Schlüssel gespeichert wurde; klicken Sie darauf und warten Sie auf Database downloaded successfully. Die Datei wird als
wp-content/uploads/currency-switcher/GeoLite2-Country.mmdbgespeichert und nicht automatisch erneuert, klicken Sie die Schaltfläche also alle paar Monate erneut an. - GeoIP2 schlechter als Open Geo IP. Die Datenbankdatei fehlt oder ist veraltet. Laden Sie sie erneut herunter oder wechseln Sie zurück zu Open Geo IP.
- VPN-Tests. Ein VPN-Ausgangsserver kann in einem anderen Land registriert sein als dem, das die VPN-App anzeigt. Vergleichen Sie mit einer zweiten Testquelle, bevor Sie Einstellungen ändern.
Kann der Server die Adresse des Besuchers nicht weitergeben und liegt die Website nicht hinter Cloudflare, kann GeoIP nicht funktionieren. Entfernen Sie dann die Regeln, stellen Sie die Willkommenswährung (Welcome currency) auf die Währung, die die meisten Ihrer Besucher verwenden, und lassen Sie sie mit dem Umschalter [wpcs] selbst wählen.
Checkliste
- Die Testseite ist von allen Caches ausgenommen und zeigt aus zwei Netzwerken unterschiedliche, korrekte Länder.
- Der Server übergibt die echte IP des Besuchers, oder IP Geolocation von Cloudflare ist mit Open Geo IP aktiviert.
- Bei GeoIP2: Der Schlüssel ist gespeichert und die Datenbank wurde heruntergeladen.
- Jeder Test war ein echter Erstbesuch für den gewählten Währungsspeicher (Currency storage).
- Ich verwende ein Cache-Plugin auf meiner Website (I am using cache plugin on my site) steht bei einer gecachten Website auf Ja (Yes), und alle Caches wurden geleert.
- Jedes Land steht unter seiner Währung, und der Kurs der Basiswährung ist 1.
Wenn all das zutrifft und Besucher trotzdem die falsche Währung erhalten, eröffnen Sie ein Thema im WPCS-Support-Forum mit dem Link zu Ihrer Testseite, Ihren Einstellungen für Geoposition (Geo position) und Währungsspeicher (Currency storage) sowie dem verwendeten Cache oder CDN.