FOX
Wtyczka WooCommerce, która pokazuje ceny w walucie wybranej przez odwiedzającego i opcjonalnie pozwala przyjąć w niej płatność.
- Pierwsze wydanie
- Aktywne instalacje
- 50 000+
- Ocena
- Czytaj opinie
O mnie
FOX przelicza kwoty tworzone przez WooCommerce na walutę wybraną przez odwiedzającego i może pozwolić klientowi zapłacić w tej walucie. WooCommerce zna tylko jedną walutę sklepu, więc wtyczka działa, przechwytując gettery cen produktów, stawki wysyłki, kupony, sumy koszyka, wyświetlanie zamówień i e-maile i przeliczając każdą kwotę raz, po zapisanym kursie.
Trudność polega na tym, że jedna cena przechodzi przez wiele ścieżek kodu WooCommerce: część jest cache'owana, część działa w żądaniach w tle, część w wp-admin. Każda ścieżka musi widzieć właściwą walutę. Witryna sklepu używa waluty odwiedzającego, e-maile i edytor zamówień używają waluty zamówienia, a eksporty, znaczniki dla wyszukiwarek i analityka używają waluty bazowej. Wersja premium utrzymuje też WooCommerce REST API i ładunki webhooków w walucie bazowej.
Wokół tego rdzenia znajdują się: import kursów z 15 źródeł z własnym harmonogramem i limitami zdrowego rozsądku, przechowywanie waluty dla każdego odwiedzającego, działające za pełnostronicowym cache, zaokrąglanie i formaty liczb dla każdej waluty, ceny ręczne dla waluty, kraju i roli użytkownika oraz przeliczanie zapisanych zamówień między walutami zarówno w HPOS, jak i w starszym magazynie zamówień.
Wersja darmowa na wordpress.org używa tej samej głównej klasy i jest ograniczona do dwóch walut w get_currencies().
FOX · przełącznik walut
co rozwiązano
Przeliczanie cen wewnątrz WooCommerce
shipped · 2014Co to dajeKażda cena jest przeliczana dokładnie raz, więc klienci nigdy nie widzą podwojonych ani błędnych kwot. Właściciel może ustawić stałe ceny dla waluty, kraju lub roli klienta.
- Problem
- WooCommerce ma jedną walutę sklepu i odczytuje ceny przez wiele getterów, cache i budowniczych HTML. Każda kwota musi zostać przeliczona dokładnie raz, a niektórych kwot nie wolno przeliczać wcale.
- Rozwiązanie
Jeden konwerter siedzi na getterach cen produktów z priorytetem 9999. Ceny ręczne mają pierwszeństwo przed przeliczeniem po kursie, a dla kwot, które są już ostateczne, istnieją jawne przełączniki pomijania.
- Technologie
Przeliczać ceny produktów prostych i wariantów raz, na warstwie danychPodpiąć jeden konwerter z priorytetem 9999 pod gettery cen produktu i wariantu
W trybie, w którym klient płaci w wybranej walucie, raw_woocommerce_price() jest podpięte do woocommerce_product_get_price, getterów ceny regularnej i promocyjnej oraz getterów wariantów. Działanie z priorytetem 9999 stawia je za innymi wtyczkami, które korygują cenę bazową. W trybie tylko do wyświetlania używany jest wyłącznie filtr raw_woocommerce_price, więc zapisane kwoty koszyka i zamówienia pozostają w walucie bazowej.
Przypadki brzegowe obsługiwane w konwerterze: puste ceny przechodzą bez zmian, rodzic produktu z wariantami odpytany z display=false jest pomijany, by nie przeliczać min/max dwa razy, a getter ceny promocyjnej zwraca pusty ciąg, gdy nie zapisano ceny promocyjnej. Bez tego przeliczona pusta cena promocyjna staje się 0, a WooCommerce pokazuje przekreśloną cenę.
Cache cen wariantów współdzielony między wszystkimi walutamiDodać bieżącą walutę do hasza cen wariantów, by każda waluta miała własny wpis
WooCommerce cache'uje obliczone tablice cen produktu z wariantami w transient z kluczem z hasza danych wejściowych cen. Jeśli waluta nie jest częścią tego hasza, przeliczone ceny pierwszego odwiedzającego są serwowane wszystkim. woocommerce_get_variation_prices_hash() dołącza bieżącą walutę.
woocommerce_variation_prices() przelicza następnie każdy wpis, stosuje stałe ceny wariantów i sortuje ponownie każdą tablicę przez asort(). Zakres cen jest odczytywany z pierwszego i ostatniego elementu, a stałe ceny dla poszczególnych walut mogą zmienić kolejność wariantów w porównaniu z walutą bazową.
Ceny ręczne dla waluty, kraju i roli w jednym potokuStała cena w walucie jest ostateczna; cena dla kraju lub roli zastępuje cenę bazową przed przeliczeniem po kursie
Stałe ceny są zapisywane jako meta produktu dla każdego pola i waluty (_woocs_regular_price_EUR, _woocs_sale_price_EUR), gdzie -1 oznacza 'nie ustawiono, użyj kursu'. Stała cena w walucie odwiedzającego jest używana bez zmian. W przeciwnym razie cena dla kraju zastępuje cenę bazową, a wynik jest przeliczany po kursie. Ceny dla krajów grupują kraje w bloki z jedną ceną na blok, a kraj odwiedzającego pochodzi z geolokalizacji WooCommerce zapisanej w stanie odwiedzającego.
Ceny dla ról są stosowane po tym kroku. Gdy cena jest ustawiona dla roli użytkownika, zastępuje dotychczas wybraną cenę, w tym stałą cenę w walucie, i jest przeliczana po kursie.
Gdy cena promocyjna dla kraju zostaje pusta, get_product_geo_data() kopiuje do niej cenę regularną, bo inaczej produkt stałby się w tym kraju darmowy. Gdy stałe pole ceny promocyjnej jest puste, wyszukiwanie wraca do stałego pola ceny regularnej.
Filtr ceny dostaje liczbę, a nie nazwę pola cenyDopasować wartość do zapisanych cen regularnej i promocyjnej, a potem sięgnąć po notatkę z żądania
Stałe ceny są zapisywane dla każdego pola, ale woocommerce_product_get_price przekazuje tylko liczbę. get_price_type() porównuje przychodzącą wartość z surowymi cenami regularną i promocyjną produktu, odczytanymi w kontekście 'edit'. Jeśli żadna nie pasuje, trzyma statyczną mapę pierwszej ceny widzianej dla każdego produktu w żądaniu i traktuje późniejszą, większą wartość jako cenę regularną.
To heurystyka, więc jawne typy pól są przekazywane wszędzie tam, gdzie wywołujący je zna. Ceny dla ról używają własnej kopii tej samej logiki.
Pokazać cenę jednego produktu we wszystkich walutach w jednym renderzePrzełączać bieżącą walutę dla każdego wpisu i odbudowywać zakresy dla typów z wariantami i grupowanych
Opcjonalna lista cen pod produktem jest budowana wewnątrz woocommerce_price_html(). Dla każdej waluty bieżąca waluta jest przełączana, wartość jest formatowana z miejscami dziesiętnymi i separatorami tej waluty, a następnie oryginalna waluta jest przywracana.
Zakresu produktu z wariantami nie da się obliczyć jako bazowe min/max razy kurs, bo poszczególne warianty mogą mieć stałe ceny. _get_min_max_variation_prices() przelicza cenę każdego wariantu dla waluty docelowej i odrzuca wartości zerowe. Produkty grupowane iterują po swoich dzieciach i tak samo obsługują dzieci z wariantami.
Pozwolić innemu kodowi oznaczyć kwotę jako ostateczną albo przeliczać własne kwotyFiltr woocs_skip_conversion, wewnętrzna flaga blokady, publiczne filtry przeliczania i przeliczania wstecznego
woocs_skip_conversion jest sprawdzany w konwerterze jako pierwszy: integracja, która już wyceniła pozycję w aktywnej walucie, zwraca true, a kwota przechodzi bez zmian. Flaga żądania woocs_block_price_hook wyłącza przeliczanie dla fragmentu kodu, używana na przykład podczas budowania ładunków webhooków.
Dla przeciwnego kierunku woocs_convert_price i woocs_back_convert_price pozwalają wtyczkom zewnętrznym przeliczać własne kwoty w walucie bazowej, a convert_from_to_currency() przelicza między dowolnymi dwiema walutami sklepu przez walutę bazową: value / rate_from * rate_to.
Zaokrąglanie, miejsca dziesiętne i formaty liczb
shipped · 2016Co to dajeCeny pokazują się z właściwą liczbą miejsc dziesiętnych i separatorami dla każdej waluty, a kwoty wpisywane przez pracowników lub wysyłane do bramki płatności pozostają poprawne.
- Problem
- Waluty różnią się liczbą miejsc dziesiętnych i separatorami, a WooCommerce czyta je z globalnych opcji, które są wspólne dla wyświetlania, parsowania wpisywanych kwot i obliczeń podatku.
- Rozwiązanie
Wartości dla poszczególnych walut są wstrzykiwane przez filtry opcji i wyłączane w kontekstach, w których WooCommerce parsuje dane wejściowe lub zaokrągla w walucie bazowej.
- Technologie
Miejsca dziesiętne dla każdej waluty przez jedną globalną opcję WooCommerceFiltrować pre_option_woocommerce_price_num_decimals liczbą miejsc dziesiętnych aktywnej waluty
WooCommerce czyta liczbę miejsc dziesiętnych z jednej opcji. FOX odpowiada na tę opcję ustawieniem bieżącej waluty, a konwerter zaokrągla przez number_format() do tej samej precyzji, więc zapisana wartość koszyka i wyświetlana wartość są zgodne.
JPY i TWD są na sztywno zapisane jako waluty bez groszy/centów, administrator może dodać kolejne, a filtr woocs_precision_on_calc pozwala witrynie nadpisać precyzję dla poszczególnych walut.
Kwoty w walucie bazowej zaokrąglone do miejsc dziesiętnych waluty odwiedzającegoZwracać bazowe miejsca dziesiętne w trakcie dodawania stawki wysyłki i dla surowych tablic wariantów
Stawki wysyłki są obliczane w walucie bazowej i przeliczane później w woocommerce_package_rates. Gdyby najpierw zaokrąglono je do miejsc dziesiętnych waluty odwiedzającego (na przykład 0 dla JPY), wartość bazowa straciłaby precyzję przed przeliczeniem. woocs_fix_decimals() zwraca bazowe miejsca dziesiętne, gdy add_rate jest na stosie wywołań.
To samo dotyczy tablic cen wariantów: woocs_fix_variation_decimal() formatuje je z bazowymi miejscami dziesiętnymi, zanim przejdzie po nich konwerter.
Separatory dla poszczególnych walut psują kwoty wpisywane w edytorze zamówieńWykrywać ekrany zamówień i ich wywołania AJAX i zachowywać tam separatory sklepu
Separatory dziesiętny i tysięcy są filtrowane dla każdej waluty (sześć schematów w get_decimal_sep() i get_thousand_sep()). W edytorze zamówień w wp-admin pola wejściowe WooCommerce, ich walidacja JS i wc_format_decimal() zakładają separator sklepu, więc przecinek jako separator dziesiętny zmieniłby zapisywane kwoty. Dlatego separatory dla poszczególnych walut są w edytorze zamówień wyłączane.
woocs_is_admin_order_edit_context() rozpoznaje akcje AJAX edytora zamówień po nazwie, inne wywołania AJAX po referer (strona wc-orders, typ treści shop_order, ID wpisu zamówienia) oraz ekrany HPOS i starsze. Część dotycząca żądania jest cache'owana w zmiennej statycznej; sprawdzenie ekranu jest wykonywane ponownie, bo get_current_screen() jest puste na początku żądania. Kwoty zwrotów wpisane z przecinkiem są normalizowane, zanim WooCommerce je zwaliduje.
Bramka odrzuca ułamkowe kwoty w walutach bez miejsc dziesiętnychPrzepisać pola kwoty i podatku PayPal Standard jako liczby całkowite dla walut bez groszy
apply_conversion() działa na woocommerce_paypal_args i przeformatowuje każde pole amount_* i tax_cart do 0 miejsc dziesiętnych, gdy bieżąca waluta nie ma groszy/centów. enable_custom_currency() rozszerza białą listę walut PayPal w WooCommerce, żeby bramka pozostała dostępna, gdy odwiedzający płaci w walucie innej niż bazowa.
Drobne kursy kryptowalut wypisywane w notacji naukowejFormatować kursy z 15 cyframi znaczącymi i przycinać końcowe zera
Kurs taki jak liczba monet na USD może być znacznie poniżej 0.0001, a konwersja float na ciąg w PHP daje notację wykładniczą, której formularz administracyjny i e-mail z kursami nie mogą użyć. rate_to_string() oblicza liczbę miejsc dziesiętnych z log10 wartości, ogranicza ją do 20 i usuwa końcowe zera.
Waluta każdego odwiedzającego na witrynach z cache
shipped · 2016Co to dajeKażdy odwiedzający zachowuje wybraną walutę, także na witrynach z cache i w sieciach współdzielonych, a mini koszyk i wysyłka aktualizują się po przełączeniu.
- Problem
- Wybrana waluta jest stanem należącym do odwiedzającego, ale pełnostronicowe cache serwują jeden HTML wszystkim, a wielu hostingodawców psuje sesje PHP albo ukrywa wielu odwiedzających za jednym IP.
- Rozwiązanie
Przechowywanie waluty jest wymienne i obejmuje sześć backendów. Na witrynach z cache ceny są renderowane jako znaczniki i przerysowywane przez AJAX względem klucza przechowywanego w przeglądarce.
- Technologie
Hostingi, na których sesje PHP nie przetrwają między żądaniamiJeden interfejs przechowywania nad sesją, transient, własną sesją w bazie, Memcached, Redis, cookie
WOOCS_STORAGE udostępnia set_val/get_val/is_isset i przełącza się według skonfigurowanego backendu. Magazyn transient ma klucz z hasza IP klienta, z preferowanym CF-Connecting-IP za Cloudflare, ponieważ Cloudflare nadpisuje każdą wartość podaną przez klienta. Obsługiwane są także Memcached i Redis.
WOOCS_SESSION wykorzystuje ponownie tabelę woocommerce_sessions z ciasteczkiem podpisanym HMAC, czyta przez object cache i zapisuje przy shutdown tylko wtedy, gdy dane się zmieniły.
Odwiedzający za jednym wspólnym IP widzą nawzajem swoją walutęKluczować magazyn transient losowym identyfikatorem przeglądarki trzymanym w localStorage
Przy magazynie transient i włączonym trybie cache front.js tworzy raz losowy identyfikator (crypto.randomUUID, jeśli dostępne) i wysyła go z każdym żądaniem. Serwer sanityzuje go przez sanitize_key() i haszuje do klucza transient, więc użytkownicy za NAT w biurze lub u operatora mobilnego dostają osobne kubełki. Identyfikator jest celowo generowany małymi literami: sanitize_key() zamienia litery na małe, a identyfikator z mieszanymi wielkościami liter dałby hasz do innego kubełka.
W tym trybie transient żyje 30 dni zamiast 1, bo klucz jest stały dla przeglądarki. Jeśli localStorage jest zablokowane, kod po cichu wraca do klucza z IP.
Bloki i żądania Store API omijają jQuery i tracą kluczOpakować window.fetch przy ładowaniu i dodawać klucz jako nagłówek do wywołań z tego samego źródła
Żądania jQuery dostają klucz przez handler ajaxSend, ale WooCommerce Blocks, Store API i PayPal Payments używają fetch() i startują przed DOM ready. Wrapper jest instalowany na najwyższym poziomie. Klucz idzie w nagłówku X-WOOCS-SK, a nie w argumencie zapytania, ponieważ argument zapytania różny dla każdego odwiedzającego rozbiłby cache strony na odwiedzających. Wywołania między różnymi źródłami (cross-origin) są pomijane, ponieważ własny nagłówek wywołuje CORS preflight, który może zepsuć SDK płatności.
Po stronie PHP żądania wp-json do tras koszyka, sklepu i batch utrzymują wtyczkę załadowaną, żeby blokowy koszyk i kasa renderowały się w walucie odwiedzającego.
Cache strony serwuje ceny wyrenderowane dla innego odwiedzającegoOpakować każdą cenę w znacznik i przerysować wszystkie znaczniki jednym żądaniem AJAX
woocommerce_price_html() opakowuje każdą cenę w span z ID produktu i unikalnym ID przerysowania. Na stronie z cache front.js zbiera znaczniki i wysyła je do woocs_get_products_price_html; JSON wariantów w formularzu dodawania do koszyka i własne shortcode cen są odświeżane w ten sam sposób. Styl preloadera może ukrywać nieaktualne ceny do czasu nadejścia odpowiedzi.
Serwer zwraca pustą odpowiedź, gdy waluta, w której wyrenderowano stronę z cache, jest już równa zapisanej walucie odwiedzającego, więc takie wyświetlenie strony nie kosztuje renderowania. Renderuje get_price_html() tylko dla opublikowanych, widocznych produktów.
Mini koszyk i wysyłka zostają w starej walucie po przełączeniuDodać walutę do hasza koszyka WooCommerce i wymusić odświeżenie fragmentów
WooCommerce przechowuje fragmenty koszyka w sessionStorage z kluczem z hasza koszyka, a hasz zależy tylko od zawartości koszyka. FOX filtruje woocommerce_cart_hash do md5(cart + currency), więc przełączenie unieważnia zapisane fragmenty, a wysyłka jest przeliczana na nowo.
Gdy waluta przychodzi w URL na stronie z cache, front.js najpierw odbija ją do kubełka z kluczem przeglądarki, a dopiero potem wywołuje wc_fragment_refresh, bo inaczej odświeżenie czytałoby pusty kubełek i wracało do waluty bazowej.
Kody walut przychodzą z URL, AJAX, REST i nieaktualnego magazynuAkceptować tylko kody z listy sklepu; ukryte waluty tylko dla osób zarządzających zamówieniami
set_currency() zapisuje tylko włączone waluty, a zapisana wartość jest ponownie sprawdzana przy każdym żądaniu, więc waluta usunięta przez administratora wraca do bazowej. get_woocommerce_currency() nigdy nie zwraca WooCommerce nieznanego kodu, bo WooCommerce zapisałby go w zamówieniu.
Walut oznaczonych jako prywatne nie można wybrać przez ?currency= ani przełącznik AJAX. Wartość żądania woocs_in_order_currency akceptuje walutę prywatną tylko dla użytkowników z edit_shop_orders.
Koszyk, wysyłka, kupony i płatność
shipped · 2015Co to dajeKoszty wysyłki, minimalne kwoty darmowej wysyłki i kupony działają poprawnie w walucie klienta, a kasa obciąża tylko w walutach akceptowanych przez sklep.
- Problem
- Koszty wysyłki, kwoty kuponów i progi są zapisane w walucie bazowej, ale porównywane z sumami koszyka, które są już przeliczone.
- Rozwiązanie
Każda kwota jest przeliczana tam, gdzie WooCommerce ją zużywa, a każde sprawdzenie progu odbywa się w jednej walucie przez przeliczenie wsteczne strony koszyka.
- Technologie
Koszty wysyłki i podatki od wysyłki w wybranej waluciePrzeliczyć koszt i tablicę podatku każdej stawki w package_rates albo użyć stałego kosztu dla waluty
woocommerce_package_rates() mnoży koszt i każdy wpis podatku przez kurs i zaokrągla do miejsc dziesiętnych waluty. Stały koszt flat-rate dla waluty jest zapisywany w opcji z ustawieniami instancji metody wysyłki. Gdy używany jest stały koszt, skalowanie starego podatku byłoby błędne, więc podatek jest obliczany ponownie przez WC_Tax::calc_shipping_tax().
Formuły flat-rate używają kosztu koszyka, który jest już przeliczonyPodzielić argument [cost] przez kurs, bo wynikowa stawka jest przeliczana później
Koszt flat-rate taki jak '[cost] * 0.1' dostaje koszt koszyka w walucie odwiedzającego, a wynikowa stawka wysyłki jest następnie przeliczana ponownie w woocommerce_package_rates. woocommerce_fix_shipping_calc() najpierw dzieli argument kosztu przez kurs, więc przeliczenie następuje raz.
Minimum darmowej wysyłki porównywane między dwiema walutamiZaimplementować sprawdzenie dostępności od nowa i przeliczyć wstecz sumę częściową i rabaty na walutę bazową
Metoda darmowej wysyłki porównuje wyświetlaną sumę częściową z min_amount. Gdy klient płaci w wybranej walucie, suma częściowa koszyka jest w tej walucie, więc sprawdzenie jest zaimplementowane od nowa: suma częściowa jest przeliczana wstecz po bieżącym kursie, rabat i podatek od rabatu są przeliczane wstecz także, respektowane są ustawienia ignore_discounts i wyświetlania podatku, a wymagania coupon/either/both są oceniane tak jak w WooCommerce.
Jeśli ustawiono stałe minimum dla waluty, jest ono również przeliczane wstecz, więc obie strony porównania są w walucie bazowej.
Kupony o stałej kwocie i limity wydatków zapisane w walucie bazowejPrzeliczać kwotę i min/max wydatków przy ładowaniu obiektu kuponu, pomijając kupony procentowe
woocommerce_coupon_loaded() przelicza kwotę kuponu (nie dla typów percent i percent_product) oraz minimalne i maksymalne wydatki, a następnie zapisuje je z powrotem setterami kuponu, więc cała walidacja WooCommerce działa w jednej walucie. Stałe kwoty kuponów i limity dla poszczególnych walut, zapisane jako meta kuponu, nadpisują wartości przeliczone.
Kasa musi obciążać w walucie akceptowanej przez sklepWymuszać walutę bazową przy każdym wejściu do kasy w trybie tylko do wyświetlania; filtrować bramki
W trybie tylko do wyświetlania waluta jest resetowana do bazowej na stronie kasy, w checkout_process, w kasie blokowej i przy aktualizacjach podsumowania zamówienia. W trybie płatności w wybranej walucie żądanie kasy czyta zapisaną walutę jawnie, a opcjonalnie waluta jest wymuszana na podstawie kraju odwiedzającego. Oczekujące zamówienie opłacane później z linku do płatności jest przełączane na własną walutę zamówienia.
Bramki płatności można ukrywać lub pokazywać dla poszczególnych walut, ponieważ wiele bramek obsługuje tylko niektóre waluty.
Kursy wymiany: źródła, harmonogram, zabezpieczenia
w produkcieCo to dajeKursy wymiany aktualizują się według harmonogramu z wielu źródeł. Nieudany lub absurdalny kurs jest odrzucany zamiast przeceniać cały sklep, a można dodać marżę.
- Problem
- Kursy pochodzą z wielu API o różnych bazach i formatach, muszą odświeżać się według harmonogramu na witrynach, gdzie WP-Cron jest zawodny, a jedna zła odpowiedź nie może przeceniać sklepu.
- Rozwiązanie
Jedna klasa dostawcy na źródło normalizuje dane do 'jednostek na 1 bazy', harmonogram oparty na opcji działa przy zwykłych żądaniach, nieudane pobranie nigdy nie zapisuje zera ani tekstu błędu jako kursu, a nowe kursy można ograniczać limitami dla poszczególnych walut.
- Technologie
Piętnaście źródeł kursów o różnych bazach i formatach danychAbstrakcyjny RateProvider z URL i parserem dla każdego źródła, ładowany według konwencji nazewnictwa klas
RateProvider::getRate() buduje URL, pobiera z limitem czasu i deleguje do parseResponse(). Kanały banków centralnych są notowane względem ich własnej waluty, więc parsery obliczają kursy krzyżowe: ECB opiera się na EUR, a kanał Banku Rosji niesie też Nominal (kurs za 10 lub 100 jednostek), przez który trzeba podzielić.
get_rate_provider() mapuje skonfigurowaną nazwę źródła na plik klasy. Witryny mogą dodawać własne źródła przez filtry woocs_add_custom_rate i woocs_add_aggregator_processor.
API cen kryptowalut traktuje każdy ticker, w tym CAD, jak monetęOdrzucać kody walut tradycyjnych przed żądaniem i odwracać USD za monetę na monety za USD
Źródło Pulse Verity zwraca cenę w USD dla dowolnego symbolu, więc kod waluty tradycyjnej po cichu dostałby cenę niezwiązanego tokena. Dostawca najpierw sprawdza zakodowaną na sztywno listę ISO 4217, ponieważ wtyczki płatności kryptowalutowych dodają monety do listy walut WooCommerce i tej listy nie można ufać. Działa tylko z bazą USD, wysyła klucz API jako nagłówek Bearer, raportuje własny kod błędu API dla każdej odpowiedzi innej niż 2xx (zły klucz, ograniczenie planu, limit żądań) i odrzuca ceny zerowe lub nienumeryczne. Zwrócona cena USD za monetę jest odwracana na monety za 1 USD.
Aktualizacje kursów na witrynach, gdzie WP-Cron jest zawodny lub ruch jest stałyWłasny harmonogram w jednej opcji, sprawdzany przy zwykłych żądaniach; podpinanie nigdy nie przesuwa oczekującego uruchomienia
PN_WP_CRON_WOOCS trzyma start, next, interwał i ostatnie uruchomienie dla każdego hooka w jednej opcji i jest sprawdzany z init, admin_init i rest_api_init. Ponieważ jest wywoływany przy każdym żądaniu, attach() musi być idempotentne: przy niezmienionym interwale zostawia next bez zmian, a przy zmianie interwału oblicza next od ostatniego uruchomienia, ograniczone do teraz plus jeden interwał. Trzy hooki są rejestrowane z 0 przyjmowanymi argumentami, ponieważ rest_api_init przekazuje obiekt WP_REST_Server, który inaczej trafiłby do parametru $reset i restartował harmonogram przy każdym żądaniu REST.
process() przesuwa następne uruchomienie do przodu przed wywołaniem hooka, przechwytuje i loguje wyjątki rzucane przez niego i uruchamia każdy hook co najwyżej raz na żądanie. Zaktualizowany harmonogram jest zapisywany w opcji po wykonaniu hooków.
Jedna nieudana lub absurdalna odpowiedź API nie może przeceniać całego sklepuZastępować kurs tylko liczbą dodatnią i ograniczać nowe kursy dolnym i górnym limitem dla każdej waluty
rate_auto_update() pobiera każdą walutę we własnym bloku try i zastępuje kurs tylko liczbą dodatnią, więc zawodząca waluta lub źródło nie zatrzymuje pozostałych i nigdy nie zapisuje zera ani tekstu błędu jako kursu. get_rate() przepuszcza każdy kurs liczbowy przez ExchangeRateLimiter, który ogranicza go do opcjonalnego dolnego i górnego limitu dla waluty. Po zapisie akcja woocs_sheduler_rates_updated pozwala innemu kodowi zareagować.
Zmiana waluty bazowej unieważnia wszystkie zapisane kursyOznaczyć nową bazę i pobrać wszystkie kursy ponownie względem niej w tym samym żądaniu
Wszystkie kursy są zapisane jako jednostki na 1 bazy, więc nowa baza sprawia, że każda liczba jest błędna naraz. save_etalon() zapisuje flagę nowej bazy, przełącza default_currency w pamięci i wywołuje get_rate() dla każdej innej waluty, zanim odpowie ekranowi administracyjnemu, dzięki czemu formularz jest wypełniany spójnymi wartościami.
Sklepy dodają marżę ponad kursy rynkoweStosować stałą lub procentową marżę dla każdej waluty w jednym filtrze nad listą walut
Marża jest zapisana obok kursu jako stała kwota lub procent i stosowana w filtrze woocs_currency_data_manipulation z priorytetem 1, więc każdy konsument get_currencies() widzi kurs z marżą. get_currencies(true) pomija filtry, gdy potrzebna jest wartość surowa.
Zamówienia, e-maile i raporty po sprzedaży
w produkcieCo to dajeKażde zamówienie zachowuje walutę i kurs, po którym zostało opłacone, więc e-maile, faktury, edycje zamówień i raporty sprzedaży pokazują właściwe kwoty.
- Problem
- Zamówienie jest zapisane w walucie, w której zostało opłacone, a ekrany administracyjne, e-maile, faktury, analityka i późniejsze edycje działają z inną bieżącą walutą.
- Rozwiązanie
Kurs z kasy jest zapisywany w zamówieniu, waluta zamówienia jest wymuszana wszędzie tam, gdzie zamówienie jest renderowane, a wiersze analityki są przeliczane z powrotem na walutę bazową.
- Technologie
Wiedzieć później, po jakim kursie zamówienie zostało opłaconeZapisać kurs i walutę bazową jako meta zamówienia przez API CRUD w kasie
W kasie i na stronie podziękowania kurs, waluta bazowa i znacznik 'zmieniono ręcznie' są zapisywane przez $order->update_meta_data(), co działa zarówno w HPOS, jak i w magazynie wpisów. Jeśli bieżącej waluty nie ma na liście, używany jest kurs bazowy. Klucze meta są ukryte przed wyświetlaniem pozycji. Administrator może poprawić zapisany kurs na ekranie zamówienia, a wiersze analityki produktów dla zamówienia są synchronizowane ponownie.
Przenieść zapisane zamówienie do innej walutyPrzeliczyć wstecz każdą kwotę po zapisanym kursie, a potem zastosować kurs waluty docelowej
Przeliczenie obejmuje sumy zamówienia, sumy częściowe i sumy pozycji, tablice podatków dla poszczególnych stawek, pozycje wysyłki i ich podatki, pozycje podatkowe oraz zwroty. W HPOS przechodzi przez settery CRUD, przelicza także pozycje opłat i kuponów oraz ponownie oblicza podatki. W starszym magazynie aktualizuje bezpośrednio post meta i meta pozycji zamówienia, w tym rabat koszyka zamówienia.
Jeśli witryna definiuje woocs_order_recalculated_custom(), jest ona wywoływana przed zapisem z zamówieniem, obiema walutami i starym kursem, dla kwot, które muszą zachować stałą wartość w poszczególnych walutach. Akcja zbiorcza przelicza wszystkie zamówienia na walutę bazową.
E-maile, faktury i strony konta renderują się w walucie odwiedzającegoPrzełączać na walutę zamówienia tuż przed renderowaniem każdego widoku zamówienia lub e-maila
Bieżąca waluta należy do tego, kto wywołał żądanie: administratora kończącego zamówienie, zadanie cron albo klienta przeglądającego sklep w innej walucie. FOX przełącza na walutę zamówienia w wc_get_template dla szablonów e-maili, przy powiadomieniu o zrealizowaniu i przy ponownym wysłaniu e-maila, przy renderowaniu faktur PDF, na listach zamówień i widokach zamówień w Moim koncie, w podglądzie zamówienia w panelu administracyjnym oraz dla każdego wiersza listy zamówień HPOS przez filtr nazwy kupującego.
WooCommerce Analytics sumuje zamówienia opłacone w różnych walutachPo zapisaniu przez WooCommerce wierszy wyszukiwania podzielić je przez zapisany kurs zamówienia
WooCommerce Analytics kopiuje kwoty zamówień do własnych tabel wyszukiwania bez zmian, więc przychód mieszałby waluty. WOOCS_analytics podpina się pod woocommerce_analytics_update_product, _tax i _coupon, odczytuje wiersz, który WooCommerce właśnie zapisał, dzieli każdą kwotę przez zapisany kurs zamówienia (lub bieżący kurs, jeśli go brak) i zaokrągla do bazowych miejsc dziesiętnych. Starsze raporty WooCommerce są dostosowane tak samo, przez przeliczanie wsteczne każdego zamówienia.
Edycja zamówienia w wp-admin używa waluty administratoraUruchamiać AJAX edytora zamówień w walucie zamówienia i stosować stałe ceny do dodanych pozycji
wp-admin zwykle działa w walucie bazowej. Dla akcji AJAX edytora zamówień (dodanie pozycji, zapis pozycji, przeliczenie podatków) bieżąca waluta jest ustawiana na walutę zamówienia, dla użytkowników mogących edytować zamówienia. Gdy ręcznie dodawany jest produkt ze stałą ceną w tej walucie, suma częściowa i suma pozycji są ustawiane ze stałej ceny, a sumy zamówienia przeliczane na nowo. Gdy w edytorze dodawany jest kupon, bieżąca waluta jest przełączana na walutę zamówienia.
Konteksty, które muszą pozostać w walucie bazowej
w produkcieCo to dajeWyszukiwarki, eksporty, synchronizacje i ekrany administracyjne widzą ceny bazowe sklepu, więc zapisane dane i podłączone usługi pozostają spójne.
- Problem
- Konsumenci maszynowi czytają ceny przez te same hooki co kupujący. Synchronizacja, webhook lub crawler mogą nieść sesję odwiedzającego i dostać przeliczone liczby.
- Rozwiązanie
Żądania są klasyfikowane, zanim wtyczka się załaduje, a waluta bazowa jest wymuszana wokół wybranych operacji WooCommerce.
- Technologie
WooCommerce REST API musi odpowiadać w walucie bazowej na każdym serwerze WWW (premium)Dopasować trasy /wc/vN/ z REQUEST_URI lub rest_route i nie ładować wtyczki
Systemy POS i ERP synchronizują ceny przez WooCommerce REST API, a żądanie może nieść sesję odwiedzającego, który wybrał inną walutę. Zmienna serwera SCRIPT_URI używana przez ogólną ochronę REST istnieje na Apache, ale nie na nginx, więc trasa jest też parsowana z REQUEST_URI przy użyciu rest_get_url_prefix(), lub z ?rest_route=, a wtyczka kończy działanie, zanim powstanie jej obiekt, dla każdej trasy wc/vN. Store API i własna przestrzeń nazw FOX nie są dotknięte.
woocs_validate_currency() odpowiada walutą sklepu, gdy obiekt wtyczki nie istnieje w żądaniu. Wersja premium.
Ładunki webhooków muszą być budowane w walucie bazowej (premium)Przełączać na bazową tylko na czas budowania ładunku, dla dostarczania asynchronicznego i synchronicznego przy shutdown
Dostarczanie asynchroniczne działa przez Action Scheduler: waluta bazowa jest włączana z priorytetem 1 w woocommerce_deliver_webhook_async i wyłączana z 999. Dostarczanie synchroniczne jest trudniejsze: od WooCommerce 4.4 webhooki są kolejkowane i dostarczane przy shutdown, więc FOX włącza walutę bazową wewnątrz filtra woocommerce_webhook_deliver_async tylko wtedy, gdy jest on wywołany przy shutdown z WC_Webhook i async=false, a wyłącza ją w woocommerce_webhook_payload, zaraz po build_payload().
Dostarczenie może działać w żądaniu niosącym ciasteczka odwiedzającego, a więc jego walutę. Przełączane są zarówno flaga przeliczania, jak i current_currency, ponieważ stałe ceny dla poszczególnych walut czytają current_currency bezpośrednio. Wersja premium.
Wyszukiwarki indeksują przeliczone ceny i walutyResetować znane boty do waluty bazowej i przepisywać oferty schema.org z powrotem na walutę bazową
Crawlery mogą przychodzić z walutą w URL. Znane user agenty botów są resetowane do waluty bazowej w wp_head, chyba że administrator to wyłączy. Niezależnie od tego structured_data_product_offer() ustawia priceCurrency na bazową i dzieli wpisy price, lowPrice, highPrice i priceSpecification przez kurs, więc znaczniki produktu pozostają spójne z walutą sklepu.
Eksporty, administracyjne ekrany produktów i edytory zbiorcze muszą widzieć zapisane wartości bazoweResetować do bazowej dla eksportów i ładowania wariantów w panelu; pomijać ładowanie dla niektórych AJAX
Eksport produktów do CSV resetuje walutę przed zapytaniem, więc eksportowane ceny są wartościami bazowymi, które można zaimportować z powrotem. Ładowanie wariantów w edytorze produktu i każda strona wp-admin inna niż AJAX działają w walucie bazowej. Wtyczka nie ładuje się dla akcji AJAX edytora zbiorczego BEAR, dla ładowania pozycji zamówienia, dla żądań REST, których URL zawiera /refunds lub paypal (PayPal Payments), oraz dla zwrotów w panelu, chyba że potrzebuje jej znana wtyczka, bo te żądania zapisują kwoty.
Frontendy headless potrzebują cen w podanej walucie dla każdego żądaniaEndpointy REST, które przełączają walutę na jedno wywołanie i potem ją przywracają
woocs/v3 udostępnia listę walut, cenę jednego produktu i partię cen produktów. Callback ustawia żądaną walutę tylko wtedy, gdy istnieje w sklepie, oblicza ceny z tym samym pierwszeństwem co główny konwerter (stała, kraj, rola, potem kurs), zwraca surowe wartości dla każdego wariantu z min i max albo HTML i przywraca poprzednią walutę.
Importer zamówień Etsy zapisywał zamówienia AUD z walutą, którą GeoIP wybrał dla żądaniaZałatać importer tak, by przed zapisem zamówienia resetował FOX do waluty bazowej sklepu
Walutą bazową sklepu było AUD. Podczas żądania importu GeoIP przełączył bieżącą walutę na USD, a importer zapisywał bieżącą walutę w każdym zamówieniu. Wywołanie $WOOCS->reset_currency(), zabezpieczone przez class_exists('WOOCS'), dodano w dwóch miejscach kodu zamówień importera, więc zamówienia są zapisywane w walucie bazowej. To łatka do importera firm trzecich i trzeba ją zastosować ponownie po aktualizacji tej wtyczki. Klient potwierdził, że zadziałało.
Liczby
wordpress.org- Aktywne instalacje 50 000+ licznik wordpress.org.
- Opinie 250 Średnia ocena: 4.4 na 5.
- Lat wsparcia 12 Od 20 września 2014, ostatnia aktualizacja 12 października 2026.