FOX - WooCommerce Currency Switcher Professional

WooCommerce Versandkosten in der falschen Währung: Ursachen und Lösungen

Versandkosten in der falschen Währung zeigen sich in WooCommerce auf dreierlei Weise, nachdem ein Besucher die Währung gewechselt hat: Das Symbol ändert sich, die Zahl bleibt gleich; die Kosten werden doppelt umgerechnet und fallen viel zu hoch oder zu niedrig aus; oder der Versand sinkt auf null oder verschwindet. Die Produktpreise sind dabei meist in Ordnung, denn die Ursache liegt darin, woher die Versandkosten kommen. Im Folgenden erfahren Sie, wie FOX den Versand umrechnet, wie Sie die drei Fälle mit einem einzigen Test unterscheiden und wie Sie Pauschalen, Versanddienstleister-Plugins und feste Beträge pro Währung korrekt einrichten.

So rechnet FOX Versandkosten um

WooCommerce geht davon aus, dass jeder gespeicherte Betrag in der Basiswährung vorliegt, auch die Versandkosten. Versandarten erstellen ihre Tarife, WooCommerce reicht die Liste durch den Filter woocommerce_package_rates, und FOX rechnet sie dort mit Priorität 9999 um: Die Kosten jedes Tarifs und die darauf entfallenden Steuern werden mit dem Wechselkurs der gewählten Währung multipliziert und auf die Dezimalstellen dieser Währung gerundet.

  • Diese Umrechnung läuft nur mit Mehrfach erlaubt (Is multiple allowed) = Ja (Yes) im Tab Erweitert (Advanced) der FOX-Einstellungen, dem Modus, in dem Kunden in der von ihnen gewählten Währung bezahlen.
  • Mit Mehrfach erlaubt (Is multiple allowed) = Nein (No) bleiben die Tarife in der Basiswährung. Der Warenkorb zeigt sie zur Information umgerechnet an, und der Checkout berechnet alles in der Basiswährung neu – das ist der Betrag, den der Kunde zahlt. Diese Konstellation wird unter Lokale Währung anzeigen, in Basiswährung abrechnen erklärt.
  • Formeln im Kostenfeld der Pauschale (Flat rate), etwa [qty] * 2 oder [fee percent="10" min_fee="5"], werden mit dem in die Basiswährung zurückgerechneten Warenkorbtotal ausgewertet. Prozentwerte und Mindestgebühren funktionieren also in Basiswährung, und das Ergebnis wird anschließend wie die übrigen Tarife umgerechnet.

Daraus folgt eine Regel: Alles, was vor Priorität 9999 in woocommerce_package_rates ankommt, muss in der Basiswährung vorliegen. Ein Betrag, der bereits in der Währung des Besuchers vorliegt, wird ein zweites Mal umgerechnet; ein Betrag, den ein Plugin setzt, nachdem FOX fertig ist, wird gar nicht umgerechnet.

Versandkosten in der falschen Währung: Welcher Fall liegt vor?

Nehmen Sie eine Versandart mit bekannten Kosten in der Basiswährung, zum Beispiel 10,00 USD, und eine Währung mit bekanntem Kurs, zum Beispiel EUR mit 0,92 in der FOX-Währungstabelle. Wechseln Sie zu EUR, ändern Sie einmal die Menge im Warenkorb (WooCommerce hält berechnete Tarife in der Session und verwendet sie weiter, bis sich Warenkorb oder Adresse ändern) und vergleichen Sie:

Versand in EURBedeutung
9,20 €Korrekt umgerechnet
10,00 €Nicht umgerechnet: Der Tarif wurde nach FOX gesetzt oder von einem Plugin, das die WooCommerce-Tarife umgeht
8,46 €Doppelt umgerechnet: Das Plugin hat bereits 9,20 in EUR geliefert, und FOX hat es erneut multipliziert
Ein anderer BetragDer Versanddienstleister hat einen Preis in der Währung seines eigenen Kontos geliefert, der als Basiswährung behandelt wurde
0,00 € oder keine VersandartenEin Kurs von 0 für diese Währung oder ein Währungscode, den der Versanddienstleister nicht erkennt

Beim Testen schaltet die Option Debug-Modus (Debug mode) unter WooCommerce → Einstellungen → Versand den Cache der Versandtarife ab, sodass bei jedem Seitenaufruf frische Tarife berechnet werden. Schalten Sie sie danach wieder aus.

Einen exakten Versandpreis pro Währung festlegen

Die Umrechnung per Wechselkurs liefert Beträge wie 9,20 € oder 1.486 ₹. Möchten Sie runde Zahlen, ein anderes Preisniveau je Markt (18 € für Europa, 32 $ für den Rest der Welt) oder Versandkosten, die einem Aufschlag auf den Wechselkurs nicht folgen sollen, legen Sie den Betrag stattdessen pro Währung fest:

  1. Setzen Sie im Tab Erweitert (Advanced) der FOX-Einstellungen Mehrfach erlaubt (Is multiple allowed) auf Ja (Yes). Die Option Individueller Festbetrag für den Versand (Individual fixed amount for shipping) ist erst sichtbar, wenn Sie das getan haben.
  2. Schalten Sie Individueller Festbetrag für den Versand (Individual fixed amount for shipping) ein und speichern Sie.
  3. Öffnen Sie WooCommerce → Einstellungen → Versand, eine Versandzone und bearbeiten Sie deren Versandart Pauschale (Flat rate). Unterhalb der WooCommerce-Felder gibt es nun für jede Währung außer der Basiswährung ein Feld Fixkosten (Fixed cost), zum Beispiel Fixkosten EUR (Fixed cost EUR).
  4. Geben Sie den Betrag in dieser Währung ein. Ein leeres Feld (Platzhalter auto) bedeutet „per Wechselkurs umrechnen“.

Ein fester Betrag ersetzt die gesamten umgerechneten Kosten dieser Pauschale, einschließlich etwaiger Versandklassenkosten oder des Formelergebnisses, und die Versandsteuer wird daraus neu berechnet. Verwendet werden nur Beträge größer als 0: Eine 0 gilt als leer; für kostenlose Lieferung in einer Währung nutzen Sie daher eine Versandart Kostenloser Versand (Free shipping). Dieselbe Option fügt den Versandarten Kostenloser Versand (Free shipping) Felder Mindestbestellwert in EUR (Minimum order amount in EUR) hinzu, sodass sich auch die Grenze für kostenlosen Versand pro Währung festlegen lässt; ohne diese Felder vergleicht FOX die in die Basiswährung zurückgerechnete Warenkorb-Zwischensumme mit dem Mindestbetrag in Basiswährung.

Die Felder gibt es nur für die WooCommerce-eigenen Versandarten Pauschale (Flat rate) und Kostenloser Versand (Free shipping). Tabellenbasierte Versandplugins und Tarife von Versanddienstleistern werden immer per Wechselkurs umgerechnet. Sehen Sie die Felder nicht, prüfen Sie, ob die Option nach dem Speichern noch eingeschaltet ist und ob sich das Einstellungsfenster der Versandart ohne JavaScript-Fehler in der Browser-Konsole öffnet.

Wenn Sie umgerechnete Kosten lediglich ordentlicher darstellen möchten, ist ein Rundungsfilter das bessere Werkzeug; Umgerechnete Preise runden enthält einen für den Versand, der nach der FOX-Umrechnung läuft.

Plugins von Versanddienstleistern, die Tarife in einer anderen Währung liefern

Plugins für UPS, DHL, FedEx, Printful, Easyship und lokale Lieferdienste fragen die API des Versanddienstleisters nach einem Live-Preis. Die API antwortet in der Währung, in der gefragt wurde, oder in der Währung des Kontos beim Versanddienstleister. Viele dieser Plugins fragen mit get_woocommerce_currency() nach „der Shop-Währung“, und FOX beantwortet diese Funktion mit der Währung des Besuchers, sodass die API beispielsweise 9,20 EUR zurückgibt. Das Plugin übergibt 9,20 an WooCommerce, als wären es Dollar, und FOX rechnet es erneut um. Manche Plugins vergleichen die Kontowährung mit der Shop-Währung und liefern gar keine Tarife, wenn beide abweichen.

Es gibt drei Wege zur Lösung, vom saubersten zum allgemeinsten:

  1. Das Plugin die Basiswährung anfragen lassen. Suchen Sie im Versanddienstleister-Plugin nach einer Währungseinstellung. Gibt es keine, lässt sich seine Anfrage so ändern, dass sie $WOOCS->default_currency verwendet; das ist die Lösung für Printful.
  2. Eine fertige Anpassung verwenden. Fertigen Code gibt es für UPS Shipping Method, das offizielle UPS-Plugin, DHL Express Commerce, Printful, Easyship, Aramex und Ingrid. Packeta rechnet seine Tarife selbst über FOX um und braucht keinen Code, solange es aktuell ist. Änderungen in den Dateien eines anderen Plugins gehen bei dessen Update verloren; notieren Sie sie sich daher.
  3. Die Tarife in die Basiswährung zurückrechnen, bevor FOX sie umrechnet. Das funktioniert für jeden Versanddienstleister und übersteht Plugin-Updates.
/*
 * Carrier rates that arrive in a currency other than the base currency:
 * turn them back into the base currency before FOX converts all rates (priority 9999).
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woocommerce_package_rates', function ($rates, $package) {
    if (!class_exists('WOOCS')) {
        return $rates;
    }
    global $WOOCS;

    $methods       = array('ups'); // method IDs of the carrier plugins (see below)
    $rate_currency = $WOOCS->current_currency;  // or a fixed code, e.g. 'GBP' for the account currency

    $currencies = $WOOCS->get_currencies();
    if ($rate_currency === $WOOCS->default_currency || empty($currencies[$rate_currency]['rate'])) {
        return $rates;
    }
    $factor = (float) $currencies[$rate_currency]['rate'];

    foreach ($rates as $rate) {
        if (!in_array($rate->get_method_id(), $methods, true)) {
            continue;
        }
        $rate->set_cost((float) $rate->get_cost() / $factor);

        $taxes = $rate->get_taxes();
        if (!empty($taxes)) {
            foreach ($taxes as $key => $tax) {
                $taxes[$key] = (float) $tax / $factor;
            }
            $rate->set_taxes($taxes);
        }
    }
    return $rates;
}, 100, 2);

Um eine Methoden-ID zu finden, untersuchen Sie den Radiobutton der Versandart auf der Warenkorbseite: Sein Wert sieht aus wie ups:4:03 oder flat_rate:2, und der Teil vor dem ersten Doppelpunkt ist in der Regel die Methoden-ID. Belassen Sie $rate_currency bei der Währung des Besuchers, wenn der Versanddienstleister in der Währung anbietet, in der er gefragt wird; legen Sie einen festen Code fest, wenn er immer in der Kontowährung anbietet. Diese Währung muss in der FOX-Währungstabelle mit aktuellem Kurs vorhanden sein, sonst lässt der Code die Tarife unverändert. Dasselbe Snippet beantwortet auch die Frage „Versand für diese Methode nicht umrechnen“: Der von der Methode gelieferte Betrag wird dann in jeder Währung unverändert angezeigt.

Versand, der gar nicht umgerechnet wird

Bleibt die Zahl gleich und ändert sich nur das Symbol, hat der Betrag die FOX-Umrechnung nie durchlaufen. Typische Gründe:

  • Das Plugin ändert seine Tarife in einem eigenen woocommerce_package_rates-Callback mit einer Priorität über 9999, nachdem FOX sie umgerechnet hat.
  • Der Preis wird vom Checkout-Widget des Plugins gesetzt oder als Warenkorbgebühr statt als Versandtarif hinzugefügt.
  • Regeln im Versandplugin vergleichen den Warenkorbwert mit Schwellenwerten, die in der Basiswährung eingegeben wurden; auf dem Warenkorbwert basierende Regeln wählen in anderen Währungen daher die falsche Stufe.

Hier ist eine Änderung auf Seiten des Plugins nötig: Es muss seine Beträge mit apply_filters('woocs_exchange_value', $amount) durch FOX leiten, beschrieben auf der Seite woocs_exchange_value, oder Werte in Basiswährung vergleichen. Fragen Sie die Autoren des Plugins, oder sehen Sie in FOX Labs nach Anpassungen für andere Plugins.

Der Versand wird nach dem Währungswechsel null oder verschwindet

  • Ein Kurs von 0. FOX multipliziert die Versandkosten mit dem Kurs der Währung; ein als 0 gespeicherter Kurs macht daher jeden Tarif in dieser Währung kostenlos. Das passiert, wenn ein Aggregator keine Daten liefert, oft nachdem die Basiswährung geändert wurde. Prüfen Sie die Spalte Kurs (Rate) im Tab Währungen (Currencies); die Ursachen behandelt Wechselkurse werden nicht aktualisiert.
  • Ein Währungscode, den der Versanddienstleister nicht kennt. Die APIs der Versanddienstleister arbeiten mit ISO-Codes; eine als UK statt GBP hinzugefügte Währung liefert daher keine Tarife, und der Checkout zeigt keine Versandarten an. Verwenden Sie für jede Währung, die ein Versanddienstleister oder Zahlungs-Gateway sieht, den echten ISO-Code; Benutzerdefinierte Währungscodes erklärt, wann ein Nicht-ISO-Code unbedenklich ist.
  • Der Versanddienstleister lehnt die Währung ab. Manche Versanddienstleister-Plugins liefern Tarife nur, wenn die Shop-Währung der Kontowährung entspricht. Nutzen Sie eine der drei Lösungen im Abschnitt zu den Versanddienstleistern oben.

Checkliste

  • Mehrfach erlaubt (Is multiple allowed) ist wie gewünscht gesetzt: Ja (Yes), um in der Währung des Besuchers abzurechnen, Nein (No), um in der Basiswährung abzurechnen.
  • Jede Währung hat einen Kurs ungleich null und einen echten ISO-Code.
  • Pauschalen, die exakte Beträge benötigen, haben Fixkosten (Fixed cost)-Werte für jede Währung, mit eingeschalteter Option Individueller Festbetrag für den Versand (Individual fixed amount for shipping).
  • Plugins von Versanddienstleistern fragen die Basiswährung an, nutzen ihre Anpassung oder werden vom Snippet zur Rückrechnung abgedeckt.
  • In einem privaten Fenster getestet, mit geändertem Warenkorb oder eingeschaltetem Versand-Debug-Modus (Debug mode), in jeder Währung.

Ist eine Versandart in einer Währung weiterhin falsch, eröffnen Sie im FOX-Support-Forum ein Thema mit dem Namen des Versandplugins, Ihrer Einstellung für Mehrfach erlaubt (Is multiple allowed) und den Kosten, die Sie in der Basiswährung und in der anderen Währung sehen, und wir sehen es uns an.