FOX - WooCommerce Currency Switcher Professional

WooCommerce: Checkout-Währung nach Land des Kunden, nicht nach IP

Die WooCommerce-Checkout-Währung nach dem Land des Kunden festzulegen bedeutet: Ein Kunde, der eine Schweizer Rechnungsadresse eingibt, zahlt in Schweizer Franken, gleich in welcher Währung er gestöbert hat und von wo seine Internetverbindung kommt. FOX leistet das nicht von allein anhand der Adresse. Es gibt eine eingebaute Option, die das Land der IP-Adresse des Besuchers nutzt, und für den Fall der Adresse genügt ein kurzes Snippet, das Ihre GeoIP-Regeln wiederverwendet. Diese Anleitung erklärt beide Wege, die Falle bei Rechnungs- und Lieferland, an der die meisten fehlerhaften Snippets scheitern, und die Grenzen, die Sie kennen sollten, bevor Sie sich darauf verlassen.

Land der IP-Adresse oder Land der Adresse

Es sind zwei verschiedene Länder im Spiel, und sie weichen bei Reisenden, VPN-Nutzern, Menschen in Grenznähe und allen, die ein Geschenk für jemanden im Ausland bestellen, oft voneinander ab.

LandWoher es stammtWas FOX damit macht
Land der IP-AdresseWooCommerce-Geolokalisierung, beim ersten SeitenaufrufGeoIP-Regeln wählen die erste Währung; die Option Checkout nach GeoIP-Regeln (Checkout by GeoIP rules) kann sie an der Kasse erzwingen
Rechnungslandvom Kunden im Checkout eingegeben oder gewählt, im Konto gespeichertstandardmäßig nichts; das Snippet unten nutzt es
Lieferlandnur, wenn der Kunde Lieferung an eine andere Adresse? (Ship to a different address?) anhaktstandardmäßig nichts; im Snippet optional

Wie das Land der IP-Adresse erkannt und zugeordnet wird, steht unter Währung automatisch nach Land ändern. In diesem Artikel geht es um den Moment der Zahlung.

Bevor Sie beginnen

  • Mehrfach erlaubt (Is multiple allowed) = Ja (Yes) im Tab Erweitert (Advanced) unter WooCommerce → Einstellungen → Währung (Currency). Bei Nein (No) setzt FOX den Checkout auf die Basiswährung zurück, und keine Länderlogik kann das ändern. Die Vor- und Nachteile beider Einstellungen erklärt Preise in lokaler Währung anzeigen, in Basiswährung berechnen.
  • Im Tab GeoIP zugewiesene Länder. Beide Methoden unten lesen dieselben Listen: die Schweiz in der CHF-Liste, die Länder des Euroraums in der EUR-Liste und so weiter. Mit einer einzigen Zuordnung stimmen der erste Besuch und der Checkout immer überein.
  • Zahlungsarten, die die jeweilige Währung akzeptieren. Bieten Sie über den Tab Zahlungen (Payments) jede Zahlungsart nur in Währungen an, die sie abrechnen kann; siehe Zahlungsart nach Währung ausblenden.

Die eingebaute Option: Checkout nach GeoIP-Regeln

Checkout nach GeoIP-Regeln (Checkout by GeoIP rules) steht im Tab Erweitert (Advanced). Sie erscheint nur, wenn Mehrfach erlaubt (Is multiple allowed) auf Ja (Yes) steht und Individuelle Festpreisregeln für jedes Produkt (Individual fixed prices rules for each product) eingeschaltet ist, denn sie ist für Shops gedacht, die pro Währung einen eigenen Preis festlegen: Ohne sie könnte ein Kunde die Währung wählen, in der Ihr Festpreis am günstigsten ist.

Ist sie eingeschaltet, stellt FOX den Checkout, die Seiten zur Bestellzahlung und jede Aktualisierung der Bestellübersicht auf die Währung um, die der Tab GeoIP dem IP-Land des Besuchers zuweist. Besucher aus Ländern ohne Regel behalten die Währung, die sie gewählt haben. Nach jeder Prüfung löst FOX die Action woocs_force_pay_bygeoip_rules aus, mit dem Land, der GeoIP-Währung (leer bei nicht aufgeführten Ländern) und der aktuellen Währung; hier ist der Platz für Ihren eigenen Fallback.

Die Option weiß nichts über die Adresse. Ein Schweizer, der aus einem Hotel in Italien bestellt, zahlt in Euro. Ist das für Ihren Shop ein Problem, nutzen Sie stattdessen das Snippet und schalten diese Option aus.

Checkout-Währung nach dem Rechnungsland des Kunden

Im klassischen Checkout aktualisiert WooCommerce die Bestellübersicht per AJAX, sobald der Kunde Land, Bundesland oder Postleitzahl ändert, und löst die Action woocommerce_checkout_update_order_review aus, bevor es die Summen neu berechnet. Wird die Währung an dieser Stelle umgestellt, erscheinen Summen, Versand und Zahlungsarten sofort in der neuen Währung.

/*
 * FOX: the checkout currency follows the country the customer enters.
 * Country-to-currency map: the lists in the FOX GeoIP tab.
 * Needs "Is multiple allowed" = Yes. Classic (shortcode) checkout only.
 * Child theme functions.php or a code snippets plugin.
 */
add_action('woocommerce_checkout_update_order_review', function ($post_data) {
    global $WOOCS;
    if (empty($WOOCS)) {
        return;
    }
    parse_str((string) $post_data, $data);

    // true: use the shipping country when "Ship to a different address?" is ticked
    $use_delivery_country = false;

    $country = isset($data['billing_country']) ? wc_clean($data['billing_country']) : '';
    if ($use_delivery_country && !empty($data['ship_to_different_address']) && !empty($data['shipping_country'])) {
        $country = wc_clean($data['shipping_country']);
    }

    $currency = $WOOCS->get_currency_by_country($country);

    // Optional: countries without a GeoIP rule pay in the base currency
    // if (!$currency) { $currency = $WOOCS->default_currency; }

    if ($currency && $currency !== $WOOCS->current_currency) {
        $WOOCS->set_currency($currency);
    }
}, 10000);

$WOOCS->get_currency_by_country() gibt die Währung zurück, in deren GeoIP-Liste das Land steht, oder eine leere Zeichenkette. $WOOCS->set_currency() speichert die Währung für den Besucher, sodass die Bestellung in ihr angelegt wird, wenn der Kunde sie aufgibt. Mit Priorität 10000 läuft der Code nach dem eigenen Handler von FOX an derselben Action. Wie geschrieben behalten Kunden aus nicht aufgeführten Ländern die Währung, in der sie gestöbert haben; entkommentieren Sie die Fallback-Zeile, damit sie in der Basiswährung zahlen. Wenn Sie die Länderliste lieber im Code als im Tab GeoIP pflegen möchten, bietet Währung nach Rechnungsadresse statt nach Geolokalisierung wechseln Versionen mit fest eingetragener Zuordnung.

Warum billing_country und nicht shipping_country

Die älteren Snippets in unseren FAQs zum Ändern der Währung nach Lieferland lesen shipping_country, und die häufigste Meldung dazu lautet „die Währung ist eingefroren“. Der Grund liegt darin, was WooCommerce sendet. Bei jeder Aktualisierung schickt es das gesamte Checkout-Formular, auch die Lieferfelder, die verborgen bleiben, solange Lieferung an eine andere Adresse? (Ship to a different address?) nicht angehakt ist. Das verborgene Lieferland enthält, was vorausgefüllt war, meist das geolokalisierte oder gespeicherte Land, und es ändert sich nicht, wenn der Kunde die Rechnungsadresse bearbeitet. Die Währung folgt also einem Feld, das der Kunde nie sieht.

Das Rechnungsland ist immer sichtbar und immer aktuell. Das angehakte Kästchen kommt als ship_to_different_address an, und nur dann ist das Lieferland die tatsächliche Wahl des Kunden, genau das prüft $use_delivery_country = true. Ist WooCommerce → Einstellungen → Versand so eingestellt, dass der Versand an die Rechnungsadresse erzwungen wird, gibt es gar keine Lieferfelder, und allein das Rechnungsland zählt.

Welches Land soll entscheiden? Das Rechnungsland passt zur Karte oder zum Konto, das zahlt, was Zahlungsanbieter zur Betrugsprüfung abgleichen. Das Lieferland passt zu Zoll, Abgaben und lokalen Preisen. Wählen Sie eine Regel und nennen Sie sie auf der Checkout-Seite.

Währungen nach Land einschränken

Das Snippet setzt die Regel bereits dort durch, wo es zählt: In welcher Währung ein Kunde auch gestöbert hat, ein Land mit GeoIP-Regel zahlt in der eigenen Währung. Um zusätzlich Währungen im Umschalter für Besucher eines bestimmten IP-Landes auszublenden, sodass spanische Besucher USD gar nicht erst sehen, lesen Sie wie Sie eine Währung für ein Land sperren. Dieser Filter arbeitet mit dem IP-Land, ergänzt also die Checkout-Regel, statt sie zu ersetzen.

Grenzen, die Sie kennen sollten

  • Nur klassischer Checkout. Das Snippet funktioniert mit dem Checkout über den Shortcode [woocommerce_checkout]. Der blockbasierte Checkout aktualisiert die Adresse über die WooCommerce Store API und löst woocommerce_checkout_update_order_review nie aus. Zeigt Ihre Checkout-Seite den Checkout-Block, ersetzen Sie ihn für diese Logik durch den Shortcode-Checkout.
  • Express-Zahlungsbuttons wie Apple Pay oder Google Pay übernehmen die Adresse aus dem Wallet und umgehen das Checkout-Formular, sodass die Währung bleibt, die beim Klick auf den Button aktiv war.
  • Der Versandrechner auf der Warenkorbseite löst diesen Hook nicht aus; die Währung ändert sich, wenn der Kunde den Checkout erreicht.
  • Kombinieren Sie es nicht mit Checkout nach GeoIP-Regeln (Checkout by GeoIP rules). Diese Option stellt die Checkout-Seite beim Laden auf die IP-Währung um, das Snippet stellt die Bestellübersicht einen Moment später auf die Adresswährung um, und die Seite zeigt kurz zwei Währungen. Verwenden Sie nur eine Regel.
  • Die Seiten für Warenkorb und Checkout müssen von jedem Seiten-Cache ausgenommen sein.

Angemeldete Kunden: das gespeicherte Rechnungsland auf jeder Seite

Das Checkout-Snippet wirkt nur auf der Checkout-Seite. Für einen Shop nur für Mitglieder oder wenn ein registrierter Kunde ab der ersten Seite seine eigene Währung sehen soll, lesen Sie das gespeicherte Rechnungsland bei jedem Seitenaufruf aus:

/*
 * FOX: logged-in customers always see the currency of their billing country.
 * Guests are not affected. Child theme functions.php or a code snippets plugin.
 */
add_action('wp_head', function () {
    global $WOOCS;
    if (empty($WOOCS) || !is_user_logged_in() || !function_exists('WC') || !WC()->customer) {
        return;
    }
    $currency = $WOOCS->get_currency_by_country(WC()->customer->get_billing_country());
    if ($currency && $currency !== $WOOCS->current_currency) {
        $WOOCS->set_currency($currency);
    }
}, 1000);

Es läuft, nachdem FOX seine eigene Arbeit auf der Seite beendet hat (Priorität 999), und setzt sich daher auch gegen die GeoIP-Regeln des ersten Besuchs durch. Registrierte Kunden aus einem Land mit GeoIP-Regel können die Währung nicht wechseln, solange es aktiv ist; ändern sie das Rechnungsland in ihrem Konto oder im Checkout, folgt die nächste Seite dem neuen Land.

Testen

  1. Legen Sie ein Produkt in den Warenkorb und öffnen Sie den Checkout in einem privaten Fenster.
  2. Ändern Sie das Rechnungsland auf je ein Land aus jeder GeoIP-Liste und beobachten Sie, wie die Summen nach jeder Aktualisierung die Währung wechseln.
  3. Wenn Sie die Variante mit Lieferland nutzen, haken Sie Lieferung an eine andere Adresse? (Ship to a different address?) an, wählen ein anderes Land und nehmen den Haken wieder heraus: Die Währung muss zu der des Rechnungslandes zurückkehren.
  4. Geben Sie eine Testbestellung mit der Zahlungsart im Testmodus auf und prüfen Sie die Bestellwährung im Bestellbildschirm und in der E-Mail.

Ändern sich die Summen nicht, prüfen Sie, ob die Checkout-Seite den Shortcode verwendet, ob Mehrfach erlaubt (Is multiple allowed) auf Ja (Yes) steht, ob das Land in einer GeoIP-Liste steht und ob kein anderes Snippet im Checkout $WOOCS->set_currency() aufruft. Schlägt es mit einem Standard-Theme und nur WooCommerce und FOX als aktiven Plugins immer noch fehl, eröffnen Sie ein Thema im FOX-Support-Forum mit dem verwendeten Code und einem Link zum Checkout, und wir sehen es uns an.