WooCommerce Währungsumrechner: Wechselkurse werden nicht aktualisiert
Wenn die Wechselkurse des WooCommerce Währungsumrechners nicht aktualisiert werden, zeigt sich das auf eine von drei Arten: Ein Kursfeld zeigt nach Alle Kurse aktualisieren (Update all rates) den Text no data for ... oder 0, die Kurse ändern sich nie von selbst, oder sie ändern sich, weichen aber von den Kursen bei Google ab. Jedes Symptom hat eine andere Ursache, und FOX selbst erfindet nur selten eine Zahl: Das Plugin fragt einen Kursanbieter ab, speichert die Antwort und multipliziert Ihre Preise damit. Diese Anleitung erklärt, wie das funktioniert, wie Sie jedes Symptom beheben und wie Sie die Kurse selbst in die Hand nehmen, wenn die automatischen Kurse nicht Ihren Vorstellungen entsprechen.
So aktualisiert FOX die Wechselkurse
Die Kursquelle ist der Währungs-Aggregator (Currency aggregator) im Tab Optionen (Options) der FOX-Einstellungen (WooCommerce → Einstellungen → Währung), der zugehörige Schlüssel steht im Feld API-Schlüssel des Aggregators (Aggregator API key), sofern der Anbieter einen verlangt. Für jede Währung außer der Basiswährung sendet FOX eine Anfrage an diesen Aggregator und fragt, wie viele Einheiten der Währung man für eine Einheit Ihrer Basiswährung erhält. Ein Shop mit USD als Basiswährung und einem EUR-Kurs von 0,92 zeigt ein Produkt für 100 USD mit 92 EUR an.
Kurse werden auf zwei Wegen aktualisiert, und beide behandeln Fehler unterschiedlich:
- Alle Kurse aktualisieren (Update all rates) im Tab Währungen (Currencies) sowie die Aktualisierungsschaltfläche neben jedem Kurs tragen die Antworten in die Kursfelder ein. Gespeichert wird erst, wenn Sie auf „Speichern“ klicken. Eine Währung, die der Aggregator nicht bepreisen kann, erhält den Fehlertext in ihrem Feld, und wenn Sie dieses Feld speichern, wird 0 gespeichert.
- Die geplante Aktualisierung, die über Automatische Kursaktualisierung (Rate auto update) eingestellt wird, speichert nur Kurse größer als null. Eine Währung, deren Anfrage fehlschlägt, behält ihren bisherigen Kurs – ohne jede Meldung.
Eine 0 stammt also fast immer von einer manuellen Aktualisierung, die gespeichert wurde, und ein eingefrorener Kurs von einer geplanten Aktualisierung, die entweder nicht läuft oder für diese Währung dauerhaft fehlschlägt.
„No data for“ oder ein Kurs von 0
Klicken Sie auf die Aktualisierungsschaltfläche neben der Währung und lesen Sie den Text, der im Kursfeld erscheint. Meistens nennt er die Ursache:
- Der Aggregator hat keine Daten für das Währungspaar. Kein Anbieter deckt alle Währungen ab. Yahoo hat bei vielen exotischen Paaren Lücken (die Meldung lautet There is no data for these currencies: USD/XXX). Die Quelle der Europäischen Zentralbank veröffentlicht etwa dreißig wichtige Währungen und berechnet andere Basiswährungen aus ihren Euro-Kursen. CryptoCompare deckt Kryptowährungen ab, aber nicht jede Fiat-Währung, und Pulse Verity bedient ausschließlich Kryptowährungen mit USD als Basiswährung. Wechseln Sie den Aggregator und testen Sie erneut.
- Der Währungscode ist kein echter Code.
EURO,CAD$oder ein Code mit einem unsichtbaren Zeichen, das von einer Webseite hineinkopiert wurde, liefert bei keinem Aggregator ein Ergebnis. Löschen Sie den Code, geben Sie die drei Buchstaben des ISO-4217-Codes von Hand ein und speichern Sie. Eine Währung, die tatsächlich keinen ISO-Code hat, braucht einen manuellen Kurs; siehe eigene Währungscodes. - Der API-Schlüssel fehlt oder ist falsch. Currencyapi, Open exchange rates, Currencylayer und Fixer benötigen einen Schlüssel von der Website des Anbieters im Feld API-Schlüssel des Aggregators (Aggregator API key). Meldungen, die mit Aggregator Error: beginnen, stammen vom Anbieter und nennen den Grund der Ablehnung.
- Der kostenlose Tarif erlaubt Ihre Basiswährung nicht. Mehrere Anbieter beantworten Anfragen mit kostenlosen Schlüsseln nur für eine einzige Basiswährung, zum Beispiel USD bei Open exchange rates und Currencylayer sowie EUR bei Fixer. Ein Shop mit einer anderen Basiswährung erhält einen Fehler wie Changing the API base currency is available for ... plan clients. Nutzen Sie einen Tarif, der das erlaubt, oder einen anderen Aggregator.
- Das Anfragekontingent ist aufgebraucht. FOX sendet bei jeder Aktualisierung eine Anfrage pro Währung. Acht Währungen neben der Basiswährung, stündlich aktualisiert, ergeben etwa 5.800 Anfragen im Monat – mehr, als viele kostenlose Kontingente zulassen; ist das Kontingent erschöpft, antwortet der Anbieter nicht mehr. Wählen Sie unter Automatische Kursaktualisierung (Rate auto update) ein längeres Intervall, damit die Monatssumme passt.
- Der Server erreicht den Anbieter nicht. Eine lokale Entwicklungsinstallation, eine Firewall, die ausgehendes HTTPS blockiert, oder eine fehlerhafte cURL- oder SSL-Konfiguration verhindert jede Anfrage. FOX schreibt solche Fehler in das PHP-Fehlerprotokoll, und zwar als Zeilen, die mit
[WOOCS] wp_remote_get error:beginnen.
Das Vorgehen ist in jedem Fall dasselbe: den Code korrigieren, einen Aggregator wählen, der für Ihre Basiswährung alle Ihre Währungen abdeckt, dessen Schlüssel eintragen, auf Alle Kurse aktualisieren (Update all rates) klicken, prüfen, dass jedes Feld eine Zahl enthält, und erst dann speichern.
Lassen Sie einen Kurs niemals auf 0
Ein Kurs von 0 setzt jeden Preis, jede Gebühr und jede Versandkostenposition in dieser Währung auf null, sodass Produkte kostenlos bestellt werden können, und Berechnungen, die durch den Kurs teilen, können die Seite mit einem schwerwiegenden Fehler Division by zero anhalten. Lässt sich eine Währung nicht automatisch bepreisen, geben Sie ihr einen manuellen Kurs (siehe unten) oder entfernen Sie sie. Als Schutz davor, dass ein Anbieter einen abwegigen Wert liefert, legen Sie im Tab Währungen (Currencies) für die Währung die Kursuntergrenze/-obergrenze (Rate floor/ceiling) fest: Ein abgerufener Kurs unterhalb von Minimal möglicher Kurs (Minimum possible rate) oder oberhalb von Maximal möglicher Kurs (Maximum possible rate) wird durch diese Grenze ersetzt. Seiten, die aus anderen Gründen Preise von 0 anzeigen, behandelt der Artikel Währungsumrechnung falsch: doppelt, null und andere Fälle.
Kurse werden nicht automatisch aktualisiert
Wählen Sie unter Automatische Kursaktualisierung (Rate auto update) ein Intervall von Spezial: jede Minute (special: each minute) bis monatlich (monthly) und klicken Sie auf „Speichern“. Der Zeitplan beginnt ab diesem Moment. Unter der Option zeigt FOX den Zustand des Planers: Letzte Ausführung (Last run), Nächste Ausführung (Next run) und das Intervall oder noch kein Zeitplan gespeichert (no schedule stored yet), wenn die Option nie gespeichert wurde.
Der Zeitplan stammt von FOX selbst und ist nicht WP-Cron; er läuft bei der ersten Anfrage, die WordPress nach dem Fälligkeitszeitpunkt lädt: einem Seitenaufruf, einer Admin-Seite, einer AJAX- oder REST-Anfrage. Daraus ergeben sich drei Folgen:
- Die genaue Uhrzeit lässt sich in den Einstellungen nicht festlegen, und auf einer wenig besuchten Website kann sich eine Aktualisierung verspäten. Nächste Ausführung (Next run) zeigt dann überfällig seit ..., wartet auf die nächste Anfrage, die WordPress lädt (overdue by ..., waiting for the next request that loads WordPress).
- Seiten, die von einem Full-Page-Cache oder einem CDN ausgeliefert werden, laden WordPress nicht. Eine Website, deren Besucher ausschließlich gecachte Seiten erhalten, kann lange ohne Aktualisierung bleiben.
DISABLE_WP_CRONinwp-config.phphat darauf keinen Einfluss.
Damit Aktualisierungen pünktlich erfolgen, lassen Sie einen Server-Cronjob alle paar Minuten eine beliebige ungecachte URL der Website aufrufen, zum Beispiel https://your-site.com/wp-cron.php; dadurch wird WordPress geladen, und die überfällige Aktualisierung läuft. Wenn Sie stattdessen zu einer festen Uhrzeit aktualisieren möchten, stellen Sie Automatische Kursaktualisierung (Rate auto update) auf keine automatische Aktualisierung (no auto update) und führen Sie die Update-Aktion über die Crontab des Servers mit WP-CLI zur gewünschten Zeit aus:
# crontab: update FOX rates every day at 06:00 server time
0 6 * * * cd /path/to/wordpress && wp eval 'do_action("woocs_update_rates_wpcron");'
Die Action ist als woocs_update_rates_wpcron dokumentiert. Ist das Plugin älter als 2.5.3, aktualisieren Sie es zuerst: In älteren Versionen konnte sich der Zeitplan in Shops mit gleichmäßigem REST-API-Verkehr ständig neu starten und nie ausgeführt werden.
So prüfen Sie, ob es funktioniert
Ein Aggregator liefert oft denselben Kurs wie vor einer Stunde, was aussieht wie „wird nicht aktualisiert“. Zum Testen tragen Sie in einer Währung einen offensichtlich falschen Kurs wie 7777 ein, speichern und warten ein Intervall ab: Die geplante Aktualisierung sollte ihn ersetzen. Die Option E-Mail-Benachrichtigung über die Ergebnisse der „Automatischen Kursaktualisierung“ (Email notice about "Rate auto update" results) im Tab Optionen (Options) sendet dem Administrator nach jedem geplanten Lauf eine Liste der Kurse. Die Liste zeigt jede Währung mit ihrem aktuellen Kurs, auch eine Währung, deren Anfrage fehlgeschlagen ist und ihren alten Wert behalten hat, und sie wird mit der PHP-Funktion mail() versendet, sodass ein SMTP-Plugin sie nicht zustellt. Kommt keine E-Mail an, ist die Zeile Letzte Ausführung (Last run) der bessere Zeuge.
Manuelle Kurse beibehalten oder eine eigene Quelle verwenden
Automatische Kurse sind optional. Die Möglichkeiten, die Kontrolle zu übernehmen, vom einfachsten zum flexibelsten:
- Alle Kurse von Hand. Stellen Sie Automatische Kursaktualisierung (Rate auto update) auf keine automatische Aktualisierung (no auto update), tragen Sie die Kurse ein und speichern Sie. Nichts überschreibt sie.
- Eine Währung von Hand, die übrigen automatisch. Der Filter woocs_add_custom_rate antwortet für ausgewählte Währungen, bevor der Aggregator gefragt wird, sowohl bei geplanten Aktualisierungen als auch bei den Aktualisierungsschaltflächen. Klicken Sie nach dem Hinzufügen auf Alle Kurse aktualisieren (Update all rates) und speichern Sie, oder warten Sie auf den nächsten geplanten Lauf:
/* * Fixed rate for one currency, automatic rates for the others. * Child theme functions.php or a code snippets plugin. */ add_filter('woocs_add_custom_rate', function ($rate, $base_currency, $currency) { if ($currency === 'NGN') { return 1550; // 1 unit of the base currency = 1550 NGN } return $rate; // false: the aggregator decides }, 10, 3); - Ein Aufschlag auf den Kurs. Das Zinsfeld neben jedem Kurs in der Spalte Kurs+% (Rate+%) addiert einen festen Betrag (
0.15) oder einen ganzen Prozentsatz (2%) zum gespeicherten Kurs, sodass Aktualisierungen Ihren Aufschlag beibehalten. Mehr dazu in Wechselkurse manuell anpassen. - Eine eigene Kursquelle. Die Filter woocs_announce_aggregator und woocs_add_aggregator_processor fügen einen Aggregator hinzu, der die API Ihrer Bank, eine XML-Datei oder einen CSV-Feed ausliest; der Prozessor wird einmal pro Währung aufgerufen und gibt den Kurs zurück. Eigenen Kurs-Aggregator hinzufügen enthält ein funktionierendes Beispiel. Für die Quelle Narodowy Bank Polsky wechselt woocs_bank_polski_table von Tabelle A zu einer anderen Tabelle.
- Von Ihrem Code geschriebene Kurse. Die Kurse werden in der Option
woocsgespeichert, geordnet nach Währungscode. Lesen Sie sie mitget_option()aus, nicht mit$WOOCS->get_currencies(), das die Kurse mit bereits addiertem Zins zurückgibt:
Um auf jede geplante Aktualisierung zu reagieren, zum Beispiel um die Kurse zu protokollieren oder an ein anderes System weiterzugeben, verwenden Sie die Action woocs_sheduler_rates_updated, die die aktualisierten Währungen erhält.$currencies = get_option('woocs', array()); if (isset($currencies['EUR'])) { $currencies['EUR']['rate'] = 0.9215; update_option('woocs', $currencies); }
Warum der Kurs von Google abweicht
FOX verwendet genau den Kurs, den der gewählte Aggregator bei der letzten Aktualisierung geliefert hat. Google, XE und Banking-Apps zeigen Kurse aus ihren eigenen Datenquellen, meist einen aktuellen Mittelkurs, sodass eine Abweichung nicht auf einen Fehler hindeutet. Die üblichen Gründe:
- Unterschiedliche Quellen und Zeitpunkte. Der Yahoo-Aggregator nimmt den Eröffnungswert des jüngsten Tageskerzenbalkens, der am Nachmittag schon Stunden alt sein kann. Die Europäische Zentralbank veröffentlicht ihre Referenzkurse einmal pro Arbeitstag. Kostenlose Tarife anderer Anbieter werden häufig stündlich oder täglich aktualisiert. Kurse, die dem Markt innerhalb von Minuten folgen, erfordern einen Anbieter und Tarif mit entsprechend häufiger Aktualisierung sowie ein dazu passendes Intervall unter Automatische Kursaktualisierung (Rate auto update).
- Ihre eigenen Einstellungen. Ein Zinswert in Kurs+% (Rate+%), eine Grenze unter Kursuntergrenze/-obergrenze (Rate floor/ceiling), ein
woocs_add_custom_rate-Filter, Rundungscode oder feste Preise pro Währung verschieben den angezeigten Preis gegenüber einer reinen Umrechnung. Prüfen Sie den Rundungscode und die festen Preise des Produkts, bevor Sie dem Kurs die Schuld geben. - Preise ändern sich, der Kurs nicht. Bewegen sich die Preise, während die Kursfelder gleich bleiben, rechnet oder ändert etwas anderes die Preise: ein zweites Währungs-Plugin, ein Plugin für dynamische Preisgestaltung oder ein Seiten-Cache, der eine alte Seite ausliefert.
Um die Kurse anzugleichen, wählen Sie den Aggregator, dessen Zahlen mit der Referenz übereinstimmen, der Sie vertrauen, aktualisieren Sie innerhalb seines Kontingents häufiger oder legen Sie den Kurs für die Währungen, bei denen die Abweichung zählt, von Hand fest.
Checkliste
- Jeder Währungscode ist ein schlichter dreistelliger ISO-Code, von Hand eingegeben.
- Der Aggregator deckt alle Ihre Währungen für Ihre Basiswährung ab, und Schlüssel und Tarif erlauben diese Basiswährung.
- Alle Kurse aktualisieren (Update all rates) füllt jedes Feld mit einer Zahl, bevor Sie auf „Speichern“ klicken; kein Kurs ist 0.
- Automatische Kursaktualisierung (Rate auto update) gespeichert, Letzte Ausführung (Last run) aktuell, und die Anfragen pro Monat liegen innerhalb des Kontingents des Anbieters.
- Auf einer vollständig gecachten Website ruft ein Server-Cronjob eine ungecachte URL auf.
- Unter- und Obergrenze sind für Währungen festgelegt, bei denen ein falscher Kurs schaden würde.
Wenn sich eine Währung trotz korrektem Code und funktionierendem Aggregator nicht aktualisiert, eröffnen Sie ein Thema im FOX-Support-Forum mit Angabe der Basiswährung, des Aggregators, des im Kursfeld angezeigten Textes und aller [WOOCS]-Zeilen aus dem PHP-Fehlerprotokoll, und wir werden uns das ansehen.