Język

Napisz do mnie

Wtyczka WordPress · od 2016

WPCS

Przełącznik walut dla witryn WordPress bez WooCommerce: ceny zapisane w treści są przeliczane na walutę odwiedzającego.

Pierwsze wydanie
Aktywne instalacje
900+
Ocena
4.1 / 5 (13)Czytaj opinie
  • PHP
  • Shortcode WordPressa
  • Transients
  • Cookies / sesje PHP
  • WP-Cron
  • wp_remote_get
  • SimpleXML / SoapClient
  • MaxMind GeoIP (starszy .dat) i GeoIP2 (.mmdb)
  • PharData
  • admin-ajax
  • jQuery

O mnie

WPCS przenosi przełączanie walut znane z WOOCS na zwykłe witryny WordPress: biura podróży, ogłoszenia nieruchomości, cenniki usług. Ceny są zapisywane w jednej walucie bazowej przez shortcode [wpcs_price] lub pole post meta i pokazywane w walucie wybranej przez odwiedzającego albo przypisanej do jego kraju.

Bez WooCommerce wtyczka nie ma żadnej zwykłej infrastruktury: filtrów cen, obsługi sesji ani usługi geolokalizacji. Musi sama zapamiętywać wybór odwiedzającego, pobierać kursy wymiany z zewnętrznych źródeł, które się zmieniają lub znikają, i działać za pełnostronicowym cache, który serwuje ten sam HTML wszystkim.

Odpowiedzią jest jeden potok cen (kurs, precyzja, separatory, szablon symbolu), wymienne przechowywanie dla każdego odwiedzającego, dostawcy kursów, którzy zwracają kurs lub błąd zamiast zera, oraz tryb cache, w którym ceny są wypisywane jako oznaczone spany i renderowane ponownie dla każdego odwiedzającego jednym wywołaniem AJAX.

Wersja premium i darmowa na wordpress.org korzystają z jednej bazy kodu; wersja darmowa jest ograniczona do dwóch walut.

WPCS · przełącznik walut

co rozwiązano

AKTYWNYod 2016

Przeliczanie i formatowanie cen

shipped · 2016

Co to dajeOdwiedzający widzą ceny w swojej walucie, z właściwym symbolem i miejscami dziesiętnymi. Właściciele mogą dodać marżę do kursów lub ustawić stałe ceny dla poszczególnych walut.

Problem
Ceny we wpisach są zapisane w jednej walucie bazowej. Każdy odwiedzający musi je widzieć przeliczone po właściwym kursie, z właściwą precyzją, separatorami i położeniem symbolu, bez funkcji cen WooCommerce.
Rozwiązanie

Wszystkie ceny przechodzą przez jeden potok: mnożenie przez kurs, formatowanie z precyzją i separatorami dla każdej waluty, a następnie opakowanie w szablon symbolu i oznaczony span, który zachowuje kwotę bazową.

Technologie
  • PHP
  • Shortcode
  • number_format
Zadania · 6
Treść zawiera ceny tylko w walucie bazowej[wpcs_price] przelicza literalną wartość lub pole post meta po bieżącym kursie

Shortcode przyjmuje value albo meta_value z opcjonalnym post_id; post_id bez meta_value czyta klucz meta wpcs_price. price() mnoży przez kurs tylko wtedy, gdy bieżąca waluta różni się od bazowej, a następnie przekazuje liczbę do format_price_numeric() i filtra wpcs_price.

price_html() opakowuje wynik w span z unikalnym ID i data-amount zawierającym wartość bazową, której tryb cache strony używa później do ponownego renderowania.

Niektóre ceny nie mogą podążać za kursem wymianytype="fixed" przyjmuje kwoty dla poszczególnych walut, np. 'USD:15,EUR:20'

Dla cen stałych shortcode parsuje listę do mapy i pokazuje kwotę dla bieżącej waluty albo 'none', jeśli jej brakuje. Lista ceny we wszystkich walutach używa tej samej mapy zamiast przeliczać.

Waluty różnią się groszami/centami, miejscami dziesiętnymi i separatoramiPrecyzja z listy walut bez groszy i miejsc dziesiętnych dla każdej waluty; separatory dla każdej waluty

JPY i TWD są zawsze pokazywane bez groszy/centów; do tej listy można dodać dowolną walutę przez hide_cents. Ustawienia obejmują miejsca dziesiętne dla każdej waluty oraz separatory dziesiętny i tysięcy dla każdej waluty. Wybór separatora jest indeksem w dwóch równoległych tablicach, gdzie indeks 0 oznacza ustawienie globalne, dzięki czemu istniejące witryny zachowują swoje formatowanie.

Witryny chcą marży ponad kursem rynkowym'Interest' dla każdej waluty dodawany do kursu przy odczycie; strona ustawień widzi kurs surowy

Interest to stała kwota zapisana obok kursu. get_currencies() dodaje ją do kursu wszędzie poza stroną ustawień wtyczki, więc administrator edytuje czysty kurs, a front przelicza po kursie skorygowanym. Filtr wpcs_currency_data_manipulation działa potem dla własnych reguł.

Pokazać jedną cenę we wszystkich walutach i przeliczać między dowolnymi dwiemaSformatowana cena parsowana z powrotem do bazowej, a potem przeliczana w przód; kurs krzyżowy to/from

Lista informacji o cenie usuwa separator tysięcy z już sformatowanego ciągu, normalizuje separator dziesiętny, przelicza z powrotem na bazową przez back_convert() (1/rate), a następnie w przód na każdą inną walutę. Endpoint [wpcs_converter] używa rate[to] / rate[from], oba względem bazowej, i pomija grosze/centy dla walut ich nie mających.

Cena musi czasem pokazywać się w jednej walucie dla wszystkich odwiedzającychfix_currency podmienia bieżącą walutę na czas jednej przeliczonej ceny, a potem ją przywraca

Dla przeliczonej ceny shortcode zapamiętuje walutę odwiedzającego, przełącza na żądaną, jeśli jest skonfigurowana, renderuje i przełącza z powrotem, żeby reszta strony zachowała wybór odwiedzającego.

Źródła kursów wymiany i aktualizacje

shipped · 2016

Co to dajeKursy wymiany aktualizują się same z kilku źródeł, a nieudana aktualizacja nigdy nie zamienia ceny w zero.

Problem
Darmowe API kursów się zmieniają, zamykają lub zaczynają wymagać kluczy; banki narodowe publikują kursy tylko względem własnej waluty; a nieudane pobranie nie może zastąpić działającego kursu zerem.
Rozwiązanie

Każde źródło jest dostawcą, który zwraca kurs względem waluty bazowej witryny albo -1 z komunikatem błędu; WP-Cron odświeża kursy i zapisuje tylko wartości większe od zera.

Technologie
  • PHP
  • wp_remote_get
  • SimpleXML
  • SoapClient
  • WP-Cron
Zadania · 6
API kursów pojawiają się, zmieniają i znikająDostawcy rozpoznawani po nazwie; nieznane nazwy trafiają do filtra dla własnych źródeł

Changelog śledzi te zmiany: Yahoo usunięte w 1.1.1 (2017), Google usunięte w 1.1.2 (2018), oba dodane z powrotem w 1.1.3 (2018), źródła, które przestały działać, usunięte ponownie w 1.1.3 i 1.1.4, własne agregatory przez hook w 1.1.5 (2020). Każde źródło jest klasą z getApiUrl() i parseResponse() na wspólnej bazie RateProvider.

get_rate_provider() mapuje wartość opcji na nazwę klasy; jeśli klasa nie istnieje, wpcs_add_aggregator_processor pozwala witrynie podpiąć własne źródło, a wpcs_announce_aggregator dodaje je do listy w ustawieniach. Lista w ustawieniach ma 14 źródeł.

Banki centralne notują każdą walutę względem własnejKursy krzyżowe liczone jako rate[to] / rate[base], gdy baza witryny jest inna

ECB publikuje względem EUR, Narodowy Bank Ukrainy względem UAH, Magyar Nemzeti Bank względem HUF. Każdy dostawca obsługuje trzy przypadki: bazą jest waluta banku, celem jest waluta banku, żadne z nich. Źródło MNB to usługa SOAP z przecinkami dziesiętnymi i notowaniami za jednostki (na przykład 100 JPY), normalizowanymi przed dzieleniem.

Nieudane pobranie nie może ustawić kursu zeroDostawcy zwracają -1 z błędem; cron zapisuje tylko kursy większe od zera

get_rate() zwraca tekst błędu dostawcy zamiast liczby, gdy kurs jest ujemny. rate_auto_update() rzutuje wyniki na float i zastępuje kurs tylko wtedy, gdy nowa wartość jest większa od zera, więc zepsute źródło nigdy nie zapisuje zera ani tekstu błędu jako kursu.

Kursy muszą się odświeżać bez otwierania ustawień przez administratoraZdarzenie WP-Cron z dodanymi harmonogramami 'week' i 'month'

Ustawienia oferują co godzinę, dwa razy dziennie, codziennie, co tydzień lub co miesiąc. Wtyczka rejestruje dwa dodatkowe interwały przez cron_schedules i przy załadowaniu planuje zdarzenie z wybranym interwałem, jeśli nie jest jeszcze zaplanowane.

Zmiana waluty bazowej unieważnia wszystkie zapisane kursysave_etalon() oznacza nową bazę i pobiera ponownie każdy kurs względem niej

Handler AJAX zapisuje nową flagę is_etalon, ustawia nową walutę domyślną w pamięci, żąda kursu dla każdej innej waluty przez aktywnego dostawcę i zwraca kursy do formularza ustawień.

Ręczne ustawianie wielu walut jest wolne i podatne na błędyWbudowana tabela 118 walut; dodawanie zbiorcze pobiera kurs i flagę (interfejs premium)

WPCS_World_Currencies przechowuje symbol, opis, miejsca dziesiętne i kod flagi dla każdej waluty. add_currencies_ajax() dodaje wybrane, pobiera kurs dla każdej, rejestruje nieznane symbole jako własne znaki i pobiera flagę do biblioteki mediów, wracając do zdalnego URL flagi, jeśli pobranie się nie powiedzie. Okno dodawania zbiorczego jest pokazywane tylko w wersji premium.

Waluta odwiedzającego i cache stron

shipped · 2016

Co to dajeKażdy odwiedzający zachowuje wybraną walutę także na stronach z cache, więc witryna może pozostać szybka bez pokazywania waluty kogoś innego.

Problem
Wybrana waluta należy do jednego odwiedzającego, ale pełnostronicowe cache serwują ten sam HTML wszystkim, a magazyn kluczowany po IP miesza odwiedzających za jednym proxy lub NAT.
Rozwiązanie

Wymienne przechowywanie dla każdego odwiedzającego oraz tryb cache, w którym przeglądarka prosi admin-ajax o ponowne wyrenderowanie wszystkich spanów cen strony z cache w walucie odwiedzającego.

Technologie
  • Transients
  • Cookies
  • Sesje PHP
  • admin-ajax
  • jQuery
Zadania · 5
HTML z cache pokazuje walutę tego, kto rozgrzał cacheTryb cache: JS zbiera wszystkie spany .wpcs_price i renderuje je ponownie jednym żądaniem

Każdy span ceny niesie unikalne ID i kwotę bazową. Przy włączonej opcji cache front.js wysyła pary id/kwota do wpcs_get_prices_html, które ustala walutę odwiedzającego po stronie serwera i zwraca mapę ID na nowy HTML oraz bieżącą walutę; widżety przełącznika są następnie z nią synchronizowane. Ten tryb jest obecny w kodzie z 2016 roku.

Gdy widżety przełącznika są ustawiane na zwróconą walutę, flaga powstrzymuje ich zdarzenia change przed wywołaniem kolejnego przełączenia waluty.

Hostingi różnią się tym, jaki magazyn dla odwiedzającego działaStrategia przechowywania wybierana w ustawieniach: sesja, transient kluczowany IP lub cookie

WPCS_STORAGE buduje backend po nazwie z abstrakcyjnej klasy Storage. SessionStorage::create() zwraca false, gdy session_start() się nie powiedzie, a wrapper wraca wtedy do magazynu transient. Każda wartość jest sanityzowana przy zapisie.

Odwiedzający za jednym IP nie mogą dzielić jednej wybranej walutyMagazyn cookie: losowy UUID w cookie, wartości w transients

Changelog podaje powód: transients kluczowane po IP mieszają użytkowników dzielących adres. CookieStorage kluczuje transients po UUID z cookie. Jeśli nagłówki zostały już wysłane w chwili tworzenia ID, wypisuje skrypt w stopce, który wysyła ID do endpointu AJAX sprawdzanego przez nonce, a ten ustawia cookie z czystej odpowiedzi.

?currency= w linkach dzieli cache i przecieka do udostępnianych URLTryb opcjonalny: ustawiać walutę przez AJAX i przeładować, bez parametru GET

W trybie domyślnym wpcs_redirect() odbudowuje bieżący URL, zachowując inne parametry GET i #anchor. W trybie 'No GET data in link' wysyła walutę do wpcs_set_currency_ajax i przeładowuje stronę. Parametry GET wypisywane do skryptu strony są najpierw rekurencyjnie sanityzowane.

Waluta powitalna lub geo musi zadziałać raz i nie nadpisywać wyboruFlaga pierwszej wizyty w magazynie; logika waluty domyślnej działa tylko, gdy wynosi 0

Przy pierwszym żądaniu waluta powitalna jest zapisywana i ustawiana jest flaga; reguły geo również działają tylko przy pierwszej unikalnej wizycie. Jeśli zapisana waluta zostanie później usunięta z listy, get_currencies() wraca do bazowej.

Wybór waluty po Geo-IP

shipped · 2017

Co to dajeNowi odwiedzający automatycznie widzą walutę swojego kraju, według reguł ustawionych przez właściciela, bez płacenia za usługę lokalizacji.

Problem
Bez WooCommerce nie ma usługi geolokalizacji, więc wtyczka musi mapować IP odwiedzającego na kraj na dowolnym hostingu, za proxy i CDN, bez płatnego API.
Rozwiązanie

Dołączona baza krajów MaxMind za interfejsem resolvera, z opcjonalną bazą GeoIP2 pobieraną przez właściciela witryny, oraz reguły administracyjne mapujące kraje na waluty.

Technologie
  • MaxMind GeoIP (starszy)
  • GeoIP2 / GeoLite2
  • PharData
  • Composer
Zadania · 4
Wykrywanie kraju na witrynie bez WooCommerceDołączony MaxMind GeoIP.dat z jego czytnikiem PHP

WC_Geolocation z WooCommerce nie jest dostępne na zwykłej witrynie WordPress, więc wtyczka dostarcza własną bazę krajów. lib/GeoIP.dat i geoip.inc są opakowane w OpenIpCountryResolver z cache dla każdego IP w obrębie żądania.

Prawdziwe IP klienta jest ukryte za proxy i CDNCzytać X-Real-IP, potem pierwszy hop X-Forwarded-For, potem REMOTE_ADDR

Z dołączoną bazą nagłówek Cloudflare HTTP_CF_IPCOUNTRY jest używany bezpośrednio, a wyszukiwanie w bazie jest pomijane. Żądanie, którego REMOTE_ADDR to 127.0.0.1 lub ::1, jest rozpoznawane jako 8.8.8.8, zanim zostaną odczytane nagłówki proxy.

Starsze dane krajów są mniej dokładneOpcja GeoIP2: GeoLite2 .mmdb pobierane i rozpakowywane w panelu

Z kluczem licencyjnym MaxMind administrator pobiera archiwum GeoLite2-Country; handler rozpakowuje .tar.gz przez PharData, znajduje plik .mmdb, kopiuje go do uploads/currency-switcher i usuwa pliki tymczasowe przy sukcesie i przy błędzie. Bez klucza wtyczka pozostaje na dołączonej bazie. Wyszukiwanie odbywa się przez pakiet Composer geoip2.

Mapować kraje na waluty, z nadpisaniem na poziomie koduReguły currency => countries; filtr wpcs_geo_position nadpisuje kraj

init_geo_currency() ustala kraj, przepuszcza go przez wpcs_geo_position, zapisuje dla odwiedzającego i stosuje pierwszą pasującą regułę tylko przy pierwszej wizycie. [wpcs_check_country] wypisuje wykryty kraj do debugowania reguły.

Utwardzanie publicznych danych wejściowych

shipped · 2021

Co to dajeAnonimowi odwiedzający nie mogą nadużyć przełącznika walut do wstrzyknięcia treści ani zmiany ustawień, więc ceny i strony pozostają takie, jak ustawił właściciel.

Problem
Przełącznik działa na każdej stronie frontu, udostępnia anonimowym odwiedzającym endpointy AJAX i przyjmuje atrybuty shortcode od autorów, więc dane z zewnątrz trafiają do HTML, magazynu i ustawień.
Rozwiązanie

Sprawdzać kody walut z URL i formularza przełącznika względem skonfigurowanej listy, ograniczać i sprawdzać wzorcem tablice z żądań, escapować atrybuty i kodować JSON dla kontekstu HTML.

Technologie
  • PHP
  • esc_attr
  • sanitize_text_field
  • Nonces
Zadania · 5
Publiczny endpoint cen przyjmuje tablicę od anonimowych odwiedzającychMaks. 500 pozycji, sprawdzanie wzorca ID, kontrole skalarów, wyjście JSON_HEX_*

wpcs_get_prices_html jest dostępne dla anonimowych odwiedzających. Przycina dane wejściowe do 500 wpisów, akceptuje tylko ID zgodne ze zbiorem znaków uniqid() używanym przez price_html(), pomija ceny nieskalarne i koduje odpowiedź flagami JSON_HEX_TAG, AMP, APOS i QUOT, ponieważ admin-ajax serwuje ją jako text/html.

Wartości shortcode trafiają do atrybutów data HTMLAtrybuty data-* budowane z esc_attr() na kluczu i wartości

price_html() zapisuje wartości pochodzące z atrybutów [wpcs_price], takie jak kwota bazowa albo surowa lista 'USD:15,EUR:20' ceny stałej, w atrybutach data-* spanu ceny. Klucze i wartości są escapowane i ujęte w cudzysłów, więc wartość atrybutu nie może wstrzyknąć znaczników.

Endpoint kursów buduje ciąg shortcode z danych wejściowych żądaniaLista wykluczeń przecięta ze znanymi kodami, waluta zwalidowana, precyzja przez intval

wpcs_rates_current_currency przekazuje dane odwiedzającego do do_shortcode(). Przetrwają tylko kody walut istniejące w konfiguracji, wynik przechodzi przez esc_attr, a precyzja jest rzutowana na int, więc nie da się wstrzyknąć dodatkowej składni shortcode.

Waluta z URL lub formularza przełącznika może być dowolnym ciągiemWartości z URL i formularza akceptowane tylko, jeśli są skonfigurowanymi kodami; zapisane wartości sanityzowane

Pole formularza przełącznika walut i parametr ?currency= są sprawdzane przez array_key_exists() względem skonfigurowanej listy, zanim trafią do magazynu, a WPCS_STORAGE::set_val() sanityzuje każdą wartość.

Symbole w encjach HTML psuły się przy obiegu formularza ustawieńSymbole wysyłane jako hasze md5 i mapowane z powrotem na znaną listę symboli

Symbole takie jak руб. są zapisywane jako encje. Pole select wysyła md5(symbol), a handler zapisu mapuje hasz z powrotem na oryginalną encję ze znanej listy, więc encja nie jest ani podwójnie kodowana, ani brana z surowych danych wejściowych. Zapis jest chroniony przez check_admin_referer(), a position jest sprawdzane względem stałej listy.

Liczby

wordpress.org
  • Aktywne instalacje 900+ licznik wordpress.org.
  • Opinie 13 Średnia ocena: 4.1 na 5.
  • Lat wsparcia 10 Od 26 maja 2016, ostatnia aktualizacja 21 września 2026.