WooCommerce doppelte Währungsumrechnung: Warum Warenkorbpreise zu hoch sind
Eine doppelte Währungsumrechnung in WooCommerce zeigt sich immer gleich: Die Produktseite nennt CAD 218, der Warenkorb CAD 304. Der Preis wurde zweimal mit dem Wechselkurs multipliziert. FOX rechnet einen Preis nur einmal um, eine zweite Umrechnung bedeutet also immer eine zweite Instanz in der Kette: ein anderes Plugin, das Theme, eigenen Code oder eine Einstellung, die den Kurs aufbläht. Diese Anleitung erklärt, wie es zur zweiten Umrechnung kommt, wie Sie sie von einem schlicht falschen Kurs unterscheiden, wie Sie das verantwortliche Plugin finden und wie Entwickler ihren eigenen Code korrigieren.
Wie ein Preis doppelt umgerechnet wird
Ist Mehrere erlaubt (Is multiple allowed) auf Ja gesetzt (Tab Erweitert (Advanced) unter WooCommerce → Einstellungen → Währung), bezahlen Kunden in der von ihnen gewählten Währung, und FOX rechnet den Produktpreis an der Quelle um: Jedes Mal, wenn Code $product->get_price() aufruft, erhält er den Betrag in der gewählten Währung. Das ist korrekt, solange Code Preise nur liest.
Probleme beginnen bei Plugins, die einen Preis lesen, ändern und zurückschreiben. Produktoptionen und Add-ons, dynamische Rabatte, B2B- und Großhandelspreise, Buchungen, Abonnements, Multi-Lager-Bestände und ähnliche Plugins tun das im Warenkorb oft: Sie rufen get_price() auf, das für ein Produkt zu 157 USD bereits 218 CAD zurückgibt, addieren ihren Anteil und speichern das Ergebnis mit set_price(). WooCommerce behält die Zahl, die es erhält, als Preis dieser Warenkorbposition. Liest der Warenkorb den Preis erneut, rechnet FOX 218 um, als wären es USD, und der Warenkorb zeigt 304. Die Produktseite durchläuft diesen Schritt nie, deshalb bleibt sie korrekt.
Weitere Wege zum selben Ergebnis:
- Zwei Währungsumrechner. Die eigene Multi-Currency-Funktion von WooCommerce (Teil von WooPayments), ein Theme mit eingebauter Währungsauswahl oder ein zweites Währungs-Plugin rechnet den Preis ebenfalls um. Nur eines davon darf aktiv sein.
- Preisfunktionen des Themes. Ein Theme, das Preis-Zeichenketten selbst zusammensetzt, zum Beispiel für Preisspannen variabler Produkte, kann einen umgerechneten Wert erneut anwenden.
- Ihr eigener Code, der Warenkorbpreise setzt oder Beträge umrechnet, die FOX bereits umgerechnet hat.
Bei Mehrere erlaubt (Is multiple allowed) auf Nein bleiben die Preise intern in der Basiswährung, und FOX rechnet nur um, was angezeigt wird. Verschwindet eine doppelte Umrechnung in diesem Modus, deutet das deshalb direkt auf ein Plugin hin, das Preise zurückschreibt.
Doppelte Umrechnung oder falscher Kurs? Das Verhältnis prüfen
Teilen Sie den falschen Preis durch den richtigen und vergleichen Sie das Ergebnis mit dem Kurs der Währung im Tab Währungen (Currencies).
| Was Sie sehen | Worauf es hindeutet |
|---|---|
| Produktseite richtig, Warenkorb oder Kasse zu hoch; falsch ÷ richtig entspricht dem Kurs | Doppelte Umrechnung durch ein Plugin, das Theme oder eigenen Code |
| Nur bei einigen Produkten falsch (variabel, mit Optionen, buchbar) | Das Plugin, das diese Produkte verarbeitet |
| Jede Seite in einer Währung zu hoch, Produktseite eingeschlossen | Der Kurs oder der Zinswert dieser Währung, keine doppelte Umrechnung |
| Preise auf der Website richtig, in der Bestell-E-Mail oder auf der Zahlungsseite erneut multipliziert | Eine eigene Währungsumrechnung des Zahlungs-Gateways |
Das gegenteilige Symptom, ein Preis, der sich beim Umschalten der Währung gar nicht ändert, hat andere Ursachen; siehe Währungsumschalter ändert Preise nicht.
Zuerst die Einstellungen ausschließen
- Zins. Das Feld nach dem
+in der Spalte Kurs+% (Rate+%) addiert einen Betrag zum Kurs. Eine reine Zahl wird unverändert addiert: In einem in Pakistanischen Rupien bepreisten Shop macht5aus dem USD-Kurs von 0.0036 den Kurs 5.0036, wodurch jeder Preis in dieser Währung etwa 1.400-mal höher ausfällt. Für einen Prozentsatz schreiben Sie ihn mit dem Zeichen, zum Beispiel3%. - Der Kurs selbst. Klicken Sie auf die Aktualisieren-Schaltfläche neben dem Kurs und vergleichen Sie ihn mit einer Referenz. Liefert der Aggregator Unsinn, wechseln Sie ihn; siehe Wechselkurse werden nicht aktualisiert.
- Die Basiswährung. Die als Basis markierte Zeile muss den Kurs 1 und keinen Zins haben, und die Produktpreise müssen in dieser Währung eingegeben sein. Ein Shop, dessen Preise in USD sind, während die Basis von FOX EUR ist, liegt in jeder Währung um einen konstanten Faktor daneben.
Das Plugin finden, das erneut umrechnet
Arbeiten Sie in einer Staging-Kopie der Website, nicht im Live-Shop, und verwenden Sie für alle Tests ein Produkt und eine Währung, die nicht die Basiswährung ist.
- Notieren Sie den Preis auf der Produktseite und im Warenkorb in dieser Währung.
- Stellen Sie Mehrere erlaubt (Is multiple allowed) auf Nein, speichern Sie, leeren Sie den Warenkorb und legen Sie das Produkt erneut hinein. Ist der Warenkorb jetzt richtig, schreibt ein Plugin Preise zurück. Stellen Sie die Einstellung für die weiteren Schritte wieder auf Ja.
- Deaktivieren Sie alle Plugins außer WooCommerce und FOX und wechseln Sie zu einem Standard-Theme wie Storefront. Leeren Sie den Warenkorb und testen Sie. Der Warenkorb sollte jetzt zur Produktseite passen.
- Aktivieren Sie die Plugins einzeln wieder, beginnend mit allem, was Preise anfasst: Produktoptionen, Rabatte, Großhandel, Buchungen, Abonnements, Lagerverwaltung. Leeren Sie nach jedem den Warenkorb und legen Sie das Produkt erneut hinein: Manche Plugins speichern ihren Preis beim Hinzufügen in der Warenkorbposition.
- Wird der Warenkorb falsch, ist das soeben aktivierte Plugin der Verursacher. Schalten Sie das Theme zuletzt zurück, um auch dieses zu prüfen.
Seiten-Caches und der Browser-Speicher können einen alten Warenkorb anzeigen. Leeren Sie sie oder testen Sie in einem privaten Fenster, bevor Sie aus einem Schritt Schlüsse ziehen.
Die Lösung: Anpassungen, Einstellungen und Code
Der Verursacher ist ein Plugin eines Drittanbieters
Für viele beliebte Preis-Plugins gibt es bereits eine Anpassung; suchen Sie Ihres in der Kompatibilitätsliste und wenden Sie den veröffentlichten Code an. Ist es dort nicht aufgeführt, nimmt FOX Labs Anpassungswünsche für weit verbreitete Plugins entgegen. Zwei weitere Möglichkeiten: Prüfen Sie, ob das Plugin eine Einstellung für Multi-Currency-Shops oder eine eigene Umrechnung hat, die Sie abschalten können, oder stellen Sie Mehrere erlaubt (Is multiple allowed) auf Nein, sodass Kunden Preise in ihrer Währung sehen und in der Basiswährung bezahlen; Lokale Preise anzeigen, aber in der Basiswährung abrechnen erklärt, was sich für Kunden ändert.
Der Verursacher ist Ihr eigener Code
Die Regel ist einfach: get_price() liefert Ihnen die gewählte Währung, set_price() muss die Basiswährung erhalten. Rechnen Sie das Ergebnis vor dem Speichern mit dem Filter woocs_back_convert_price zurück:
/*
* Custom cart prices on a FOX shop with "Is multiple allowed" = Yes.
* Child theme functions.php or a code snippets plugin.
*/
add_action('woocommerce_before_calculate_totals', function ($cart) {
if (is_admin() && !wp_doing_ajax()) {
return;
}
if (did_action('woocommerce_before_calculate_totals') >= 2) {
return; // run once per request, or the change is applied again
}
foreach ($cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$price = (float) $product->get_price(); // already in the selected currency
$price = $price * 1.10; // your logic, for example +10 %
// back to the base currency, so FOX converts it only once;
// with "Is multiple allowed" = No the value passes through unchanged
$product->set_price(apply_filters('woocs_back_convert_price', $price, true));
}
}, 20);
Weil es ein Filter ist, funktioniert der Code weiter, wenn FOX deaktiviert wird: Der Wert wird unverändert durchgereicht. Feste Beträge in Ihrer Logik (eine Gebühr von 5.00, ein Aufschlag) sind Beträge in Basiswährung; addieren Sie sie nach der Rückrechnung, nicht davor.
Berechnet Ihr Code einen Preis, der in der gewählten Währung bereits final ist, zum Beispiel aus einer eigenen Preistabelle je Währung, teilen Sie FOX mit woocs_skip_conversion mit, dass es ihn nicht anfassen soll. FOX ruft diesen Filter auf, bevor es einen Produktpreis umrechnet; gibt er true zurück, bleibt dieser Preis unverändert:
/*
* Mark cart products whose price you set in the selected currency,
* for example inside woocommerce_before_calculate_totals:
* $product->set_price($final_price);
* $product->update_meta_data('_price_is_final', 'yes'); // kept in memory, the product is not saved
*/
add_filter('woocs_skip_conversion', function ($skip, $price, $product) {
if ($product instanceof WC_Product && $product->get_meta('_price_is_final') === 'yes') {
return true;
}
return $skip;
}, 10, 3);
Der Filter erhält das Produkt nur, wenn Mehrere erlaubt (Is multiple allowed) auf Ja gesetzt ist – dem Modus, in dem dieses Problem auftritt.
Wenn der Warenkorb weiterhin falsch ist
- Testen Sie jedes Mal mit einem frischen Warenkorb. Eine alte Warenkorbposition kann einen Preis tragen, den ein Plugin beim Hinzufügen gespeichert hat.
- Prüfen Sie, dass nur ein Währungsumrechner aktiv ist, einschließlich der Multi-Currency-Funktion von WooCommerce und im Theme eingebauter Währungsauswahlen.
- Ist der Warenkorb richtig und nur die Kassensumme oder die Bestellung falsch, sehen Sie sich Plugins für Gebühren, Versand und Zahlung an, die der Summe eigene Beträge hinzufügen.
- Vergleichen Sie mit der kurzen Checkliste unter Preis auf der Kassenseite doppelt umgerechnet, wenn das Problem nur an der Kasse auftritt.
Weist die Eingrenzung auf ein Plugin ohne vorhandene Anpassung, posten Sie seinen Namen, die Version und den Produkttyp, bei dem es schiefgeht, im FOX-Support-Forum.