FOX - Currency Switcher for WooCommerce

Währung nach Rechnungsadresse statt Geolokalisierung wechseln

Wenn Sie Probleme mit der Geolokalisierung haben, bei denen Kunden in der falschen Währung abgerechnet werden, hilft Ihnen dieser Leitfaden dabei, auf eine Währungserkennung basierend auf der Rechnungsadresse umzustellen.

Das Problem

Häufige Symptome (Beispiel):
  • Kanadische Kunden werden in USD statt in CAD abgerechnet (oder umgekehrt)
  • Kunden in der Nähe von Ländergrenzen erhalten die falsche Währung
  • 5-10 % Fehlerrate bei IP-basierter Geolokalisierung
  • Währung entspricht nicht dem tatsächlichen Standort des Kunden
Beispielszenario: Ein kanadischer Kunde besucht Ihren Shop. Die Geolokalisierung erkennt seine IP als US (häufig in der Nähe von Grenzen oder bei VPNs), sodass er USD-Preise sieht. Beim Checkout wählt er Kanada als Rechnungsland aus, wird aber trotzdem in USD abgerechnet. Ursache: Die IP-basierte Geolokalisierung ist nie 100 % genau, insbesondere:
  • In der Nähe von Ländergrenzen (USA/Kanada, EU-Länder)
  • Bei Verwendung von VPN- oder Proxy-Diensten
  • Firmennetzwerke mit zentralisierten IPs
  • Mobilfunknetze, die über verschiedene Länder geleitet werden

Das Problem verstehen

Warum die Geolokalisierung fehlschlägt

Häufige Ursachen:
  1. Ungenauigkeit der MaxMind-Datenbank – Die kostenlose GeoLite2-Datenbank hat eine eingeschränkte Genauigkeit
  2. Grenznähe – IPs in Grenznähe werden oft falsch identifiziert
  3. VPN-/Proxy-Nutzung – Der tatsächliche Standort des Kunden wird verborgen
  4. Caching-Konflikte – Seite mit Standardwährung gecached
  5. Server-/Proxy-Probleme – Der Hosting-Anbieter sendet die Server-IP anstelle der Besucher-IP

Geolokalisierung vs. Rechnungsland

Methode Genauigkeit Benutzerkontrolle Zuverlässigkeit
Geolokalisierung (IP) 85-95% Keine Inkonsistent
Rechnungsadresse 100% Voll Immer genau
Empfehlung: Verwenden Sie die Rechnungsadresse zur Währungserkennung – Kunden wählen ihr Land beim Checkout explizit aus.

Diagnoseschritte (vor der Behebung)

Schritt 1: Aktuelle Geolokalisierung testen

Fügen Sie diesen Shortcode zu einer beliebigen Seite hinzu:
[woocs_geo_hello]
Erwartete Ausgabe:
Your country is: Canada (defined by WooCommerce GeoIP functionality)
Was Ihnen das sagt:
  • Wenn das Land korrekt ist → WOOCS funktioniert einwandfrei, das Problem liegt bei der WooCommerce-Geolokalisierung
  • Wenn das Land falsch ist → Die WooCommerce-MaxMind-Integration muss repariert werden
  • Wenn keine Ausgabe → Geolokalisierung funktioniert überhaupt nicht

Schritt 2: WooCommerce-Geolokalisierungsstatus überprüfen

  1. Gehen Sie zu WooCommerce → Status
  2. Scrollen Sie zum Abschnitt "Geolocation debug info"
  3. Prüfen Sie auf Fehler oder Warnungen

Schritt 3: MaxMind-Lizenz überprüfen

  1. Gehen Sie zu WooCommerce → Einstellungen → Integration → MaxMind Geolocation
  2. Überprüfen Sie, ob der Lizenzschlüssel vorhanden und gültig ist
  3. Überprüfen Sie das Aktualisierungsdatum der Datenbank (sollte aktuell sein)
Bei fehlender Lizenz:

Lösung 1: Geolokalisierungsprobleme beheben (falls Sie sie weiterhin verwenden möchten)

Problembehebung #1: MaxMind-Lizenzschlüssel

Problem: WooCommerce 3.9+ erfordert eine MaxMind-Lizenz Lösung:
  1. Registrieren Sie sich unter https://www.maxmind.com/en/geolite2/signup
  2. Generieren Sie einen Lizenzschlüssel
  3. Fügen Sie ihn hinzu unter WooCommerce → Einstellungen → Integration → MaxMind Geolocation
  4. Datenbank wird automatisch heruntergeladen

Problembehebung #2: Caching-Konflikte

Problem: Gecachte Seiten zeigen die Standardwährung an, bevor die Geolokalisierung ausgeführt wird Lösung: In WooCommerce:
  • Gehen Sie zu WooCommerce → Einstellungen → General
  • Setzen Sie 'Default customer location' auf 'Geolocate (with page caching support)'
Für WP Rocket:
  • Gehen Sie zu Cache → User Cache
  • Aktivieren Sie 'Disable caching for logged-in users'
  • Erwägen Sie, Shop-/Checkout-Seiten vom Cache auszuschließen
Für LiteSpeed Cache:
  • Schließen Sie /shop/, /product/, /checkout/ vom Cache aus
  • Aktivieren Sie ESI für dynamische Inhalte
Hinweis: WOOCS kann mit Caching arbeiten, indem Preise nach dem Seitenladen per AJAX neu gezeichnet werden.

Problembehebung #3: Server-/Proxy-IP-Probleme

Problem: Der Server sendet seine eigene IP anstelle der Besucher-IP Betroffene Hosts: Bluehost, Server mit Varnish, Cloudflare Lösung:
  • Bitten Sie den Hosting-Support, die Header HTTP_X_REAL_IP oder HTTP_X_FORWARDED_FOR zu konfigurieren
  • Für Cloudflare: Dashboard → Caching → Configuration → setzen Sie 'Browser Cache TTL' auf 'Respect Existing Headers'

Problembehebung #4: Browser-Caching

Problem: Die Geolokalisierung funktioniert nur beim ersten Besuch und merkt sich dann die Auswahl Testlösung:
  • Verwenden Sie den Inkognito-/Privatmodus zum Testen
  • Löschen Sie Cookies zwischen den Tests
  • Verwenden Sie VPN oder https://www.locabrowser.com, um verschiedene Standorte zu testen

Lösung 2: Auf Rechnungsadressen-Methode umstellen (empfohlen)

Diese Lösung wechselt die Währung automatisch, wenn der Kunde sein Rechnungsland beim Checkout auswählt.

Basisimplementierung (alle Länder)

Fügen Sie diesen Code in die functions.php Ihres Child-Themes oder das Code Snippets-Plugin ein:
/**
 * Switch currency based on billing country selection
 * Works during checkout when customer selects billing address
 */
add_action('woocommerce_checkout_update_order_review', function ($post_data) {
    global $WOOCS;

    parse_str($post_data, $data);

    if (isset($data['billing_country']) AND !empty($data['billing_country'])) {
        $country = trim($data['billing_country']);

        // Map billing country to currency
        $currency_map = array(
            'US' => 'USD',
            'CA' => 'CAD',
            'GB' => 'GBP',
            'AU' => 'AUD',
            'EU' => 'EUR', // For Euro zone countries
            'DE' => 'EUR',
            'FR' => 'EUR',
            'ES' => 'EUR',
            'IT' => 'EUR',
        );

        // Get currency for selected country
        if (isset($currency_map[$country])) {
            $new_currency = $currency_map[$country];

            // Switch currency if different from current
            if ($WOOCS->current_currency !== $new_currency) {
                $WOOCS->set_currency($new_currency);
            }
        }
    }
}, 10);
  So funktioniert es:
  • Der Kunde gelangt zur Checkout-Seite
  • Wählt das Rechnungsland aus dem Dropdown aus
  • WooCommerce löst AJAX aus, um die Bestellung neu zu berechnen
  • Der Code erkennt die Länderauswahl und wechselt die Währung
  • Die Bestellsummen werden sofort mit der korrekten Währung aktualisiert
Weitere Länder hinzufügen: Fügen Sie einfach Zeilen zum Array $currency_map hinzu:
'MX' => 'MXN', // Mexico
'JP' => 'JPY', // Japan
'BR' => 'BRL', // Brazil
 

Kanada-spezifische Implementierung

Anwendungsfall: Nur Kanada verwendet CAD, alle anderen Länder verwenden USD
/**
 * Canada = CAD, all other countries = USD
 */
add_action('woocommerce_checkout_update_order_review', function ($post_data) {
    global $WOOCS;

    parse_str($post_data, $data);

    if (isset($data['billing_country']) AND !empty($data['billing_country'])) {
        $country = trim($data['billing_country']);

        // Canada = CAD, everything else = USD
        $new_currency = ($country === 'CA') ? 'CAD' : 'USD';

        if ($WOOCS->current_currency !== $new_currency) {
            $WOOCS->set_currency($new_currency);
        }
    }
}, 10);
  Ergebnis:
  • Rechnungsland = Kanada → CAD
  • Rechnungsland = Vereinigte Staaten → USD
  • Rechnungsland = Vereinigtes Königreich → USD
  • Rechnungsland = Deutschland → USD
  • Jedes andere Land → USD

Eurozone-Implementierung

Anwendungsfall: Mehrere Eurozonen-Länder
/**
 * Euro zone countries = EUR, others = USD
 */
add_action('woocommerce_checkout_update_order_review', function($post_data) {
    global $WOOCS;
    
    parse_str($post_data, $data);
    
    if (isset($data['billing_country']) AND !empty($data['billing_country'])) {
        $country = trim($data['billing_country']);
        
        // Define Euro zone countries
        $euro_countries = ['AT', 'BE', 'CY', 'EE', 'FI', 'FR', 'DE', 'GR', 
                          'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PT', 
                          'SK', 'SI', 'ES'];
        
        // Determine currency
        if (in_array($country, $euro_countries)) {
            $new_currency = 'EUR';
        } else {
            $new_currency = 'USD';
        }
        
        if ($WOOCS->current_currency !== $new_currency) {
            $WOOCS->set_currency($new_currency);
        }
    }
}, 10);
 

Mit Debug-Protokollierung (zur Fehlerbehebung)

Wenn Sie Probleme beim Währungswechsel debuggen müssen, verwenden Sie diese Version mit Protokollierung:
/**
 * Billing address currency switching with debug logging
 */
add_action('woocommerce_checkout_update_order_review', function($post_data) {
    global $WOOCS;
    
    parse_str($post_data, $data);
    
    if (isset($data['billing_country']) AND !empty($data['billing_country'])) {
        $country = trim($data['billing_country']);
        
        // Canada = CAD, all others = USD
        $new_currency = ($country === 'CA') ? 'CAD' : 'USD';
        
        // Debug logging
        error_log('WOOCS billing country received: ' . $country . ' → currency: ' . $new_currency);
        error_log('WOOCS current currency: ' . $WOOCS->current_currency . ' → switching to: ' . $new_currency);
        
        if ($WOOCS->current_currency !== $new_currency) {
            $WOOCS->set_currency($new_currency);
        }
    }
}, 10);
  So zeigen Sie Protokolle an:
  1. Aktivieren Sie das WordPress-Debug-Logging in der wp-config.php:
    define('WP_DEBUG', true);
    define('WP_DEBUG_LOG', true);
    define('WP_DEBUG_DISPLAY', false);
  2. Protokolle werden unter /wp-content/debug.log gespeichert
  3. Laden Sie sie per FTP herunter, um sie zu überprüfen
Protokollierung nach dem Debuggen entfernen: Löschen Sie einfach die beiden error_log()-Zeilen aus dem Code.

Lösung 3: Geolokalisierung vollständig deaktivieren

Wenn die Geolokalisierung zu viele Probleme verursacht, deaktivieren Sie sie vollständig und verlassen Sie sich nur auf die manuelle Währungsauswahl + Rechnungsadresse.

Schritt 1: WooCommerce-Geolokalisierung deaktivieren

  1. Gehen Sie zu WooCommerce → Einstellungen → General
  2. Suchen Sie 'Default customer location'
  3. Wählen Sie 'Shop base address' oder 'No location by default'
Was dies bewirkt:
  • ✅ Währungswechsler funktioniert weiterhin – Kunden können manuell wechseln
  • ✅ Alle Währungen bleiben aktiv
  • ✅ Rechnungsadressen-Code (Lösung 2) funktioniert weiterhin
  • ❌ Keine automatische Währungserkennung beim ersten Besuch

Schritt 2: WOOCS-GeoIP-Regeln entfernen

  1. Gehen Sie zu WOOCS-Einstellungen → Reiter GeoIP
  2. Entfernen Sie alle Geolokalisierungsregeln
  3. Speichern Sie die Einstellungen

Schritt 3: Standardwährung festlegen

  1. In WOOCS-Einstellungen → Reiter Options
  2. Legen Sie Ihre Hauptmarkt-Währung als Standard fest
  3. Beispiel: Wenn Sie hauptsächlich den US-Markt bedienen, setzen Sie USD als Standard
Ergebnis:
  • Alle Besucher sehen beim ersten Laden die Standardwährung
  • Kunden können manuell über den Währungsauswahl umschalten
  • Beim Checkout wechselt die Währung automatisch basierend auf dem Rechnungsland (falls Sie den Code aus Lösung 2 hinzugefügt haben)

Wo der Code hinzugefügt werden soll

Option 1: Child-Theme functions.php (empfohlen)

  1. Gehen Sie zu Design → Theme-Editor
  2. Wählen Sie Child-Theme (wichtig!)
  3. Öffnen Sie functions.php
  4. Fügen Sie den Code am Ende der Datei hinzu
  5. Klicken Sie auf Datei aktualisieren
Warum Child-Theme:
  • Updates des Parent-Themes löschen Ihren Code nicht
  • Sicherer und besser wartbar

Option 2: Code Snippets Plugin (einfacher)

  1. Installieren Sie das Code Snippets Plugin: https://wordpress.org/plugins/code-snippets/
  2. Gehen Sie zu Snippets → Neu hinzufügen
  3. Fügen Sie den Code ein
  4. Setzen Sie auf 'Run everywhere'
  5. Aktivieren Sie das Snippet
Vorteile:
  • Keine Bearbeitung von Theme-Dateien
  • Einfach zu aktivieren/deaktivieren
  • Überlebt Theme-Wechsel
  • Sicherer für Nicht-Entwickler
Wichtig für Code Snippets: Code Snippets wird über den plugins_loaded-Hook geladen, der für Checkout-AJAX einwandfrei funktionieren sollte. Falls der Code aus irgendeinem Grund nicht ausgelöst wird (sehr selten), verwenden Sie stattdessen functions.php für 100%ige Zuverlässigkeit.

Fehlerbehebung

Währung nach Auswahl des Rechnungslands immer noch falsch

Problem: Der Kunde wählt Kanada aus, sieht aber weiterhin USD Mögliche Ursachen:
  1. Geolokalisierung überschreibt Rechnungsadresse
    • Lösung: Deaktivieren Sie die Geolokalisierung vollständig (Lösung 3)
    • Die Geolokalisierung wird zuerst ausgeführt und kann die falsche Währung 'festkleben'
  2. Code wird nicht ausgeführt
    • Überprüfen Sie, ob der Code am richtigen Ort ist
    • Stellen Sie sicher, dass keine PHP-Fehler vorliegen (prüfen Sie das Fehlerprotokoll)
    • Versuchen Sie, von Code Snippets zu functions.php zu wechseln
  3. Währungs-Speichermethode
    • Gehen Sie zu WOOCS → Options → Currency storage
    • Versuchen Sie, auf den 'transient' Speichermodus umzuschalten
    • Dies kann helfen, Konflikte mit Caching zu vermeiden
  4. Störung durch Caching
    • Leeren Sie alle Caches (WordPress, Server, Browser)
    • Schließen Sie die Checkout-Seite vom Caching aus
    • Testen Sie im Inkognito-Modus

Konflikte zwischen Geolokalisierung und Rechnungsadresse

Problem: Selbst mit dem Rechnungsadressen-Code überschreibt die Geolokalisierung diesen Diagnose:
// Add debug code
error_log('Geo detected: ' . $WOOCS->current_currency);
error_log('Billing country: ' . $country);
  Lösung: Wenn die Protokolle zeigen, dass die Geolokalisierungswährung NACH dem Wechsel des Rechnungslands erscheint, müssen Sie:
  1. Geolokalisierung vollständig deaktivieren
  2. ODER die Priorität des Rechnungsadressen-Hooks erhöhen:
    add_action('woocommerce_checkout_update_order_review', function($post_data) {
        // ... your code ...
    }, 999); // Higher priority = runs later

Code verursacht weißen Bildschirm / Fehler

Problem: Das Hinzufügen von Code führt zu einer Fehlfunktion der Website Ursachen:
  • PHP-Syntaxfehler (fehlende Klammer, Semikolon)
  • Falsche Datei bearbeitet (Parent-Theme anstelle von Child-Theme bearbeitet)
  • Plugin-Konflikt
Lösung:
  1. Greifen Sie per FTP auf die Website zu
  2. Benennen Sie functions.php in functions.php.backup um
  3. Die Website wird wiederhergestellt
  4. Überprüfen Sie den Code auf Syntaxfehler
  5. Versuchen Sie, den Code in kleineren Abschnitten hinzuzufügen

Währungszuordnung funktioniert nicht

Problem: Einige Länder zeigen die falsche Währung an Überprüfung:
  1. Der Ländercode ist korrekt (2-Buchstaben-ISO-Code)
  2. Der Währungscode existiert in WOOCS
  3. Groß-/Kleinschreibung: Verwenden Sie 'CA', nicht 'ca'
Ländercodes finden:
  • WooCommerce verwendet ISO-3166-1-alpha-2-Codes
  • Vollständige Liste: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2

Rechnungsadresse zeigt „United States (US)“, aber Code erwartet „US“

Problem: Der Länderstring ist „United States (US)“, aber der Code prüft auf „US“ Lösung: Der Code verwendet bereits trim(), aber WooCommerce sendet nur „US“, daher sollte dies kein Problem sein. Falls doch:
// Extract country code
$country = trim($data['billing_country']);
if (strlen($country) > 2) {
    $country = substr($country, -2); // Get last 2 characters
}
 

Bewährte Vorgehensweisen

  1. Immer ein Child-Theme verwenden – Verhindert Codeverlust bei Theme-Updates
  2. Gründlich testen – Verwenden Sie mehrere Länder beim Testen
  3. Fehlerprotokolle überwachen – Prüfen Sie nach der Implementierung auf Probleme
  4. Alle Caches leeren – WordPress, Server, Browser, CDN
  5. Dokumentieren Sie Ihre Einrichtung – Notieren Sie, welche Lösung Sie implementiert haben
  6. WOOCS aktuell halten – Die neueste Version enthält Fehlerbehebungen
  7. Sicherung vor Änderungen – Erstellen Sie immer ein Backup der functions.php vor der Bearbeitung

Leistungsaspekte

AJAX-Auswirkung

Was passiert an der Kasse:
  • Der Kunde ändert das Rechnungsland
  • WooCommerce löst einen AJAX-Aufruf aus
  • Ihr Code wird ausgeführt und wechselt die Währung
  • Die Bestellsummen werden neu berechnet
  • Die Seite wird mit der neuen Währung aktualisiert
Leistung: Minimale Auswirkung – Der AJAX-Aufruf erfolgt bereits, der Code fügt nur den Währungswechsel hinzu.

Geolokalisierung vs. Rechnungsadresse

Aspekt Geolokalisierung Rechnungsadresse
Serverlast Höher (IP-Abfrage) Niedriger (keine Abfrage)
Genauigkeit 85-95 % 100 %
Geschwindigkeit Langsamer (externe API) Sofort
Cache-freundlich Nein Ja
Empfehlung: Die Rechnungsadresse ist schneller und cache-freundlicher.

Beispiele aus der Praxis

Beispiel 1: US/Kanada-Shop (am häufigsten)

add_action('woocommerce_checkout_update_order_review', function($post_data) {
    global $WOOCS;
    parse_str($post_data, $data);
    
    if (isset($data['billing_country']) AND !empty($data['billing_country'])) {
        $country = trim($data['billing_country']);
        $new_currency = ($country === 'CA') ? 'CAD' : 'USD';
        
        if ($WOOCS->current_currency !== $new_currency) {
            $WOOCS->set_currency($new_currency);
        }
    }
}, 10);
  Einrichtung:
  • Standardwährung: USD
  • Geolokalisierung: Deaktiviert
  • Manueller Wechsler: Aktiviert für Kundenauswahl

Beispiel 2: Globaler Shop mit mehreren Währungen

add_action('woocommerce_checkout_update_order_review', function($post_data) {
    global $WOOCS;
    parse_str($post_data, $data);
    
    if (isset($data['billing_country']) AND !empty($data['billing_country'])) {
        $country = trim($data['billing_country']);
        
        $currency_map = [
            'US' => 'USD',
            'CA' => 'CAD',
            'GB' => 'GBP',
            'AU' => 'AUD',
            'NZ' => 'NZD',
            'JP' => 'JPY',
            'CN' => 'CNY',
            // Euro zone
            'DE' => 'EUR', 'FR' => 'EUR', 'ES' => 'EUR', 'IT' => 'EUR',
            'NL' => 'EUR', 'BE' => 'EUR', 'AT' => 'EUR', 'PT' => 'EUR',
        ];
        
        // Default to USD if country not mapped
        $new_currency = isset($currency_map[$country]) ? $currency_map[$country] : 'USD';
        
        if ($WOOCS->current_currency !== $new_currency) {
            $WOOCS->set_currency($new_currency);
        }
    }
}, 10);
 

Beispiel 3: Regionale Gruppierung

add_action('woocommerce_checkout_update_order_review', function($post_data) {
    global $WOOCS;
    parse_str($post_data, $data);
    
    if (isset($data['billing_country']) AND !empty($data['billing_country'])) {
        $country = trim($data['billing_country']);
        
        // Define regional currencies
        $euro_zone = ['AT', 'BE', 'CY', 'EE', 'FI', 'FR', 'DE', 'GR', 'IE', 
                      'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PT', 'SK', 'SI', 'ES'];
        $gbp_zone = ['GB', 'UK'];
        $aud_zone = ['AU', 'NZ'];
        
        // Determine currency
        if (in_array($country, $euro_zone)) {
            $new_currency = 'EUR';
        } elseif (in_array($country, $gbp_zone)) {
            $new_currency = 'GBP';
        } elseif (in_array($country, $aud_zone)) {
            $new_currency = 'AUD';
        } elseif ($country === 'CA') {
            $new_currency = 'CAD';
        } else {
            $new_currency = 'USD'; // Default
        }
        
        if ($WOOCS->current_currency !== $new_currency) {
            $WOOCS->set_currency($new_currency);
        }
    }
}, 10);
 

Zusammenfassung

Das Problem: Die Geolokalisierung per IP ist zu 85-95 % genau, was zu falschen Währungsbelastungen führt Beste Lösung: Verwenden Sie die Rechnungsadresse für eine 100 % genaue Währungserkennung Implementierung:
  1. Fügen Sie den Code für die Rechnungsadresse in functions.php oder in Code Snippets ein
  2. Deaktivieren Sie optional die Geolokalisierung vollständig
  3. Lassen Sie den manuellen Währungswechsler für Flexibilität aktiviert
Schlüsselcode (Kanada/US-Beispiel):
add_action('woocommerce_checkout_update_order_review', function($post_data) {
    global $WOOCS;
    parse_str($post_data, $data);
    
    if (isset($data['billing_country']) AND !empty($data['billing_country'])) {
        $country = trim($data['billing_country']);
        $new_currency = ($country === 'CA') ? 'CAD' : 'USD';
        
        if ($WOOCS->current_currency !== $new_currency) {
            $WOOCS->set_currency($new_currency);
        }
    }
}, 10);
  Vorteile:
  • ✅ 100 % genaue Währungserkennung
  • ✅ Keine Geolokalisierungs-API-Aufrufe
  • ✅ Bessere Leistung
  • ✅ Cache-freundlich
  • ✅ Der Kunde kontrolliert seine Währung
  • ✅ Keine Grenznähe-Probleme
  • ✅ Funktioniert mit VPNs
Dieser Ansatz beseitigt die Unsicherheit der Geolokalisierung und gibt den Kunden die volle Kontrolle über ihre Währung an der Kasse.
Quelle: https://pluginus.net/support/topic/geotagging-issues