WPCS
Ein Währungsumschalter für WordPress-Websites ohne WooCommerce: Im Inhalt geschriebene Preise werden in die Währung des Besuchers umgerechnet.
- Erstveröffentlichung
- Aktive Installationen
- 900+
- Bewertung
- Rezensionen lesen
Über mich
WPCS bringt die Währungsumschaltung von WOOCS auf gewöhnliche WordPress-Websites: Reiseveranstalter, Immobilienangebote, Preislisten von Dienstleistern. Preise werden in einer Basiswährung über den Shortcode [wpcs_price] oder ein Post-Meta-Feld geschrieben und in der Währung angezeigt, die der Besucher gewählt hat oder die seinem Land zugeordnet ist.
Ohne WooCommerce fehlt dem Plugin die übliche Infrastruktur: keine Preisfilter, kein Session-Handler, kein Geolokalisierungsdienst. Es muss die Auswahl des Besuchers selbst festhalten, Wechselkurse aus externen Quellen abrufen, die sich ändern oder verschwinden, und hinter Full-Page-Caches funktionieren, die allen dasselbe HTML ausliefern.
Die Antwort ist eine einzige Preis-Pipeline (Kurs, Genauigkeit, Trennzeichen, Symbol-Template), austauschbare Speicherung pro Besucher, Kurs-Provider, die einen Kurs oder einen Fehler statt einer Null liefern, und ein Cache-Modus, in dem Preise als markierte Spans ausgegeben und für jeden Besucher über einen AJAX-Aufruf neu gerendert werden.
Der Premium-Build und der kostenlose Build auf wordpress.org teilen sich eine Codebasis; der kostenlose Build ist auf zwei Währungen begrenzt.
WPCS · Währungsumschalter
was gelöst wurde
Preisumrechnung und Formatierung
shipped · 2016Was es bringtBesucher sehen Preise in ihrer Währung mit dem richtigen Symbol und den richtigen Dezimalstellen. Inhaber können Kursen einen Aufschlag hinzufügen oder feste Preise pro Währung festlegen.
- Problem
- Preise in Beiträgen sind in einer Basiswährung geschrieben. Jeder Besucher muss sie mit dem richtigen Kurs, der richtigen Genauigkeit, den richtigen Trennzeichen und der richtigen Symbolposition umgerechnet sehen, ohne die Preisfunktionen von WooCommerce.
- Lösung
Alle Preise laufen durch eine Pipeline: mit dem Kurs multiplizieren, mit Genauigkeit und Trennzeichen pro Währung formatieren, dann in ein Symbol-Template und einen markierten Span einhüllen, der den Basisbetrag bewahrt.
- Stack
Der Inhalt enthält Preise nur in der Basiswährung[wpcs_price] rechnet einen direkten Wert oder ein Post-Meta-Feld mit dem aktuellen Kurs um
Der Shortcode nimmt value oder meta_value mit optionalem post_id; post_id ohne meta_value liest den Meta-Schlüssel wpcs_price. price() multipliziert nur dann mit dem Kurs, wenn die aktuelle Währung von der Basis abweicht, und reicht die Zahl dann an format_price_numeric() und den Filter wpcs_price weiter.
price_html() umhüllt das Ergebnis mit einem Span mit eindeutiger ID und data-amount, der den Basiswert enthält und den der Seiten-Cache-Modus später zum Neurendern nutzt.
Manche Preise dürfen dem Wechselkurs nicht folgentype="fixed" nimmt Beträge pro Währung wie 'USD:15,EUR:20'
Bei festen Preisen parst der Shortcode die Liste in eine Zuordnung und zeigt den Betrag für die aktuelle Währung oder 'none', wenn er fehlt. Die Liste mit dem Preis in allen Währungen nutzt dieselbe Zuordnung, statt umzurechnen.
Währungen unterscheiden sich in Cent, Dezimalstellen und TrennzeichenGenauigkeit aus einer Liste ohne Cent und Dezimalstellen pro Währung; Trennzeichen pro Währung
JPY und TWD werden immer ohne Cent angezeigt; jede Währung lässt sich mit hide_cents zu dieser Liste hinzufügen. Die Einstellungen umfassen Dezimalstellen pro Währung sowie Dezimal- und Tausendertrennzeichen pro Währung. Die Wahl des Trennzeichens ist ein Index in zwei parallele Arrays, wobei Index 0 die globale Einstellung bedeutet, sodass bestehende Websites ihre Formatierung behalten.
Websites wollen einen Aufschlag auf den MarktkursEin 'interest' pro Währung wird beim Lesen zum Kurs addiert; die Einstellungsseite sieht den Rohkurs
Der Aufschlag ist ein fester Betrag, der neben dem Kurs gespeichert wird. get_currencies() addiert ihn überall zum Kurs, außer auf der Einstellungsseite des Plugins, sodass der Admin den reinen Kurs bearbeitet, während das Frontend mit dem angepassten umrechnet. Ein Filter wpcs_currency_data_manipulation läuft danach für eigene Regeln.
Einen Preis in allen Währungen zeigen und zwischen zwei beliebigen umrechnenFormatierten Preis auf die Basis zurückparsen, dann vorwärts umrechnen; Kreuzkurs zu/von
Die Preisinfo-Liste entfernt das Tausendertrennzeichen aus dem bereits formatierten String, normalisiert das Dezimaltrennzeichen, rechnet mit back_convert() (1/rate) auf die Basis zurück und dann vorwärts in jede andere Währung. Der Endpunkt [wpcs_converter] verwendet rate[to] / rate[from], beide relativ zur Basis, und lässt bei Währungen ohne Cent die Cent weg.
Ein Preis muss manchmal für alle Besucher in einer Währung erscheinenfix_currency tauscht die aktuelle Währung für einen umgerechneten Preis aus und stellt sie dann wieder her
Bei einem umgerechneten Preis merkt sich der Shortcode die Währung des Besuchers, schaltet auf die angeforderte um, sofern sie konfiguriert ist, rendert und schaltet zurück, sodass der Rest der Seite die Wahl des Besuchers behält.
Wechselkursquellen und Aktualisierungen
shipped · 2016Was es bringtWechselkurse aktualisieren sich selbstständig aus mehreren Quellen, und eine fehlgeschlagene Aktualisierung macht nie einen Preis zu null.
- Problem
- Kostenlose Kurs-APIs ändern sich, schließen oder verlangen plötzlich Schlüssel; Nationalbanken veröffentlichen Kurse nur gegen ihre eigene Währung; und ein fehlgeschlagener Abruf darf einen funktionierenden Kurs nicht durch null ersetzen.
- Lösung
Jede Quelle ist ein Provider, der einen Kurs relativ zur Basiswährung der Website oder -1 mit Fehlermeldung liefert; WP-Cron aktualisiert die Kurse und speichert nur Werte über null.
- Stack
Kurs-APIs entstehen, ändern sich und werden abgeschaltetProvider werden nach Namen aufgelöst; unbekannte Namen gehen an einen Filter für eigene Quellen
Das Changelog hält die Fluktuation fest: Yahoo in 1.1.1 entfernt (2017), Google in 1.1.2 entfernt (2018), beide in 1.1.3 wieder hinzugefügt (2018), nicht mehr funktionierende Quellen in 1.1.3 und 1.1.4 erneut entfernt, eigene Aggregatoren über einen Hook in 1.1.5 (2020). Jede Quelle ist eine Klasse mit getApiUrl() und parseResponse() auf einer gemeinsamen RateProvider-Basis.
get_rate_provider() ordnet den Optionswert einem Klassennamen zu; existiert keine Klasse, lässt wpcs_add_aggregator_processor eine Website ihre eigene Quelle einbinden, und wpcs_announce_aggregator fügt sie der Liste in den Einstellungen hinzu. Die Liste in den Einstellungen enthält 14 Quellen.
Zentralbanken notieren jede Währung gegen ihre eigeneKreuzkurse als rate[to] / rate[base] berechnen, wenn die Basis der Website abweicht
Die EZB veröffentlicht gegen EUR, die Nationalbank der Ukraine gegen UAH, die Magyar Nemzeti Bank gegen HUF. Jeder Provider behandelt drei Fälle: die Basis ist die Bankwährung, das Ziel ist die Bankwährung, keines von beidem. Die MNB-Quelle ist ein SOAP-Dienst mit Dezimalkommas und Notierungen pro Einheit (zum Beispiel 100 JPY), die vor der Division normalisiert werden.
Ein fehlgeschlagener Abruf darf keinen Kurs von null setzenProvider liefern -1 mit einem Fehler; Cron speichert nur Kurse größer als null
get_rate() gibt den Fehlertext des Providers statt einer Zahl zurück, wenn der Kurs negativ ist. rate_auto_update() wandelt Ergebnisse in float um und ersetzt einen Kurs nur, wenn der neue Wert über null liegt, sodass eine defekte Quelle nie null oder einen Fehlertext als Kurs schreibt.
Kurse müssen sich aktualisieren, ohne dass ein Admin die Einstellungen öffnetWP-Cron-Ereignis mit hinzugefügten Intervallen 'week' und 'month'
Die Einstellungen bieten stündlich, zweimal täglich, täglich, wöchentlich oder monatlich. Das Plugin registriert die zwei zusätzlichen Intervalle über cron_schedules und plant das Ereignis beim Laden mit dem gewählten Intervall, sofern es noch nicht geplant ist.
Der Wechsel der Basiswährung macht alle gespeicherten Kurse ungültigsave_etalon() markiert die neue Basis und ruft jeden Kurs gegen sie neu ab
Der AJAX-Handler speichert das neue Flag is_etalon, setzt die neue Standardwährung im Speicher, fordert über den aktiven Provider einen Kurs für jede andere Währung an und gibt die Kurse an das Einstellungsformular zurück.
Viele Währungen von Hand einzurichten ist langsam und fehleranfälligEingebaute Tabelle mit 118 Währungen; Massenhinzufügen ruft Kurs und Flagge ab (Premium-Oberfläche)
WPCS_World_Currencies enthält Symbol, Beschreibung, Dezimalstellen und Flaggencode pro Währung. add_currencies_ajax() fügt die gewählten hinzu, ruft für jede einen Kurs ab, registriert unbekannte Symbole als eigene Zeichen und lädt die Flagge in die Mediathek herunter, mit Rückgriff auf eine entfernte Flaggen-URL, falls der Download fehlschlägt. Der Dialog zum Massenhinzufügen wird nur im Premium-Build angezeigt.
Währung des Besuchers und Seiten-Caching
shipped · 2016Was es bringtJeder Besucher behält seine gewählte Währung auch auf zwischengespeicherten Seiten, sodass die Website schnell bleiben kann, ohne die Währung eines anderen zu zeigen.
- Problem
- Die gewählte Währung gehört einem Besucher, doch Full-Page-Caches liefern allen dasselbe HTML aus, und eine Speicherung nach IP vermischt Besucher hinter einem Proxy oder NAT.
- Lösung
Austauschbare Speicherung pro Besucher und ein Cache-Modus, in dem der Browser admin-ajax bittet, alle Preis-Spans einer zwischengespeicherten Seite für die Währung des Besuchers neu zu rendern.
- Stack
Zwischengespeichertes HTML zeigt die Währung dessen, der den Cache aufgewärmt hatCache-Modus: JS sammelt alle .wpcs_price-Spans und rendert sie in einem Request neu
Jeder Preis-Span trägt eine eindeutige ID und den Basisbetrag. Bei aktivierter Cache-Option sendet front.js die ID/Betrag-Paare an wpcs_get_prices_html, das die Währung des Besuchers serverseitig auflöst und eine Zuordnung von ID zu neuem HTML plus die aktuelle Währung zurückgibt; die Umschalter-Widgets werden danach darauf abgeglichen. Der Modus ist im Code von 2016 vorhanden.
Während die Umschalter-Widgets auf die zurückgegebene Währung gesetzt werden, verhindert ein Flag, dass ihre Change-Ereignisse einen weiteren Währungswechsel starten.
Hosts unterscheiden sich darin, welche Speicherung pro Besucher funktioniertIn den Einstellungen gewählte Speicherstrategie: Session, IP-basierter Transient oder Cookie
WPCS_STORAGE baut das Backend nach Namen aus einer abstrakten Klasse Storage. SessionStorage::create() gibt false zurück, wenn session_start() fehlschlägt, und der Wrapper fällt dann auf Transient-Speicher zurück. Jeder Wert wird beim Schreiben bereinigt.
Besucher hinter einer IP dürfen sich eine gewählte Währung nicht teilenCookie-Speicher: zufällige UUID in einem Cookie, Werte in Transients
Das Changelog nennt den Grund: IP-basierte Transients vermischen Nutzer, die sich eine Adresse teilen. CookieStorage adressiert Transients über ein UUID-Cookie. Sind die Header beim Erzeugen der ID bereits gesendet, gibt es ein Footer-Skript aus, das die ID an einen durch Nonce geprüften AJAX-Endpunkt sendet, der das Cookie aus einer sauberen Antwort setzt.
?currency= in Links spaltet Caches und gelangt in geteilte URLsOptionaler Modus: Währung per AJAX setzen und neu laden, kein GET-Parameter
Im Standardmodus baut wpcs_redirect() die aktuelle URL neu auf und behält die anderen GET-Parameter und den #Anker. Im Modus 'No GET data in link' sendet es die Währung an wpcs_set_currency_ajax und lädt neu. In das Seitenskript ausgegebene GET-Parameter werden zuvor rekursiv bereinigt.
Willkommens- oder Geo-Währung muss einmal gelten und darf eine Wahl nicht überschreibenFlag für den ersten Besuch im Speicher; die Logik der Standardwährung läuft nur, solange es 0 ist
Beim ersten Request wird die Willkommenswährung gespeichert und das Flag gesetzt; Geo-Regeln laufen ebenfalls nur bei einem ersten eindeutigen Besuch. Wird eine gespeicherte Währung später aus der Liste entfernt, fällt get_currencies() auf die Basis zurück.
Währungswahl nach Geo-IP
shipped · 2017Was es bringtNeue Besucher sehen automatisch die Währung ihres Landes, nach vom Inhaber festgelegten Regeln und ohne einen Standortdienst zu bezahlen.
- Problem
- Ohne WooCommerce gibt es keinen Geolokalisierungsdienst, daher muss das Plugin eine Besucher-IP auf jedem Host, hinter Proxys und CDNs, ohne kostenpflichtige API einem Land zuordnen.
- Lösung
Eine mitgelieferte MaxMind-Länderdatenbank hinter einer Resolver-Schnittstelle, mit einer optionalen GeoIP2-Datenbank, die der Website-Inhaber herunterlädt, und Admin-Regeln, die Länder Währungen zuordnen.
- Stack
Länderkennung auf einer Website ohne WooCommerceMitgelieferte MaxMind-Datei GeoIP.dat mit ihrem PHP-Reader
WC_Geolocation von WooCommerce steht auf einer einfachen WordPress-Website nicht zur Verfügung, daher liefert das Plugin seine eigene Länderdatenbank mit. lib/GeoIP.dat und geoip.inc sind in OpenIpCountryResolver gekapselt, mit einem Cache pro Request nach IP.
Die echte Client-IP ist hinter Proxys und CDNs verborgenX-Real-IP lesen, dann den ersten Hop von X-Forwarded-For, dann REMOTE_ADDR
Bei der mitgelieferten Datenbank wird ein Cloudflare-Header HTTP_CF_IPCOUNTRY direkt verwendet und die Datenbanksuche übersprungen. Ein Request, dessen REMOTE_ADDR 127.0.0.1 oder ::1 ist, wird als 8.8.8.8 aufgelöst, bevor die Proxy-Header gelesen werden.
Die Länderdaten des Legacy-Formats sind weniger genauGeoIP2-Option: GeoLite2-.mmdb im Admin heruntergeladen und entpackt
Mit einem MaxMind-Lizenzschlüssel lädt der Admin das Archiv GeoLite2-Country herunter; der Handler entpackt .tar.gz mit PharData, findet die .mmdb-Datei, kopiert sie nach uploads/currency-switcher und entfernt temporäre Dateien bei Erfolg und bei Fehler. Ohne Schlüssel bleibt das Plugin bei der mitgelieferten Datenbank. Abfragen laufen über das Composer-Paket geoip2.
Länder Währungen zuordnen, mit Überschreibung auf Code-EbeneRegeln Währung => Länder; der Filter wpcs_geo_position überschreibt das Land
init_geo_currency() ermittelt das Land, reicht es durch wpcs_geo_position, speichert es für den Besucher und wendet die erste passende Regel nur bei einem ersten Besuch an. [wpcs_check_country] gibt das erkannte Land aus, um eine Regel zu debuggen.
Härtung öffentlicher Eingaben
shipped · 2021Was es bringtAnonyme Besucher können den Währungsumschalter nicht missbrauchen, um Inhalte einzuschleusen oder Einstellungen zu ändern, sodass Preise und Seiten bleiben, wie der Inhaber sie festgelegt hat.
- Problem
- Der Umschalter läuft auf jeder Frontend-Seite, stellt anonymen Besuchern AJAX-Endpunkte bereit und übernimmt Shortcode-Attribute von Autoren, sodass Eingaben von außen in HTML, Speicher und Einstellungen gelangen.
- Lösung
Währungscodes aus der URL und dem Umschalter-Formular gegen die konfigurierte Liste prüfen, Request-Arrays begrenzen und per Muster prüfen, Attribute maskieren und JSON für den HTML-Kontext kodieren.
- Stack
Der öffentliche Preis-Endpunkt nimmt ein Array von anonymen Besuchern entgegenHöchstens 500 Einträge, Prüfung des ID-Musters, Skalar-Prüfungen, Ausgabe mit JSON_HEX_*
wpcs_get_prices_html ist für anonyme Besucher verfügbar. Es kürzt die Eingabe auf 500 Einträge, akzeptiert nur IDs, die zum von price_html() genutzten Zeichensatz von uniqid() passen, überspringt nicht skalare Preise und kodiert die Antwort mit JSON_HEX_TAG, AMP, APOS und QUOT, weil admin-ajax sie als text/html ausliefert.
Shortcode-Werte landen in HTML-Data-Attributendata-*-Attribute mit esc_attr() auf Schlüssel und Wert aufbauen
price_html() schreibt Werte, die aus den Attributen von [wpcs_price] stammen, etwa den Basisbetrag oder die rohe Liste 'USD:15,EUR:20' eines festen Preises, in data-*-Attribute des Preis-Spans. Schlüssel und Werte werden maskiert und in Anführungszeichen gesetzt, sodass ein Attributwert kein Markup einschleusen kann.
Der Kurs-Endpunkt baut aus Request-Eingaben einen Shortcode-StringAusschlussliste mit bekannten Codes geschnitten, Währung validiert, Genauigkeit mit intval
wpcs_rates_current_currency reicht Besuchereingaben in do_shortcode() weiter. Nur Währungscodes, die in der Konfiguration existieren, überleben, das Ergebnis wird mit esc_attr behandelt und die Genauigkeit in int umgewandelt, sodass keine zusätzliche Shortcode-Syntax eingeschleust werden kann.
Eine Währung aus der URL oder dem Umschalter-Formular kann ein beliebiger String seinURL- und Formularwerte nur akzeptieren, wenn sie konfigurierte Codes sind; gespeicherte Werte bereinigt
Das Formularfeld des Währungsumschalters und der Parameter ?currency= werden mit array_key_exists() gegen die konfigurierte Liste geprüft, bevor sie den Speicher erreichen, und WPCS_STORAGE::set_val() bereinigt jeden Wert.
Symbole als HTML-Entities brachen bei Rundläufen des EinstellungsformularsSymbole als md5-Hashes senden und auf die bekannte Symbolliste zurückabbilden
Symbole wie руб. werden als Entities gespeichert. Das Select sendet md5(symbol), und der Speicher-Handler bildet den Hash aus der bekannten Liste auf die ursprüngliche Entity zurück, sodass die Entity weder doppelt kodiert noch aus roher Eingabe übernommen wird. Das Speichern ist durch check_admin_referer() geschützt, und position wird gegen eine feste Liste geprüft.
Zahlen
wordpress.org- Aktive Installationen 900+ Zähler von wordpress.org.
- Rezensionen 13 Durchschnitt 4.1 von 5.
- Jahre Support 10 Seit 26. Mai 2016, letztes Update 21. September 2026.