WooCommerce: Währung nach Sprache ändern – Polylang, TranslatePress
Um die Währung in WooCommerce nach Sprache zu ändern, braucht FOX ein paar Zeilen Code: Es gibt keine Einstellung, die eine Währung an eine Sprache bindet, denn die Sprache gehört zu Polylang, TranslatePress, Weglot oder GTranslate, nicht zum Währungsumschalter. Der Code ist kurz, und die im Umlauf befindlichen Snippets funktionieren, bringen aber drei Überraschungen mit: Besucher können keine andere Währung mehr wählen, gecachte Seiten springen auf die alte Währung zurück, und Übersetzer, die im Browser arbeiten, erreichen den Code gar nicht. Unten finden Sie zwei Muster, eines, das die Währung dauerhaft an die Sprache bindet, und eines, das sie nur beim Sprachwechsel umstellt, sowie das passende Vorgehen für jedes Übersetzungs-Plugin.
Die aktuelle Sprache in PHP auslesen
Jedes Muster beginnt mit der Sprache der aktuellen Seite. Jedes Übersetzungs-Plugin stellt sie anders bereit:
| Plugin | Aktuelle Sprache in PHP | Beispielwert |
|---|---|---|
| Polylang | pll_current_language() | de |
| TranslatePress | global $TRP_LANGUAGE; | de_DE |
| Weglot | weglot_get_current_language() | de |
| WPML | apply_filters( 'wpml_current_language', null ) | de |
| Polylang, TranslatePress (Alternative) | get_locale() | de_DE |
Der Wert muss exakt zu Ihrem Code passen, einschließlich Groß- und Kleinschreibung und Trennzeichen: en_US, nicht en-US oder en-us. Wenn eine Sprache „nichts bewirkt“, geben Sie den Wert einmal aus (zum Beispiel in einem HTML-Kommentar im Footer) und kopieren ihn von dort. Für jedes andere Plugin suchen Sie in dessen Dokumentation nach der Funktion, die die aktuelle Sprache zurückgibt; hat es keine, nutzen Sie das JavaScript-Muster unten, das nur das Attribut lang der Seite braucht. Nutzer von WPML können auch Währung mit der Sprache in WPML wechseln folgen. WooCommerce Multilingual hat einen eigenen Multiwährungsmodus: Lassen Sie ihn ausgeschaltet, wenn FOX die Währungen übernimmt.
Muster 1: Die Währung folgt immer der Sprache
Nutzen Sie dies, wenn jede Sprache für einen Markt steht: deutsche Seiten immer in Euro, die englischen US-Seiten immer in Dollar. Der Code setzt die Währung bei jedem Seitenaufruf und überschreibt damit den Umschalter, die Willkommenswährung und die GeoIP-Regeln.
/*
* FOX: the currency always follows the language.
* Child theme functions.php or a code snippets plugin.
*/
add_action( 'template_redirect', function () {
if ( ! class_exists( 'WOOCS' ) ) {
return;
}
global $WOOCS;
// Language => currency. Use the values your plugin returns (see the table).
$map = array(
'en' => 'USD',
'de' => 'EUR',
'fr' => 'EUR',
'bg' => 'BGN',
);
// Polylang. For another plugin, replace this line with its function.
$lang = function_exists( 'pll_current_language' ) ? pll_current_language() : '';
if ( isset( $map[ $lang ] ) ) {
$WOOCS->set_currency( $map[ $lang ] );
// Tells FOX's script that this page was built in this currency (needed with page cache).
$_GET['currency'] = $map[ $lang ];
}
} );
Warum es so geschrieben ist:
template_redirect, nichtwp_head. Der Hook läuft, bevor das Theme etwas ausgibt, sodass Kopfbereich, Menüs und Mini-Warenkörbe bereits die Währung der Sprache erhalten, und er läuft nicht bei AJAX-Anfragen, bei denen die Sprache oft unbekannt ist. Ältere Snippets aufwp_headfunktionieren in den meisten Themes, aber alles, was die Währung früher liest, etwa ein Warenkorb im Header, der vorwp_headaufgebaut wird, bekommt weiterhin die alte.- Die Zeile
$_GET['currency']. In einem Shop mit Cache zeichnet FOX die Preise nach dem Laden in der Währung neu, die für den Besucher gespeichert ist; genau dieses Neuzeichnen lässt eine Seite „für eine Sekunde“ die richtige Währung zeigen und dann zurückspringen. Eine Seite, die mit einer Währung in der Anfrage aufgebaut wurde, überspringt das Neuzeichnen. Außerdem verhindert es, dass eine GeoIP-Regel auf der ersten Seite eines Besuchers die Währung der Sprache ersetzt. Der Preis dafür: Auf jeder Seite aktualisiert FOX den Mini-Warenkorb einmal, wie nach einem Währungswechsel. - Seiten-Cache und Warenkorb. Eine gecachte Seite führt kein PHP aus, daher wird die für den Besucher gespeicherte Währung von diesem Code nicht aktualisiert. Stellen Sie Währungsspeicherung (Currency storage) auf Transient und schalten Sie Ich verwende ein Cache-Plugin auf meiner Website (I am using cache plugin on my site) ein: In dieser Kombination kopiert das Skript von FOX die Währung der Seite in den Speicher des Besuchers, sodass auch Warenkorb und Checkout der Sprache folgen. Hintergründe finden Sie unter Währungsumschalter springt auf die Standardwährung zurück.
Da der Umschalter nichts mehr ändern kann, blenden Sie ihn aus oder zeigen nur die Währung der aktuellen Sprache an. Besucher, die eine andere Währung wollen, wechseln die Sprache.
Muster 2: Mit der Sprache wechseln, den Umschalter behalten
Die meisten Shops wünschen sich etwas Sanfteres: Ein Besucher, der die deutschen Seiten öffnet, bekommt Euro, kann weiterhin auf Dollar umstellen und bleibt beim Surfen auf Deutsch bei Dollar. Dafür muss man sich merken, für welche Sprache die Währung zuletzt gesetzt wurde, und nur handeln, wenn sich die Sprache ändert. Das im Browser zu erledigen hat zwei Vorteile: Es funktioniert auf gecachten Seiten, und es funktioniert mit jedem Übersetzungs-Plugin, das jeder Sprache eigene Seiten gibt, weil es nur das Attribut lang der Seite liest.
/*
* FOX: switch the currency once when the page language changes;
* the visitor can pick another currency afterwards.
* Front end, in the footer: a code snippets plugin or the theme's
* custom JavaScript field.
*/
window.addEventListener('load', function () {
var map = { en: 'USD', de: 'EUR', fr: 'EUR', bg: 'BGN' }; // language: currency
var lang = (document.documentElement.lang || '').slice(0, 2).toLowerCase();
var params = new URLSearchParams(window.location.search);
var last = null;
if (!map[lang]) {
return;
}
try {
last = localStorage.getItem('my_currency_lang');
localStorage.setItem('my_currency_lang', lang);
} catch (e) {
return; // storage blocked: leave the currency alone
}
// The visitor just picked a currency, or the language has not changed.
if (params.has('currency') || last === lang) {
return;
}
params.set('currency', map[lang]);
window.location.replace(window.location.pathname + '?' + params.toString() + window.location.hash);
});
Ändert sich die Sprache, lädt das Skript die Seite einmal mit ?currency=EUR neu, dem Parameter, den auch der eigene Umschalter von FOX verwendet, sodass FOX die Währung für den Besucher speichert. Danach gilt die eigene Wahl des Besuchers, bis er die Sprache erneut wechselt. Hinweise:
- Es werden die ersten beiden Buchstaben von
langverwendet, sodassde-DEundde-ATbeide alsdezählen. Brauchen zwei Varianten einer Sprache unterschiedliche Währungen, verwenden Sie in der Zuordnung den vollständigen Wert. - Beim allerersten Besuch ist noch nichts gespeichert, daher stellt das Skript auf die Währung der Sprache um, nachdem die Willkommenswährung und die GeoIP-Regeln eine gewählt haben. Soll stattdessen GeoIP die erste Währung bestimmen, fügen Sie gleich nach dem
try-Blockif (last === null) { return; }ein. - Kombinieren Sie es nicht mit Muster 1. Der PHP-Code würde die Wahl des Besuchers auf der nächsten Seite überschreiben.
GeoIP, die Willkommenswährung und Währungslisten pro Sprache
- Welche Regel gewinnt. Bei Muster 1 gewinnt auf jeder Seite die Sprache, und die GeoIP-Regeln und die Willkommenswährung (Welcome currency) spielen keine Rolle mehr. Bei Muster 2 bestimmt GeoIP die erste Währung nur, wenn Sie die Zeile für den ersten Besuch ergänzen; danach entscheidet die Sprache, sobald sie sich ändert. In beiden Fällen sorgt Checkout nach GeoIP-Regeln (Checkout by GeoIP rules), falls aktiviert, weiterhin dafür, dass Kunden an der Kasse in der Währung ihres Landes zahlen; siehe Checkout-Währung nach Land des Kunden.
- Eine Währung für eine Sprache ausblenden. Der Filter woocs_currency_manipulation_before_show ändert die Liste, die jeder FOX-Umschalter zeigt. Er blendet die Währung nur im Umschalter aus; die Währung eines Besuchers, der sie bereits hat, ändert er nicht, das übernimmt Muster 1 oder 2.
/*
* FOX: do not offer PLN on the English pages.
* Child theme functions.php or a code snippets plugin.
*/
add_filter( 'woocs_currency_manipulation_before_show', function ( $currencies ) {
if ( function_exists( 'pll_current_language' ) && pll_current_language() === 'en' ) {
unset( $currencies['PLN'] );
}
return $currencies;
} );
Liegt der Grund für eine Währung pro Sprache im Preis selbst, runden Sie Beträge pro Markt statt der umgerechneten, und kombinieren Sie die Sprachregel mit Festpreisen pro Währung.
GTranslate und andere Übersetzer im Browser
Das kostenlose GTranslate-Widget und andere Dienste, die die Seite im Browser übersetzen, wechseln die Sprache, ohne eine neue Seite zu laden. Es erreicht keine Anfrage WordPress, daher kann kein PHP-Code reagieren, und auch das Attribut lang der Seite ändert sich womöglich nicht. Mit einem solchen Übersetzer kann keines der beiden Muster oben den Sprachwechsel erkennen. Möglichkeiten:
- Gibt Ihr Tarif jeder Sprache eine eigene Adresse (ein Unterverzeichnis oder eine Subdomain), ist jede Sprache ein eigener Seitenaufruf. Prüfen Sie den Seitenquelltext einer übersetzten Seite: Zeigt
<html lang="…">die Sprache, funktioniert Muster 2 unverändert. - Übersetzungs-Proxys teilen WordPress die Sprache unter Umständen in einem Request-Header mit; die kostenpflichtigen Tarife von GTranslate verwenden
X-GT-LANG, in PHP als$_SERVER['HTTP_X_GT_LANG']lesbar. Geben Sie ihn einmal aus, bevor Sie sich darauf verlassen: Ist er leer, sendet Ihre Konfiguration ihn nicht, und warum, kann nur der Support des Anbieters sagen. - Andernfalls halten Sie die Währung unabhängig von der Sprache: Lassen Sie GeoIP-Regeln die erste Währung wählen und den Umschalter den Rest erledigen. Siehe Währung automatisch nach Land ändern.
Wenn die Währung nicht der Sprache folgt
- Geben Sie den Sprachwert aus und vergleichen Sie ihn Zeichen für Zeichen mit den Schlüsseln Ihrer Zuordnung.
- Der Umschalter „bewirkt nichts“: Muster 1 ist aktiv. So funktioniert es; nutzen Sie Muster 2, wenn Besucher wählen können sollen.
- Die Währung stimmt einen Moment und springt dann zurück: Die Seite kam aus einem Cache, und die Zeile
$_GET['currency']fehlt, oder ein anderes Snippet oder Plugin setzt die Währung ebenfalls. Durchsuchen Sie das Theme und die Snippet-Plugins nachset_currency. - Die Seite stimmt, aber der Warenkorb zeigt die alte Währung: Nutzen Sie bei einem Seiten-Cache die Speicherung Transient zusammen mit der Cache-Option, wie in Muster 1 beschrieben.
- Ein benutzerdefinierter Mini-Warenkorb zeigt das neue Symbol mit alten Beträgen: Er hält eigene gecachte Warenkorbdaten vor. Testen Sie mit dem Standard-Mini-Warenkorb von WooCommerce, um das zu bestätigen.
- Leeren Sie nach dem Hinzufügen oder Ändern des Codes jeden Cache (Plugin, Server, CDN) und testen Sie in einem privaten Fenster.
Folgt die Währung weiterhin nicht der Sprache, eröffnen Sie ein Thema im FOX-Support-Forum mit dem verwendeten Übersetzungs-Plugin, Ihrem Snippet und einem Link auf zwei Sprachversionen einer Seite.