Lingua

Contattami

Plugin per WordPress · dal 2016

WPCS

Un selettore di valuta per siti WordPress senza WooCommerce: i prezzi scritti nei contenuti vengono convertiti nella valuta del visitatore.

Prima versione
Installazioni attive
900+
Valutazione
4.1 / 5 (13)Leggi le recensioni
  • PHP
  • Shortcode di WordPress
  • Transient
  • Cookie / sessioni PHP
  • WP-Cron
  • wp_remote_get
  • SimpleXML / SoapClient
  • MaxMind GeoIP (legacy .dat) e GeoIP2 (.mmdb)
  • PharData
  • admin-ajax
  • jQuery
Vedi su wordpress.org wordpress.org

Chi sono

WPCS porta il cambio di valuta di WOOCS sui normali siti WordPress: tour operator, annunci immobiliari, listini di servizi. I prezzi sono scritti in un'unica valuta base tramite lo shortcode [wpcs_price] o un campo post meta e mostrati nella valuta scelta dal visitatore o in quella assegnata al suo paese.

Senza WooCommerce il plugin non ha nessuna delle infrastrutture abituali: né filtri sui prezzi, né gestore di sessioni, né servizio di geolocalizzazione. Deve conservare da solo la scelta del visitatore, recuperare i tassi di cambio da fonti esterne che cambiano o spariscono, e continuare a funzionare dietro cache di pagina intera che servono lo stesso HTML a tutti.

La risposta è una pipeline unica dei prezzi (tasso, precisione, separatori, template del simbolo), una memorizzazione per visitatore intercambiabile, provider di tassi che restituiscono un tasso o un errore invece di uno zero, e una modalità cache in cui i prezzi sono emessi come span etichettati e ridisegnati per ogni visitatore con un'unica chiamata AJAX.

La versione premium e quella gratuita su wordpress.org condividono un'unica base di codice; la versione gratuita è limitata a due valute.

WPCS · cambio valuta

cosa è stato risolto

ATTIVOdal 2016

Conversione e formattazione dei prezzi

shipped · 2016

Cosa offreI visitatori vedono i prezzi nella loro valuta con il simbolo e i decimali giusti. I proprietari possono aggiungere un margine ai tassi o impostare prezzi fissi per valuta.

Problema
I prezzi nei post sono scritti in un'unica valuta base. Ogni visitatore deve vederli convertiti con il tasso, la precisione, i separatori e la posizione del simbolo giusti, senza le funzioni di prezzo di WooCommerce.
Soluzione

Tutti i prezzi passano per un'unica pipeline: moltiplicazione per il tasso, formattazione con precisione e separatori per valuta, poi avvolgimento in un template del simbolo e in uno span etichettato che conserva l'importo base.

Stack
  • PHP
  • Shortcode
  • number_format
Attività · 6
I contenuti riportano i prezzi solo nella valuta base[wpcs_price] converte un valore letterale o un campo post meta con il tasso corrente

Lo shortcode accetta value, oppure meta_value con un post_id opzionale; post_id senza meta_value legge la chiave meta wpcs_price. price() moltiplica per il tasso solo quando la valuta corrente differisce dalla base, poi passa il numero a format_price_numeric() e al filtro wpcs_price.

price_html() avvolge il risultato in uno span con un ID univoco e data-amount che contiene il valore base, che la modalità cache di pagina usa poi per ridisegnarlo.

Alcuni prezzi non devono seguire il tasso di cambiotype="fixed" accetta importi per valuta come 'USD:15,EUR:20'

Per i prezzi fissi lo shortcode analizza l'elenco in una mappa e mostra l'importo per la valuta corrente, oppure 'none' se manca. L'elenco del prezzo in tutte le valute usa la stessa mappa invece di convertire.

Le valute differiscono per centesimi, decimali e separatoriPrecisione da un elenco senza centesimi e decimali per valuta; separatori per valuta

JPY e TWD sono sempre mostrati senza centesimi; qualsiasi valuta può essere aggiunta a quell'elenco con hide_cents. Le impostazioni includono decimali per valuta e separatori decimali e delle migliaia per valuta. La scelta del separatore è un indice in due array paralleli, dove l'indice 0 significa l'impostazione globale, così i siti esistenti mantengono la loro formattazione.

I siti vogliono un margine sopra il tasso di mercato'Interest' per valuta aggiunto al tasso in lettura; la pagina delle impostazioni vede il tasso grezzo

L'interest è un importo fisso salvato accanto al tasso. get_currencies() lo aggiunge al tasso ovunque tranne che nella pagina delle impostazioni del plugin, così l'amministratore modifica il tasso pulito mentre il front end converte con quello rettificato. Un filtro wpcs_currency_data_manipulation viene eseguito dopo per regole personalizzate.

Mostrare un prezzo in tutte le valute e convertire tra due qualsiasiPrezzo formattato riconvertito alla base, poi convertito in avanti; tasso incrociato a/da

L'elenco delle informazioni sul prezzo toglie il separatore delle migliaia dalla stringa già formattata, normalizza il separatore decimale, riconverte alla base con back_convert() (1/rate) e poi converte in avanti in ogni altra valuta. L'endpoint [wpcs_converter] usa rate[to] / rate[from], entrambi rispetto alla base, ed elimina i centesimi per le valute senza centesimi.

A volte un prezzo deve apparire in una sola valuta per tutti i visitatorifix_currency sostituisce la valuta corrente per un solo prezzo convertito, poi la ripristina

Per un prezzo convertito lo shortcode ricorda la valuta del visitatore, passa a quella richiesta se è configurata, renderizza e torna indietro, così il resto della pagina mantiene la scelta del visitatore.

Fonti dei tassi di cambio e aggiornamenti

shipped · 2016

Cosa offreI tassi di cambio si aggiornano da soli da più fonti, e un aggiornamento fallito non trasforma mai un prezzo in zero.

Problema
Le API gratuite dei tassi cambiano, chiudono o iniziano a richiedere chiavi; le banche nazionali pubblicano tassi solo rispetto alla propria valuta; e un recupero fallito non deve sostituire un tasso funzionante con zero.
Soluzione

Ogni fonte è un provider che restituisce un tasso rispetto alla valuta base del sito oppure -1 con un messaggio di errore; WP-Cron aggiorna i tassi e salva solo valori superiori a zero.

Stack
  • PHP
  • wp_remote_get
  • SimpleXML
  • SoapClient
  • WP-Cron
Attività · 6
Le API dei tassi compaiono, cambiano e chiudonoProvider risolti per nome; i nomi sconosciuti passano a un filtro per fonti personalizzate

Il changelog registra il via vai: Yahoo rimosso nella 1.1.1 (2017), Google rimosso nella 1.1.2 (2018), entrambi reinseriti nella 1.1.3 (2018), le fonti che avevano smesso di funzionare rimosse di nuovo nella 1.1.3 e nella 1.1.4, aggregatori personalizzati tramite un hook nella 1.1.5 (2020). Ogni fonte è una classe con getApiUrl() e parseResponse() su una base condivisa RateProvider.

get_rate_provider() associa il valore dell'opzione a un nome di classe; se non esiste alcuna classe, wpcs_add_aggregator_processor permette a un sito di collegare la propria fonte, e wpcs_announce_aggregator la aggiunge all'elenco delle impostazioni. L'elenco delle impostazioni ha 14 fonti.

Le banche centrali quotano ogni valuta rispetto alla propriaTassi incrociati calcolati come rate[to] / rate[base] quando la base del sito differisce

La BCE pubblica rispetto a EUR, la Banca nazionale d'Ucraina rispetto a UAH, la Magyar Nemzeti Bank rispetto a HUF. Ogni provider gestisce tre casi: la base è la valuta della banca, la destinazione è la valuta della banca, nessuna delle due. La fonte MNB è un servizio SOAP con decimali a virgola e quotazioni per unità (per esempio 100 JPY), normalizzate prima della divisione.

Un recupero fallito non deve impostare un tasso pari a zeroI provider restituiscono -1 con un errore; il cron salva solo tassi maggiori di zero

get_rate() restituisce il testo di errore del provider invece di un numero quando il tasso è negativo. rate_auto_update() converte i risultati in float e sostituisce un tasso solo quando il nuovo valore è superiore a zero, così una fonte difettosa non scrive mai zero né un testo di errore come tasso.

I tassi devono aggiornarsi senza che un amministratore apra le impostazioniEvento WP-Cron con intervalli 'week' e 'month' aggiunti

Le impostazioni offrono ogni ora, due volte al giorno, ogni giorno, ogni settimana o ogni mese. Il plugin registra i due intervalli aggiuntivi tramite cron_schedules e pianifica l'evento con l'intervallo selezionato al caricamento quando non è ancora pianificato.

Cambiare la valuta base invalida tutti i tassi salvatisave_etalon() marca la nuova base e recupera di nuovo ogni tasso rispetto ad essa

Il gestore AJAX salva il nuovo flag is_etalon, imposta in memoria la nuova valuta predefinita, richiede un tasso per ogni altra valuta tramite il provider attivo e restituisce i tassi al modulo delle impostazioni.

Configurare a mano molte valute è lento e soggetto a erroriTabella integrata di 118 valute; l'aggiunta di massa recupera tasso e bandiera (interfaccia premium)

WPCS_World_Currencies contiene simbolo, descrizione, decimali e codice della bandiera per ogni valuta. add_currencies_ajax() aggiunge quelle selezionate, recupera un tasso per ciascuna, registra i simboli sconosciuti come segni personalizzati e scarica la bandiera nella libreria multimediale, ripiegando su un URL remoto della bandiera se il download fallisce. La finestra di aggiunta di massa è mostrata solo nella versione premium.

Valuta del visitatore e cache delle pagine

shipped · 2016

Cosa offreOgni visitatore mantiene la valuta scelta anche sulle pagine in cache, così il sito può restare veloce senza mostrare la valuta di qualcun altro.

Problema
La valuta scelta appartiene a un solo visitatore, ma le cache di pagina intera servono lo stesso HTML a tutti, e un archivio con chiave IP mescola i visitatori dietro un unico proxy o NAT.
Soluzione

Memorizzazione per visitatore intercambiabile, e una modalità cache in cui il browser chiede ad admin-ajax di ridisegnare tutti gli span dei prezzi di una pagina in cache per la valuta del visitatore.

Stack
  • Transient
  • Cookie
  • Sessioni PHP
  • admin-ajax
  • jQuery
Attività · 5
L'HTML in cache mostra la valuta di chi ha scaldato la cacheModalità cache: il JS raccoglie tutti gli span .wpcs_price e li ridisegna con un'unica richiesta

Ogni span del prezzo porta un ID univoco e l'importo base. Con l'opzione cache attiva, front.js invia le coppie id/importo a wpcs_get_prices_html, che risolve lato server la valuta del visitatore e restituisce una mappa da id a nuovo HTML più la valuta corrente; i widget del selettore vengono poi sincronizzati con essa. La modalità è presente nel codice del 2016.

Mentre i widget del selettore vengono impostati sulla valuta restituita, un flag impedisce che i loro eventi di cambio avviino un altro cambio di valuta.

Gli hosting differiscono per quale archivio per visitatore funzionaStrategia di archiviazione scelta nelle impostazioni: sessione, transient con chiave IP o cookie

WPCS_STORAGE costruisce il backend per nome da una classe astratta Storage. SessionStorage::create() restituisce false quando session_start() fallisce, e il wrapper ripiega allora sull'archiviazione in transient. Ogni valore viene sanificato in scrittura.

I visitatori dietro uno stesso IP non devono condividere una valuta sceltaArchiviazione con cookie: UUID casuale in un cookie, valori nei transient

Il changelog ne indica il motivo: i transient con chiave IP mescolano gli utenti che condividono un indirizzo. CookieStorage usa come chiave dei transient un cookie UUID. Se gli header sono già stati inviati quando l'ID viene creato, stampa uno script nel footer che invia l'ID a un endpoint AJAX protetto da nonce, che imposta il cookie da una risposta pulita.

?currency= nei link spezza le cache e finisce negli URL condivisiModalità opzionale: impostare la valuta via AJAX e ricaricare, nessun parametro GET

Nella modalità predefinita wpcs_redirect() ricostruisce l'URL corrente mantenendo gli altri parametri GET e l'#ancora. Nella modalità 'No GET data in link' invia la valuta a wpcs_set_currency_ajax e ricarica. I parametri GET riportati nello script della pagina vengono prima sanificati ricorsivamente.

La valuta di benvenuto o geografica deve applicarsi una volta, senza scavalcare una sceltaFlag di prima visita nell'archivio; la logica della valuta predefinita viene eseguita solo finché vale 0

Alla prima richiesta la valuta di benvenuto viene salvata e il flag impostato; anche le regole geografiche vengono eseguite solo per una prima visita unica. Se una valuta salvata viene poi rimossa dall'elenco, get_currencies() ripiega sulla base.

Selezione della valuta tramite Geo-IP

shipped · 2017

Cosa offreI nuovi visitatori vedono automaticamente la valuta del loro paese, in base a regole impostate dal proprietario, senza pagare un servizio di localizzazione.

Problema
Senza WooCommerce non c'è un servizio di geolocalizzazione, quindi il plugin deve associare l'IP di un visitatore a un paese su qualsiasi hosting, dietro proxy e CDN, senza un'API a pagamento.
Soluzione

Un database di paesi MaxMind incluso dietro un'interfaccia di risoluzione, con un database GeoIP2 opzionale scaricato dal proprietario del sito, e regole di amministrazione che associano paesi a valute.

Stack
  • MaxMind GeoIP legacy
  • GeoIP2 / GeoLite2
  • PharData
  • Composer
Attività · 4
Rilevamento del paese su un sito senza WooCommerceMaxMind GeoIP.dat incluso con il suo lettore PHP

WC_Geolocation di WooCommerce non è disponibile su un semplice sito WordPress, perciò il plugin include un proprio database dei paesi. lib/GeoIP.dat e geoip.inc sono incapsulati in OpenIpCountryResolver con una cache per richiesta per IP.

L'IP reale del client è nascosto dietro proxy e CDNLeggere X-Real-IP, poi il primo hop di X-Forwarded-For, poi REMOTE_ADDR

Con il database incluso, un header Cloudflare HTTP_CF_IPCOUNTRY viene usato direttamente e la ricerca nel database viene saltata. Una richiesta il cui REMOTE_ADDR è 127.0.0.1 o ::1 viene risolta come 8.8.8.8 prima che gli header del proxy siano letti.

I dati dei paesi legacy sono meno accuratiOpzione GeoIP2: .mmdb GeoLite2 scaricato e decompresso in amministrazione

Con una chiave di licenza MaxMind l'amministratore scarica l'archivio GeoLite2-Country; il gestore decomprime il .tar.gz con PharData, trova il file .mmdb, lo copia in uploads/currency-switcher e rimuove i file temporanei sia in caso di successo sia di errore. Senza una chiave il plugin resta sul database incluso. Le ricerche passano per il pacchetto Composer geoip2.

Associare paesi a valute, con una sovrascrittura a livello di codiceRegole valuta => paesi; il filtro wpcs_geo_position sovrascrive il paese

init_geo_currency() risolve il paese, lo fa passare per wpcs_geo_position, lo salva per il visitatore e applica la prima regola corrispondente solo alla prima visita. [wpcs_check_country] stampa il paese rilevato per fare il debug di una regola.

Hardening dell'input pubblico

shipped · 2021

Cosa offreI visitatori anonimi non possono abusare del selettore di valuta per iniettare contenuti o cambiare impostazioni, così prezzi e pagine restano come li ha impostati il proprietario.

Problema
Il selettore gira su ogni pagina del front end, espone endpoint AJAX a visitatori anonimi e riceve attributi di shortcode dagli autori, quindi input esterno raggiunge HTML, archivio e impostazioni.
Soluzione

Controllare i codici valuta dall'URL e dal modulo del selettore rispetto all'elenco configurato, limitare e verificare con pattern gli array della richiesta, fare l'escape degli attributi e codificare il JSON per un contesto HTML.

Stack
  • PHP
  • esc_attr
  • sanitize_text_field
  • Nonce
Attività · 5
L'endpoint pubblico dei prezzi riceve un array da visitatori anonimiMassimo 500 elementi, controllo del pattern dell'id, controlli sugli scalari, output JSON_HEX_*

wpcs_get_prices_html è disponibile ai visitatori anonimi. Taglia l'input a 500 voci, accetta solo id che corrispondono al set di caratteri di uniqid() usato da price_html(), salta i prezzi non scalari e codifica la risposta con JSON_HEX_TAG, AMP, APOS e QUOT perché admin-ajax la serve come text/html.

I valori degli shortcode finiscono negli attributi data dell'HTMLAttributi data-* costruiti con esc_attr() su chiave e valore

price_html() scrive nei data-* dello span del prezzo i valori che provengono dagli attributi di [wpcs_price], come l'importo base o l'elenco grezzo 'USD:15,EUR:20' di un prezzo fisso. Chiavi e valori sono sottoposti a escape e racchiusi tra virgolette, così il valore di un attributo non può iniettare markup.

L'endpoint dei tassi costruisce una stringa di shortcode da input della richiestaElenco di esclusione intersecato con i codici noti, valuta validata, precisione con intval

wpcs_rates_current_currency passa l'input del visitatore a do_shortcode(). Sopravvivono solo i codici valuta presenti nella configurazione, il risultato passa per esc_attr e la precisione viene convertita in int, così non può essere iniettata alcuna sintassi di shortcode aggiuntiva.

Una valuta dall'URL o dal modulo del selettore può essere una stringa qualsiasiI valori di URL e modulo sono accettati solo se sono codici configurati; i valori salvati sono sanificati

Il campo del modulo del selettore di valuta e il parametro ?currency= vengono controllati con array_key_exists() rispetto all'elenco configurato prima di raggiungere l'archivio, e WPCS_STORAGE::set_val() sanifica ogni valore.

I simboli come entità HTML si rompevano nei round-trip del modulo delle impostazioniSimboli inviati come hash md5 e riassociati all'elenco dei simboli noti

Simboli come руб. sono salvati come entità. La select invia md5(symbol), e il gestore del salvataggio riassocia l'hash all'entità originale dall'elenco noto, così l'entità non viene né codificata due volte né presa dall'input grezzo. Il salvataggio è protetto da check_admin_referer(), e position viene verificata rispetto a un elenco fisso.

Numeri

wordpress.org
  • Installazioni attive 900+ contatore di wordpress.org.
  • Recensioni 13 Media 4.1 su 5.
  • Anni di supporto 10 Dal 26 maggio 2016, ultimo aggiornamento 21 settembre 2026.