FOX - WooCommerce Currency Switcher Professional

WooCommerce: Preise in Lokalwährung anzeigen, in Basiswährung abrechnen

Viele Shops möchten Preise in Lokalwährung anzeigen, aber in der Basiswährung abrechnen: Besucher stöbern in Euro, Rupien oder Dollar, während jede Zahlung über ein Zahlungskonto in einer Währung läuft. WooCommerce kann das, mit einer Regel, die alle folgenden Einrichtungen prägt: Die Währung, die auf der Kassenseite angezeigt wird, ist die Währung, in der der Kunde belastet wird. Diese Anleitung behandelt die drei Möglichkeiten, das mit FOX einzurichten, die Nebenwirkungen jeder einzelnen und den umgekehrten Fall, in dem Kunden in der Währung zahlen, die sie gewählt haben.

Eine Bestellung, eine Währung

Eine WooCommerce-Bestellung speichert genau eine Währung. Welche Währung auch immer beim Erstellen der Bestellung aktiv ist, wird in sie geschrieben, und der Zahlungsanbieter erhält die Summe als Zahl in dieser Währung. FOX rechnet Preise für die Anzeige um und entscheidet, welche Währung an der Kasse aktiv ist; den Betrag auf dem Weg zur Bank rechnet es nicht um. Deshalb kann „USD anzeigen, heimlich INR abbuchen“ nicht funktionieren: Der Zahlungsanbieter würde 30 USD als 30 INR nehmen. Stattdessen muss die Kasse selbst auf die Währung umschalten, in der Sie abrechnen, und der Kunde sieht den tatsächlichen Betrag vor dem Bezahlen, was auch Streit über eine überraschende Währung auf der Kartenabrechnung verhindert.

Die Umschaltung wird durch Mehrere Währungen erlaubt (Is multiple allowed) im Reiter Erweitert (Advanced) der FOX-Einstellungen gesteuert (WooCommerce → Einstellungen → Währung).

Preise in Lokalwährung anzeigen, aber in Basiswährung abrechnen

Ist die Währung, in der Sie abrechnen, die WooCommerce-Basiswährung, ist kein Code nötig. Setzen Sie Mehrere Währungen erlaubt (Is multiple allowed) auf Nein (No) und speichern Sie; eine frische FOX-Installation startet mit Ja (Yes). Dann gilt:

  • Shop, Produktseiten und Warenkorb zeigen die Währung des Besuchers, gewählt über den Umschalter oder Ihre GeoIP-Regeln;
  • auf der Kassenseite setzt FOX die Währung auf die Basiswährung zurück, sodass Summen, Bestellung und Zahlung alle in der Basiswährung erfolgen;
  • jede Bestellung wird in der Basiswährung gespeichert, was Berichte und Buchhaltung in einer Währung hält.

Kunden sollten das wissen, bevor sie den Zahlungsschritt erreichen. Zwei eingebaute Optionen im Reiter Optionen (Options) zeigen den lokalen Betrag neben dem tatsächlichen: Ungefähren Betrag anzeigen (Show approximate amount) fügt den Summen in Warenkorb und Kasse einen Wert (Approx. ...) hinzu, und Ungefähren Preis anzeigen (Show approx. price) tut dasselbe auf Shop- und Produktseiten. Beide verwenden die Währung des Landes des Besuchers aus dem Reiter GeoIP, benötigen also GeoIP-Regeln, und beide werden aus Wechselkursen berechnet, nicht aus Festpreisen. Der Text lässt sich mit dem Filter woocs_get_approximate_amount_text ändern. Ein einfacher Hinweis auf der klassischen Warenkorbseite hilft ebenfalls:

/*
 * Cart notice when the shop is shown in a currency that is not charged.
 * Child theme functions.php or a code snippets plugin.
 */
add_action('woocommerce_before_cart', function () {
    global $WOOCS;
    if (!isset($WOOCS) || $WOOCS->current_currency === $WOOCS->default_currency) {
        return;
    }
    wc_print_notice(
        sprintf(
            'Prices in %s are shown for information. Your order will be charged in %s.',
            esc_html($WOOCS->current_currency),
            esc_html($WOOCS->default_currency)
        ),
        'notice'
    );
});

Die Nebenwirkung: Der Shop bleibt nach der Kasse in der Basiswährung

FOX merkt sich die zuletzt verwendete Währung jedes Besuchers, und das Zurücksetzen auf der Kassenseite ist eine Währungsänderung wie jede andere. Ein Besucher, der die Kasse öffnet und zum Shop zurückgeht, sieht die Basiswährung, und die GeoIP-Regeln bringen die Lokalwährung nicht zurück, weil sie nur beim ersten Besuch greifen. Das Snippet im nächsten Abschnitt merkt sich die Währung des Besuchers vor der Kasse und stellt sie danach wieder her. Bei Mehrere Währungen erlaubt (Is multiple allowed) = Nein (No) verwenden Sie es mit Ihrer Basiswährung in beiden Konfigurationszeilen: Die Kasse verhält sich wie zuvor, und der Besucher bekommt seine Währung zurück, sobald er sie verlässt.

Eine Kassenwährung erzwingen, die nicht die Basiswährung ist

Akzeptiert der Zahlungsanbieter eine andere Währung als die Basiswährung oder nur einige Ihrer Währungen, setzen Sie Mehrere Währungen erlaubt (Is multiple allowed) auf Ja (Yes) und erzwingen die Kassenwährung per Code. Bei Nein (No) würde das Zurücksetzen auf die Basiswährung den Code überstimmen. Das folgende Snippet erzwingt die Kassenwährung nur für Währungen, die der Zahlungsanbieter nicht abbuchen kann, und gibt dem Besucher auf der nächsten Seite außerhalb der Kasse seine eigene Währung zurück:

/*
 * Charge only in currencies the payment gateway accepts.
 * Requires FOX: Advanced tab, Is multiple allowed = Yes.
 * Child theme functions.php or a code snippets plugin.
 */
add_action('template_redirect', function () {
    if (!class_exists('WOOCS') || !function_exists('WC')) {
        return;
    }
    global $WOOCS;

    $accepted = array('USD', 'EUR'); // currencies the gateway can charge
    $fallback = 'USD';               // checkout currency for all other currencies

    // Custom checkout page: is_checkout() || is_page('your-checkout-slug')
    if (is_checkout()) {
        if (!in_array($WOOCS->current_currency, $accepted, true)) {
            $WOOCS->storage->set_val('woocs_before_checkout', $WOOCS->current_currency);
            $WOOCS->set_currency($fallback);
            if (WC()->cart) {
                WC()->cart->calculate_totals();
            }
        }
        return;
    }

    // Outside checkout: restore the currency the visitor had before
    $previous = $WOOCS->storage->get_val('woocs_before_checkout');
    if (!empty($previous)) {
        $WOOCS->storage->set_val('woocs_before_checkout', '');
        $WOOCS->set_currency($previous);
    }
}, 1);

Um eine Währung für alle zu erzwingen, tragen Sie in $accepted nur diese Währung ein und verwenden sie auch als $fallback. Zu prüfen ist:

  • Eigene Kassenseiten. is_checkout() ist wahr auf der Seite, die in WooCommerce → Einstellungen → Erweitert als Kasse festgelegt ist, und auf Seiten mit dem Checkout-Shortcode. Eine Kasse, die ein Funnel- oder Checkout-Plugin baut, ist möglicherweise keines von beiden; fügen Sie die Bedingung is_page() aus dem Kommentar hinzu.
  • Kasse nach GeoIP-Regeln (Checkout by GeoIP rules) muss ausgeschaltet sein. Diese Option im Reiter Erweitert (Advanced) schaltet die Kasse auf die Währung des Landes des Besuchers um und überstimmt die erzwungene Währung.
  • Gecachte Shopseiten. Die Wiederherstellung läuft, wenn WordPress eine Seite erzeugt; hinter einem Seiten-Cache geschieht sie daher erst bei der ersten Seite, die nicht aus dem Cache kommt.

Die einfacheren Einzeiler-Versionen dieses Codes in unserer FAQ Eine Währung auf der Kassenseite erzwingen erzwingen die Währung ohne die Wiederherstellung.

Die Währung nach Zahlungsart umschalten

FOX kann auf einen Klick auf eine Zahlungsart nicht von selbst reagieren: In der klassischen Kasse lädt die Wahl einer Zahlungsart nichts neu. Die beiden folgenden Snippets lassen WooCommerce die Bestellübersicht aktualisieren, wenn sich die Zahlungsart ändert, und schalten bei dieser Aktualisierung die Währung um. Sie funktionieren mit der Kasse über den Shortcode [woocommerce_checkout], nicht mit dem Checkout-Block, und erfordern Mehrere Währungen erlaubt (Is multiple allowed) = Ja (Yes). Die ID einer Zahlungsart ist der Wert ihres Radiobuttons auf der Kassenseite, zum Beispiel bacs für Direkte Banküberweisung.

/*
 * Classic checkout: change currency when a payment method is chosen.
 * Child theme functions.php.
 */
add_action('woocommerce_checkout_update_order_review', function ($post_data) {
    if (!class_exists('WOOCS')) {
        return;
    }
    global $WOOCS;
    parse_str($post_data, $data);

    $currency_by_method = array(
        'bacs'   => 'EUR', // payment method ID => currency it charges in
        'stripe' => 'USD',
    );

    $method = isset($data['payment_method']) ? $data['payment_method'] : '';
    if (isset($currency_by_method[$method]) && $WOOCS->current_currency !== $currency_by_method[$method]) {
        if (!$WOOCS->storage->get_val('woocs_before_checkout')) {
            $WOOCS->storage->set_val('woocs_before_checkout', $WOOCS->current_currency);
        }
        $WOOCS->set_currency($currency_by_method[$method]);
    }
});

add_action('wp_footer', function () {
    if (!is_checkout()) {
        return;
    }
    ?>
    <script>
    jQuery(function ($) {
        $(document.body).on('payment_method_selected', function () {
            $(document.body).trigger('update_checkout');
        });
    });
    </script>
    <?php
});

Die Gegenrichtung ist eingebaut und braucht keinen Code: Der Reiter Zahlungen (Payments) blendet jeden Zahlungsanbieter für gewählte Währungen aus oder ein (Zahlungsregeln (Payments rules) und Zahlungsverhalten (Payments behavior)), sodass ein Anbieter nur in Währungen angeboten wird, die er abbuchen kann. Siehe Zahlungsanbieter nach Währung ausblenden.

Kunden in der gewählten Währung zahlen lassen

Die umgekehrte Einrichtung ist Mehrere Währungen erlaubt (Is multiple allowed) = Ja (Yes) ohne jeden Erzwingungscode. Die Kasse behält die Währung des Besuchers, die Bestellung wird zusammen mit dem Wechselkurs dieses Moments in ihr gespeichert, und der Zahlungsanbieter soll diese Währung abbuchen. Ihr Code kann die Einstellung als $WOOCS->is_multiple_allowed lesen.

Kasse oder Warenkorb springt zurück auf die Basiswährung

  • Mehrere Währungen erlaubt (Is multiple allowed) steht noch auf Nein (No). In den meisten Fällen ist das die Ursache; die Währung wechselt nach der Kasse zurück erklärt die Standardeinstellung.
  • Kasse nach GeoIP-Regeln (Checkout by GeoIP rules) ist eingeschaltet, und das Land des Besuchers gehört zu einer anderen Währung.
  • Code im Theme oder in einem Snippet ruft $WOOCS->set_currency() auf der Kassenseite auf. Suchen Sie danach, auch nach alten Versionen der obigen Snippets.
  • Auf Seiten deaktivieren (Disable on pages) im Reiter Optionen (Options) schaltet FOX für das Stammverzeichnis der Website ab. WooCommerce sendet Kassenaktualisierungen an die Stammadresse (/?wc-ajax=update_order_review), sodass die Bestellübersicht ohne FOX neu berechnet wird und einen Moment nach dem Laden der Seite die Basiswährung zeigt.
  • Die Warenkorb- oder Kassenseite ist gecacht und zeigt daher die Währung desjenigen, der sie zuerst geladen hat. Nehmen Sie beide von jedem Cache aus.

Der Zahlungsanbieter muss jede Kassenwährung akzeptieren

FOX übergibt dem Zahlungsanbieter die Währung der Bestellung; ob die Zahlung gelingt, hängt vom Konto beim Anbieter ab. PayPal und Stripe akzeptieren viele Zahlungswährungen, aber jeder hat seine eigene Liste, und eine Auszahlung in einer anderen Währung rechnet der Anbieter zu seinem eigenen Kurs und mit seinen Gebühren um. Prüfen Sie die Listen, für PayPal unter akzeptierte PayPal-Währungen, und nutzen Sie den Reiter Zahlungen (Payments), damit eine Währung nie bei einem Anbieter ankommt, der sie nicht abbuchen kann. Ein Anbieter mit nur einer Währung, häufig bei lokalen Anbietern, muss eine der oben beschriebenen Erzwingungs-Einrichtungen verwenden.

Eine Zahlung in Fremdwährung sicher testen

FOX hat keinen eigenen Zahlungstestmodus; nutzen Sie die Sandbox oder den Testmodus des Zahlungsanbieters. Geben Sie eine Testbestellung in jeder Währung auf, die Sie akzeptieren, und vergleichen Sie dann drei Stellen: die Bestellwährung (Order currency) in der FOX-Box auf dem Bestellbildschirm, den Betrag im Test-Dashboard des Zahlungsanbieters und die Bestell-E-Mail. Alle drei sollten dieselbe Währung und denselben Betrag zeigen.

Was Bestellungen in mehreren Währungen für das Backend bedeuten

Bestellungen, Erstattungen und Bestell-E-Mails erfolgen in der Währung des Kunden, und WooCommerce-Berichte rechnen sie nicht von selbst in eine Währung um. Jede Bestellung behält ihren Bestellwährungskurs (Order currency rate), auf dem die Anleitungen zu Multi-Currency-Analytics und wo die Bestellwährung gespeichert ist aufbauen. Eine spätere Änderung von Mehrere Währungen erlaubt (Is multiple allowed) rechnet bestehende Bestellungen nicht um; eine einzelne Bestellung lässt sich mit Bestellwährung ändern (Change order currency) und Bestellung neu berechnen (Recalculate order) in der FOX-Box auf dem Bestellbildschirm umrechnen, was den Bestelldatensatz ändert, nicht die bereits erfolgte Zahlung.

Welche Einrichtung die richtige ist

Ihre SituationEinrichtung
Der Zahlungsanbieter bucht nur in der Basiswährung abMehrere Währungen erlaubt (Is multiple allowed) = Nein (No), ungefähre Beträge an, optional das Wiederherstellungs-Snippet
Der Zahlungsanbieter bucht in einer Währung ab, die nicht die Basiswährung istJa (Yes) + Erzwingungs-Snippet mit einer akzeptierten Währung
Der Zahlungsanbieter akzeptiert einige Ihrer WährungenJa (Yes) + Erzwingungs-Snippet mit der Liste der akzeptierten Währungen
Unterschiedliche Zahlungsanbieter für unterschiedliche WährungenJa (Yes) + Regeln im Reiter Zahlungen (Payments) oder das Zahlungsart-Snippet
Jede Währung kann abgebucht werdenJa (Yes), kein Code

Zeigt die Kasse immer noch eine unerwartete Währung, testen Sie mit einem Standard-Theme und nur WooCommerce und FOX aktiv und eröffnen Sie dann ein Thema im FOX-Supportforum mit Ihrer Einstellung für Mehrere Währungen erlaubt (Is multiple allowed), dem Kassentyp (Shortcode oder Block) und jedem Währungscode, den Sie verwenden, und wir sehen es uns an.