Lingua

Contattami

Plugin per WooCommerce · dal 2014 · aka WOOCS

FOX

Un plugin WooCommerce che mostra i prezzi nella valuta scelta dal visitatore e, se si vuole, permette di pagare in quella valuta.

Prima versione
Installazioni attive
50.000+
Valutazione
4.4 / 5 (250)Leggi le recensioni
  • PHP
  • WordPress hooks API
  • Filtri WooCommerce per prodotti, carrello, spedizione e ordini
  • WooCommerce HPOS (OrderUtil, WC_Order CRUD)
  • Tabelle di lookup di WooCommerce Analytics
  • Transient, sessioni PHP, Memcached, Redis
  • Scheduler basato su opzioni
  • WP REST API
  • jQuery, fetch API, localStorage
  • Feed di tassi SimpleXML / JSON
Vedi su wordpress.org wordpress.org

Chi sono

FOX converte gli importi prodotti da WooCommerce nella valuta selezionata dal visitatore e può permettere al cliente di pagare in quella valuta. WooCommerce conosce una sola valuta del negozio, perciò il plugin funziona intercettando i getter dei prezzi dei prodotti, le tariffe di spedizione, i coupon, i totali del carrello, il rendering degli ordini e le e-mail, e convertendo ogni importo una sola volta a un tasso salvato.

La difficoltà è che un prezzo attraversa molti percorsi di codice di WooCommerce: alcuni sono in cache, alcuni girano in richieste in background, altri in wp-admin. Ogni percorso deve vedere la valuta giusta. La vetrina usa la valuta del visitatore, le e-mail e l'editor degli ordini usano la valuta dell'ordine, mentre esportazioni, markup per i motori di ricerca e analytics usano la valuta base. L'edizione premium mantiene nella valuta base anche la REST API di WooCommerce e i payload dei webhook.

Attorno a questo nucleo ci sono l'importazione dei tassi da 15 fonti con un proprio scheduler e limiti di plausibilità, la memorizzazione della valuta per visitatore che funziona dietro le cache di pagina intera, arrotondamento e formati numerici per valuta, prezzi manuali per valuta, paese e ruolo utente, e il ricalcolo degli ordini salvati tra valute sia con HPOS sia con l'archiviazione ordini legacy.

L'edizione gratuita su wordpress.org esegue la stessa classe principale, limitata a due valute in get_currencies().

FOX · cambio valuta

cosa è stato risolto

ATTIVOdal 2014

Conversione dei prezzi dentro WooCommerce

shipped · 2014

Cosa offreOgni prezzo viene convertito esattamente una volta, così i clienti non vedono mai importi raddoppiati o sbagliati. Il proprietario può impostare prezzi fissi per valuta, paese o ruolo del cliente.

Problema
WooCommerce ha una sola valuta del negozio e legge i prezzi attraverso molti getter, cache e costruttori HTML. Ogni importo deve essere convertito esattamente una volta, e alcuni importi non devono essere convertiti affatto.
Soluzione

Un unico convertitore si colloca sui getter dei prezzi dei prodotti con priorità 9999. I prezzi manuali hanno la precedenza sulla conversione al tasso, ed esistono interruttori espliciti di bypass per gli importi già definitivi.

Stack
  • PHP
  • Getter dei prodotti WooCommerce
  • post meta
Attività · 6
Convertire i prezzi dei prodotti semplici e delle varianti una sola volta, a livello dei datiAgganciare i getter dei prezzi di prodotto e variante con un solo convertitore a priorità 9999

Nella modalità in cui il cliente paga nella valuta selezionata, raw_woocommerce_price() è collegata a woocommerce_product_get_price, ai getter del prezzo regolare e in offerta e ai getter delle varianti. Eseguirla a 9999 la pone dopo gli altri plugin che modificano il prezzo base. Nella modalità di sola visualizzazione si usa solo il filtro raw_woocommerce_price, così gli importi salvati di carrello e ordine restano nella valuta base.

Casi limite gestiti nel convertitore: i prezzi vuoti passano intatti, un genitore variabile interrogato con display=false viene saltato per evitare di convertire due volte min/max, e il getter del prezzo in offerta restituisce una stringa vuota quando non è salvato alcun prezzo in offerta. Senza questo, un prezzo in offerta vuoto convertito diventa 0 e WooCommerce mostra un prezzo barrato.

Cache dei prezzi delle varianti condivisa tra tutte le valuteAggiungere la valuta corrente all'hash dei prezzi delle varianti così ogni valuta ha la propria voce

WooCommerce mette in cache gli array di prezzi calcolati di un prodotto variabile in un transient con chiave l'hash degli input di prezzo. Se la valuta non fa parte di quell'hash, i prezzi convertiti del primo visitatore vengono serviti a tutti. woocommerce_get_variation_prices_hash() aggiunge la valuta corrente.

woocommerce_variation_prices() converte poi ogni voce, applica i prezzi fissi per variante e riordina ogni array con asort(). L'intervallo di prezzo viene letto dal primo e dall'ultimo elemento, e i prezzi fissi per valuta possono cambiare l'ordine delle varianti rispetto alla valuta base.

Prezzi manuali per valuta, paese e ruolo in un'unica pipelineUn prezzo fisso per valuta è definitivo; un prezzo per paese o ruolo sostituisce il prezzo base prima della conversione al tasso

I prezzi fissi sono salvati come meta del prodotto per campo e valuta (_woocs_regular_price_EUR, _woocs_sale_price_EUR), con -1 che significa 'non impostato, usare il tasso'. Un prezzo fisso nella valuta del visitatore viene usato così com'è. Altrimenti un prezzo per paese sostituisce il prezzo base, e il risultato viene convertito al tasso. I prezzi per paese raggruppano i paesi in blocchi con un prezzo per blocco, e il paese del visitatore proviene dalla geolocalizzazione di WooCommerce salvata nello stato del visitatore.

I prezzi per ruolo sono applicati dopo quel passaggio. Quando è impostato un prezzo per il ruolo dell'utente, sostituisce il prezzo scelto fino a quel momento, incluso un prezzo fisso per valuta, e viene convertito al tasso.

Quando un prezzo in offerta per paese è lasciato vuoto, get_product_geo_data() vi copia il prezzo regolare, altrimenti il prodotto diventerebbe gratuito in quel paese. Quando un campo fisso del prezzo in offerta è vuoto, la ricerca ripiega sul campo fisso del prezzo regolare.

Un filtro prezzo riceve un numero, non il nome del campo prezzoConfrontare il valore con i prezzi regolare e in offerta salvati, poi ripiegare su un promemoria della richiesta

I prezzi fissi sono salvati per campo, ma woocommerce_product_get_price passa solo un numero. get_price_type() confronta il valore in ingresso con i prezzi regolare e in offerta grezzi del prodotto letti nel contesto 'edit'. Se nessuno corrisponde, tiene una mappa statica del primo prezzo visto per ogni prodotto nella richiesta e considera prezzo regolare un valore successivo e più grande.

È un'euristica, perciò si passano tipi di campo espliciti ovunque il chiamante li conosca. I prezzi per ruolo usano una propria copia della stessa logica.

Mostrare il prezzo di un prodotto in tutte le valute in un unico renderingCambiare la valuta corrente per ogni voce e ricostruire gli intervalli per i tipi variabile e raggruppato

L'elenco opzionale dei prezzi sotto un prodotto è costruito dentro woocommerce_price_html(). Per ogni valuta si cambia la valuta corrente, il valore viene formattato con i decimali e i separatori di quella valuta, e al termine viene ripristinata la valuta originale.

L'intervallo di un prodotto variabile non può essere calcolato come min/max base per il tasso, perché le singole varianti possono avere prezzi fissi. _get_min_max_variation_prices() ricalcola il prezzo di ogni variante per la valuta di destinazione e scarta i valori zero. I prodotti raggruppati iterano i loro figli e gestiscono allo stesso modo i figli variabili.

Permettere ad altro codice di marcare un importo come definitivo o di convertire i propri importiFiltro woocs_skip_conversion, un flag di blocco interno, filtri pubblici di conversione e riconversione

woocs_skip_conversion viene controllato per primo nel convertitore: un'integrazione che ha già fissato il prezzo di un articolo nella valuta attiva restituisce true e l'importo passa intatto. Il flag di richiesta woocs_block_price_hook disattiva la conversione per una sezione di codice, usato per esempio mentre si costruiscono i payload dei webhook.

Per la direzione opposta, woocs_convert_price e woocs_back_convert_price permettono ai plugin di terze parti di convertire i propri importi nella valuta base, e convert_from_to_currency() converte tra due valute qualsiasi del negozio passando dalla base: value / rate_from * rate_to.

Arrotondamento, decimali e formati numerici

shipped · 2016

Cosa offreI prezzi appaiono con i decimali e i separatori giusti per ogni valuta, e gli importi digitati dal personale o inviati al gateway di pagamento restano corretti.

Problema
Le valute differiscono per decimali e separatori, e WooCommerce li legge da opzioni globali condivise da visualizzazione, interpretazione degli importi digitati e calcolo delle imposte.
Soluzione

I valori per valuta sono iniettati tramite filtri sulle opzioni, e disattivati nei contesti in cui WooCommerce interpreta input o arrotonda nella valuta base.

Stack
  • PHP
  • Filtri sulle opzioni di WordPress
  • Funzioni di formattazione di WooCommerce
Attività · 5
Decimali per valuta attraverso un'unica opzione globale di WooCommerceFiltrare pre_option_woocommerce_price_num_decimals con i decimali della valuta attiva

WooCommerce legge il numero di decimali da una sola opzione. FOX risponde a quell'opzione con l'impostazione della valuta corrente, e il convertitore arrotonda con number_format() alla stessa precisione, così il valore salvato nel carrello e quello mostrato coincidono.

JPY e TWD sono codificati nel codice come valute senza centesimi, l'amministratore può aggiungerne altre, e il filtro woocs_precision_on_calc permette a un sito di sovrascrivere la precisione per valuta.

Importi nella valuta base arrotondati ai decimali della valuta del visitatoreRestituire i decimali base mentre si aggiunge una tariffa di spedizione e per gli array grezzi delle varianti

Le tariffe di spedizione sono calcolate nella valuta base e convertite più tardi in woocommerce_package_rates. Se fossero prima arrotondate ai decimali della valuta del visitatore (per esempio 0 per JPY), il valore base perderebbe precisione prima della conversione. woocs_fix_decimals() restituisce i decimali base quando add_rate è nello stack delle chiamate.

Lo stesso vale per gli array dei prezzi delle varianti: woocs_fix_variation_decimal() li formatta con i decimali base prima che il convertitore li elabori.

I separatori per valuta corrompono gli importi digitati nell'editor degli ordiniRilevare le schermate degli ordini e le loro chiamate AJAX e mantenere lì i separatori del negozio

I separatori decimali e delle migliaia sono filtrati per valuta (sei schemi in get_decimal_sep() e get_thousand_sep()). Nell'editor degli ordini in wp-admin, i campi di input di WooCommerce, la loro validazione JS e wc_format_decimal() presuppongono tutti il separatore del negozio, perciò un separatore decimale a virgola lì cambierebbe gli importi salvati. I separatori per valuta sono quindi disattivati nell'editor degli ordini.

woocs_is_admin_order_edit_context() riconosce per nome le azioni AJAX dell'editor degli ordini, le altre chiamate AJAX dal referer (pagina wc-orders, post type shop_order, ID del post dell'ordine) e le schermate HPOS e legacy. La parte relativa alla richiesta è messa in cache in una variabile statica; il controllo della schermata viene rivalutato perché get_current_screen() è vuota all'inizio della richiesta. Gli importi dei rimborsi digitati con la virgola vengono normalizzati prima che WooCommerce li validi.

Il gateway rifiuta importi frazionari in valute senza decimaliRiscrivere come interi i campi importo e imposta di PayPal Standard per le valute senza centesimi

apply_conversion() gira su woocommerce_paypal_args e riformatta ogni campo amount_* e tax_cart con 0 decimali quando la valuta corrente non ha centesimi. enable_custom_currency() estende la whitelist delle valute PayPal di WooCommerce, così il gateway resta disponibile quando il visitatore paga in una valuta diversa da quella base.

Tassi crypto minuscoli stampati in notazione scientificaFormattare i tassi con 15 cifre significative e rimuovere gli zeri finali

Un tasso come monete per USD può essere molto inferiore a 0.0001, e la conversione float-stringa di PHP dà una notazione con esponente che il modulo di amministrazione e l'e-mail dei tassi non possono usare. rate_to_string() calcola il numero di decimali dal log10 del valore, lo limita a 20 e rimuove gli zeri finali.

Valuta per visitatore nei siti con cache

shipped · 2016

Cosa offreOgni visitatore mantiene la valuta scelta, anche nei siti con cache o nelle reti condivise, e il mini carrello e la spedizione si aggiornano quando la cambia.

Problema
La valuta selezionata è uno stato per visitatore, ma le cache di pagina intera servono lo stesso HTML a tutti, e molti hosting rompono le sessioni PHP o mettono molti visitatori dietro un solo IP.
Soluzione

La memorizzazione della valuta è intercambiabile su sei backend. Nei siti con cache i prezzi vengono renderizzati come marcatori e ridisegnati via AJAX rispetto a una chiave di archiviazione per browser.

Stack
  • Sessioni PHP
  • Transient
  • Memcached
  • Redis
  • localStorage
  • fetch API
  • jQuery AJAX
Attività · 6
Hosting in cui le sessioni PHP non sopravvivono tra una richiesta e l'altraUn'unica interfaccia di archiviazione su sessione, transient, sessione propria su DB, Memcached, Redis, cookie

WOOCS_STORAGE espone set_val/get_val/is_isset e commuta sul backend configurato. L'archiviazione in transient usa come chiave l'hash dell'IP del client, con preferenza per CF-Connecting-IP dietro Cloudflare perché Cloudflare sovrascrive qualsiasi valore fornito dal client. Sono supportati anche Memcached e Redis.

WOOCS_SESSION riutilizza la tabella woocommerce_sessions con un cookie firmato HMAC, legge tramite l'object cache e scrive allo shutdown solo quando i dati sono cambiati.

I visitatori dietro un IP condiviso vedono le valute l'uno dell'altroUsare come chiave del transient un ID casuale per browser conservato in localStorage

Con l'archiviazione in transient e la modalità cache attive, front.js crea una sola volta un ID casuale (crypto.randomUUID quando disponibile) e lo invia con ogni richiesta. Il server lo sanifica con sanitize_key() e ne calcola l'hash per la chiave del transient, così gli utenti di un NAT d'ufficio o di un operatore mobile ottengono contenitori separati. L'ID è generato in minuscolo di proposito: sanitize_key() converte in minuscolo, e un ID con maiuscole e minuscole darebbe l'hash di un contenitore diverso.

In questa modalità il transient vive 30 giorni invece di 1, perché la chiave è stabile per browser. Se localStorage è bloccato il codice ripiega in silenzio sulla chiave IP.

Blocks e richieste Store API aggirano jQuery e perdono la chiaveAvvolgere window.fetch al caricamento e aggiungere la chiave come header sulle chiamate same-origin

Le richieste jQuery ricevono la chiave tramite un gestore ajaxSend, ma WooCommerce Blocks, la Store API e PayPal Payments usano fetch() e partono prima del DOM ready. Il wrapper è installato al livello superiore. La chiave va in un header X-WOOCS-SK, non in un argomento della query, perché un argomento di query per visitatore spezzerebbe la cache di pagina per visitatore. Le chiamate cross-origin sono lasciate stare, dato che un header personalizzato innesca un preflight CORS che può rompere gli SDK di pagamento.

Lato PHP, le richieste wp-json verso le route cart, store e batch mantengono il plugin caricato così che il carrello e il checkout a blocchi vengano renderizzati nella valuta del visitatore.

La cache di pagina serve prezzi renderizzati per un altro visitatoreAvvolgere ogni prezzo in un marcatore e ridisegnare tutti i marcatori con un'unica richiesta AJAX

woocommerce_price_html() avvolge ogni prezzo in uno span con l'ID del prodotto e un ID di ridisegno univoco. In una pagina in cache front.js raccoglie i marcatori e li invia a woocs_get_products_price_html; il JSON delle varianti nel modulo add-to-cart e gli shortcode di prezzo personalizzati vengono aggiornati allo stesso modo. Uno stile di preloader può nascondere i prezzi obsoleti finché non arriva la risposta.

Il server restituisce una risposta vuota quando la valuta in cui la pagina in cache è stata renderizzata coincide già con quella salvata del visitatore, così quella visualizzazione di pagina non costa alcun rendering. Renderizza get_price_html() solo per i prodotti pubblicati e visibili.

Mini carrello e spedizione restano nella vecchia valuta dopo un cambioAggiungere la valuta all'hash del carrello di WooCommerce e forzare l'aggiornamento dei frammenti

WooCommerce salva i frammenti del carrello in sessionStorage con chiave l'hash del carrello, e l'hash dipende solo dal contenuto del carrello. FOX filtra woocommerce_cart_hash in md5(carrello + valuta), così un cambio invalida i frammenti salvati e la spedizione viene ricalcolata.

Quando la valuta arriva nell'URL su una pagina in cache, front.js la rispecchia prima nel contenitore della chiave del browser e solo dopo attiva wc_fragment_refresh, altrimenti l'aggiornamento leggerebbe un contenitore vuoto e ripiegherebbe sulla valuta base.

I codici valuta arrivano da URL, AJAX, REST e da archivi obsoletiAccettare solo codici dell'elenco del negozio; le valute nascoste solo per i gestori degli ordini

set_currency() salva solo le valute abilitate, e il valore salvato viene ricontrollato a ogni richiesta, così una valuta rimossa dall'amministratore ripiega sulla base. get_woocommerce_currency() non restituisce mai a WooCommerce un codice sconosciuto, perché WooCommerce lo scriverebbe sull'ordine.

Le valute marcate come private non possono essere selezionate tramite ?currency= o l'interruttore AJAX. Il valore di richiesta woocs_in_order_currency accetta una valuta privata solo per gli utenti con edit_shop_orders.

Carrello, spedizione, coupon e pagamento

shipped · 2015

Cosa offreCosti di spedizione, minimi per la spedizione gratuita e coupon funzionano correttamente nella valuta del cliente, e il checkout addebita solo nelle valute che lo shop accetta.

Problema
I costi di spedizione, gli importi dei coupon e le soglie sono salvati nella valuta base ma confrontati con totali del carrello già convertiti.
Soluzione

Ogni importo viene convertito dove WooCommerce lo consuma, e ogni controllo di soglia viene fatto in una sola valuta riconvertendo il lato del carrello.

Stack
  • WooCommerce shipping API
  • WC_Coupon
  • WC_Tax
  • Filtri dei gateway di pagamento
Attività · 5
Costi e imposte di spedizione nella valuta selezionataConvertire costo e array delle imposte di ogni tariffa in package_rates, oppure usare un costo fisso per valuta

woocommerce_package_rates() moltiplica costo e ogni voce di imposta per il tasso e arrotonda ai decimali della valuta. Un costo fisso flat-rate per valuta è salvato nell'opzione delle impostazioni dell'istanza del metodo di spedizione. Quando si usa un costo fisso, scalare la vecchia imposta sarebbe sbagliato, perciò l'imposta viene ricalcolata con WC_Tax::calc_shipping_tax().

Le formule flat-rate usano un costo del carrello già convertitoDividere l'argomento [cost] per il tasso, perché la tariffa risultante viene convertita più tardi

Un costo flat-rate come '[cost] * 0.1' riceve il costo del carrello nella valuta del visitatore, e la tariffa di spedizione risultante viene poi convertita di nuovo in woocommerce_package_rates. woocommerce_fix_shipping_calc() divide prima l'argomento del costo per il tasso, così la conversione avviene una volta sola.

Minimo per la spedizione gratuita confrontato tra due valuteReimplementare il controllo di disponibilità e riconvertire alla base subtotale e sconti

Il metodo di spedizione gratuita confronta il subtotale mostrato con min_amount. Quando il cliente paga nella valuta selezionata, il subtotale del carrello è in quella valuta, perciò il controllo è reimplementato: il subtotale viene riconvertito con il tasso corrente, anche lo sconto e l'imposta sullo sconto vengono riconvertiti, le impostazioni ignore_discounts e di visualizzazione delle imposte sono rispettate, e i requisiti coupon/either/both sono valutati come in WooCommerce.

Se è impostato un minimo fisso per valuta, anche questo viene riconvertito, così entrambi i lati del confronto sono nella valuta base.

Coupon a importo fisso e limiti di spesa salvati nella valuta baseConvertire importo e spesa min/max quando l'oggetto coupon viene caricato, saltando i coupon percentuali

woocommerce_coupon_loaded() converte l'importo del coupon (non per i tipi percent e percent_product) e la spesa minima e massima, poi li riscrive con i setter del coupon, così tutta la validazione di WooCommerce gira in una sola valuta. Gli importi e i limiti fissi dei coupon per valuta, salvati come meta del coupon, sovrascrivono i valori convertiti.

Il checkout deve addebitare in una valuta che lo shop accettaForzare la valuta base a ogni ingresso del checkout nella modalità di sola visualizzazione; filtrare i gateway

Nella modalità di sola visualizzazione la valuta viene riportata alla base nella pagina di checkout, su checkout_process, nel checkout a blocchi e negli aggiornamenti della revisione dell'ordine. Nella modalità di pagamento nella valuta selezionata la richiesta di checkout legge esplicitamente la valuta salvata, e facoltativamente la valuta viene forzata dal paese del visitatore. Un ordine in sospeso pagato più tardi dal suo link di pagamento viene portato sulla valuta propria dell'ordine.

I gateway di pagamento possono essere nascosti o mostrati per valuta, dato che molti gateway supportano solo alcune valute.

Tassi di cambio: fonti, pianificazione, protezioni

nel prodotto

Cosa offreI tassi di cambio si aggiornano a intervalli regolari da molte fonti. Un tasso fallito o assurdo viene rifiutato invece di riprezzare l'intero negozio, ed è possibile aggiungere un margine.

Problema
I tassi arrivano da molte API con basi e formati diversi, devono aggiornarsi a intervalli regolari su siti dove WP-Cron è inaffidabile, e una risposta sbagliata non deve riprezzare il negozio.
Soluzione

Una classe provider per fonte normalizza in 'unità per 1 base', uno scheduler basato su opzioni gira sulle richieste normali, un recupero fallito non scrive mai zero né un testo di errore come tasso, e i nuovi tassi possono essere limitati a soglie per valuta.

Stack
  • PHP
  • wp_remote_get
  • SimpleXML
  • API JSON
  • Opzioni di WordPress
Attività · 6
Quindici fonti di tassi con basi e formati di payload diversiRateProvider astratta con URL e parser per fonte, caricata per convenzione sui nomi delle classi

RateProvider::getRate() costruisce l'URL, recupera con un timeout e delega a parseResponse(). I feed delle banche centrali sono quotati rispetto alla propria valuta, perciò i parser calcolano i tassi incrociati: la BCE è basata su EUR, e il feed della Banca di Russia porta anche un Nominal (tasso per 10 o 100 unità) da dividere.

get_rate_provider() associa il nome della fonte configurata a un file di classe. I siti possono aggiungere le proprie fonti tramite i filtri woocs_add_custom_rate e woocs_add_aggregator_processor.

L'API dei prezzi crypto tratta qualsiasi ticker, incluso CAD, come una monetaRifiutare i codici fiat prima della richiesta e invertire USD-per-moneta in monete-per-USD

La fonte Pulse Verity restituisce un prezzo in USD per qualsiasi simbolo, quindi a un codice fiat verrebbe silenziosamente assegnato il prezzo di un token non correlato. Il provider controlla prima un elenco ISO 4217 scritto nel codice, perché i plugin di pagamento crypto aggiungono monete all'elenco valute di WooCommerce e quell'elenco non è affidabile. Funziona solo con base USD, invia la chiave API come header Bearer, riporta il codice di errore proprio dell'API per qualsiasi risposta non 2xx (chiave errata, restrizione del piano, limite di frequenza) e rifiuta prezzi zero o non numerici. Il prezzo in USD per moneta restituito viene invertito in monete per 1 USD.

Aggiornamenti dei tassi su siti in cui WP-Cron è inaffidabile o il traffico è costanteScheduler proprio in una sola opzione, controllato sulle richieste normali; il collegamento non sposta mai un'esecuzione in sospeso

PN_WP_CRON_WOOCS conserva inizio, prossima esecuzione, intervallo e ultima esecuzione per hook in una sola opzione ed è controllato da init, admin_init e rest_api_init. Poiché viene chiamato a ogni richiesta, attach() deve essere idempotente: con un intervallo invariato lascia next intatto, e a un cambio di intervallo ricalcola next dall'ultima esecuzione, limitato a ora più un intervallo. I tre hook sono registrati con 0 argomenti accettati, perché rest_api_init passa l'oggetto WP_REST_Server, che altrimenti finirebbe nel parametro $reset e riavvierebbe la pianificazione a ogni richiesta REST.

process() sposta avanti la prossima esecuzione prima di chiamare l'hook, intercetta e registra le eccezioni da esso sollevate, ed esegue ogni hook al massimo una volta per richiesta. La pianificazione aggiornata viene salvata nell'opzione dopo l'esecuzione degli hook.

Una risposta API fallita o assurda non deve riprezzare l'intero negozioSostituire un tasso solo con un numero positivo e limitare i nuovi tassi a un minimo e un massimo per valuta

rate_auto_update() recupera ogni valuta nel proprio blocco try e sostituisce un tasso solo con un numero positivo, così una valuta o una fonte che fallisce non ferma le altre e non scrive mai zero né un testo di errore come tasso. get_rate() fa passare ogni tasso numerico per ExchangeRateLimiter, che lo limita a un minimo e un massimo opzionali per valuta. Dopo il salvataggio, l'azione woocs_sheduler_rates_updated permette ad altro codice di reagire.

Cambiare la valuta base invalida ogni tasso salvatoMarcare la nuova base e recuperare di nuovo tutti i tassi rispetto ad essa nella stessa richiesta

Tutti i tassi sono salvati come unità per 1 base, perciò una nuova base rende sbagliati tutti i numeri in una volta. save_etalon() salva il flag della nuova base, cambia default_currency in memoria e chiama get_rate() per ogni altra valuta prima di rispondere alla schermata di amministrazione, così il modulo viene riempito di nuovo con valori coerenti.

I negozi aggiungono un margine sopra i tassi di mercatoApplicare un ricarico fisso o percentuale per valuta in un solo filtro sull'elenco delle valute

Il ricarico è salvato accanto al tasso come importo fisso o percentuale e applicato in un filtro woocs_currency_data_manipulation con priorità 1, così ogni consumatore di get_currencies() vede il tasso con il ricarico. get_currencies(true) salta i filtri quando serve il valore grezzo.

Ordini, e-mail e report dopo la vendita

nel prodotto

Cosa offreOgni ordine conserva la valuta e il tasso a cui è stato pagato, così e-mail, fatture, modifiche agli ordini e report di vendita mostrano gli importi giusti.

Problema
Un ordine è salvato nella valuta in cui è stato pagato, mentre le schermate di amministrazione, le e-mail, le fatture, gli analytics e le modifiche successive girano con un'altra valuta corrente.
Soluzione

Il tasso del checkout viene salvato sull'ordine, la valuta dell'ordine viene forzata ovunque l'ordine sia renderizzato, e le righe degli analytics sono riconvertite alla base.

Stack
  • WC_Order CRUD
  • HPOS
  • meta degli articoli dell'ordine
  • Tabelle di WooCommerce Analytics
  • E-mail di WooCommerce
Attività · 5
Sapere in seguito a quale tasso è stato pagato un ordineSalvare tasso e valuta base come meta dell'ordine tramite la CRUD API al checkout

Al checkout e nella pagina di ringraziamento il tasso, la valuta base e un marcatore 'changed manually' vengono scritti con $order->update_meta_data(), che funziona sia con HPOS sia con l'archiviazione dei post. Se la valuta corrente non è nell'elenco, si usa il tasso base. Le chiavi meta sono nascoste dalla visualizzazione degli articoli. Un amministratore può correggere il tasso salvato dalla schermata dell'ordine, e le righe analytics dei prodotti dell'ordine vengono risincronizzate.

Spostare un ordine salvato in un'altra valutaRiconvertire ogni importo con il tasso salvato, poi applicare il tasso della valuta di destinazione

Il ricalcolo converte totali dell'ordine, subtotali e totali delle righe, array delle imposte per aliquota, righe di spedizione e relative imposte, righe di imposta e rimborsi. Con HPOS passa dai setter CRUD, converte anche le righe di costo aggiuntivo e le righe coupon, e ricalcola le imposte. Con l'archiviazione legacy aggiorna direttamente i meta del post e i meta degli articoli dell'ordine, incluso lo sconto carrello dell'ordine.

Se un sito definisce woocs_order_recalculated_custom(), questa viene chiamata prima del salvataggio con l'ordine, entrambe le valute e il vecchio tasso, per gli importi che devono mantenere un valore fisso per valuta. Un'azione di massa ricalcola tutti gli ordini nella valuta base.

E-mail, fatture e pagine dell'account renderizzate nella valuta del visitatorePassare alla valuta dell'ordine subito prima del rendering di ogni vista dell'ordine o e-mail

La valuta corrente appartiene a chi ha innescato la richiesta: un amministratore che completa un ordine, un job cron o un cliente che naviga in un'altra valuta. FOX passa alla valuta dell'ordine in wc_get_template per i template delle e-mail, nella notifica di completamento e nel reinvio dell'e-mail, per il rendering delle fatture PDF, negli elenchi e nelle viste degli ordini di My Account, nell'anteprima dell'ordine in amministrazione e per ogni riga dell'elenco ordini HPOS tramite il filtro sul nome dell'acquirente.

WooCommerce Analytics somma ordini pagati in valute diverseDopo che WooCommerce scrive le righe di lookup, dividerle per il tasso salvato dell'ordine

WooCommerce Analytics copia gli importi degli ordini nelle proprie tabelle di lookup così come sono, quindi il fatturato mescolerebbe valute. WOOCS_analytics si aggancia a woocommerce_analytics_update_product, _tax e _coupon, legge la riga appena scritta da WooCommerce, divide ogni importo per il tasso salvato dell'ordine (o per il tasso corrente se non ce n'è uno) e arrotonda ai decimali base. I report legacy di WooCommerce sono adattati allo stesso modo riconvertendo ogni ordine.

Modificare un ordine in wp-admin usa la valuta dell'amministratoreEseguire l'AJAX dell'editor degli ordini nella valuta dell'ordine e applicare i prezzi fissi agli articoli aggiunti

wp-admin normalmente gira nella valuta base. Per le azioni AJAX dell'editor degli ordini (aggiungi articolo, salva articoli, ricalcola le imposte) la valuta corrente viene impostata su quella dell'ordine, per gli utenti che possono modificare gli ordini. Quando si aggiunge a mano un prodotto con un prezzo fisso in quella valuta, subtotale e totale dell'articolo sono impostati dal prezzo fisso e i totali dell'ordine vengono ricalcolati. Quando si aggiunge un coupon nell'editor, la valuta corrente passa a quella dell'ordine.

Contesti che devono restare nella valuta base

nel prodotto

Cosa offreMotori di ricerca, esportazioni, sincronizzazioni e schermate di amministrazione vedono i prezzi base dello shop, così i dati salvati e i servizi collegati restano coerenti.

Problema
I consumatori automatici leggono i prezzi attraverso gli stessi hook degli acquirenti. Una sincronizzazione, un webhook o un crawler possono portare la sessione di un visitatore e ricevere numeri convertiti.
Soluzione

Le richieste vengono classificate prima che il plugin si carichi, e la valuta base viene forzata attorno a specifiche operazioni di WooCommerce.

Stack
  • WP REST API
  • Webhook di WooCommerce
  • Action Scheduler
  • Markup schema.org
Attività · 6
La REST API di WooCommerce deve rispondere nella valuta base su qualsiasi web server (premium)Riconoscere le route /wc/vN/ da REQUEST_URI o rest_route e non caricare il plugin

I sistemi POS ed ERP sincronizzano i prezzi tramite la REST API di WooCommerce, e una richiesta può portare la sessione di un visitatore che ha selezionato un'altra valuta. La variabile server SCRIPT_URI usata dalla protezione REST generale esiste su Apache ma non su nginx, perciò la route viene analizzata anche da REQUEST_URI con rest_get_url_prefix(), o da ?rest_route=, e il plugin termina prima che il suo oggetto sia creato per qualsiasi route wc/vN. La Store API e il namespace proprio di FOX non sono interessati.

woocs_validate_currency() risponde con la valuta del negozio quando l'oggetto del plugin non esiste nella richiesta. Edizione premium.

I payload dei webhook devono essere costruiti nella valuta base (premium)Passare alla base solo mentre il payload viene costruito, per la consegna asincrona e per quella sincrona allo shutdown

La consegna asincrona passa da Action Scheduler: la valuta base viene attivata con priorità 1 di woocommerce_deliver_webhook_async e disattivata a 999. La consegna sincrona è più difficile: da WooCommerce 4.4 i webhook sono messi in coda e consegnati allo shutdown, perciò FOX attiva la valuta base dentro il filtro woocommerce_webhook_deliver_async solo quando viene chiamato allo shutdown con un WC_Webhook e async=false, e la disattiva in woocommerce_webhook_payload, subito dopo build_payload().

La consegna può avvenire in una richiesta che porta i cookie di un visitatore e quindi la sua valuta. Vengono commutati sia il flag di conversione sia current_currency, perché i prezzi fissi per valuta leggono current_currency direttamente. Edizione premium.

I motori di ricerca indicizzano prezzi e valute convertitiRiportare alla base i bot noti e riscrivere le offerte schema.org nella valuta base

I crawler possono arrivare con una valuta nell'URL. Gli user agent dei bot noti sono riportati alla valuta base in wp_head, a meno che l'amministratore non lo disattivi. In modo indipendente, structured_data_product_offer() imposta priceCurrency sulla base e divide per il tasso le voci price, lowPrice, highPrice e priceSpecification, così il markup dei prodotti resta coerente con la valuta del negozio.

Esportazioni, schermate prodotto in amministrazione ed editor di massa devono vedere i valori base salvatiRiportare alla base per le esportazioni e il caricamento delle varianti in amministrazione; saltare il caricamento per alcuni AJAX

L'esportazione CSV dei prodotti reimposta la valuta prima della sua query, così i prezzi esportati sono valori base che possono essere reimportati. Il caricamento delle varianti nell'editor del prodotto e ogni pagina wp-admin non AJAX girano nella valuta base. Il plugin non si carica per le azioni AJAX dell'editor di massa BEAR, per il caricamento degli articoli dell'ordine, per le richieste REST il cui URL contiene /refunds o paypal (PayPal Payments), e per i rimborsi lato backend a meno che un plugin noto non ne abbia bisogno, perché quelle richieste scrivono importi salvati.

I front end headless hanno bisogno dei prezzi in una data valuta per richiestaEndpoint REST che cambiano valuta per una sola chiamata e la ripristinano al termine

woocs/v3 espone l'elenco delle valute, il prezzo di un prodotto e un lotto di prezzi di prodotti. La callback imposta la valuta richiesta solo se esiste nel negozio, calcola i prezzi con la stessa precedenza del convertitore principale (fisso, paese, ruolo, poi tasso), restituisce valori grezzi per variante con min e max oppure HTML, e ripristina la valuta precedente.

Un importatore di ordini Etsy salvava ordini AUD con la valuta che GeoIP aveva scelto per la richiestaCorreggere l'importatore perché riporti FOX alla valuta base dello shop prima di scrivere un ordine

La valuta base dello shop era AUD. Durante la richiesta di importazione GeoIP aveva portato la valuta corrente su USD, e l'importatore scriveva la valuta corrente su ogni ordine. Una chiamata a $WOOCS->reset_currency(), protetta da class_exists('WOOCS'), è stata aggiunta in due punti del codice degli ordini dell'importatore, così gli ordini vengono scritti nella valuta base. È una patch all'importatore di terze parti e va riapplicata dopo ogni aggiornamento di quel plugin. Il cliente ha confermato che ha funzionato.

Numeri

wordpress.org
  • Installazioni attive 50.000+ contatore di wordpress.org.
  • Recensioni 250 Media 4.4 su 5.
  • Anni di supporto 12 Dal 20 settembre 2014, ultimo aggiornamento 12 ottobre 2026.