Lingua

Contattami

Plugin per WooCommerce · dal 2020

WOOT

Plugin WooCommerce che mostra il catalogo del negozio come tabelle ordinabili e filtrabili, con l'aggiunta al carrello su ogni riga.

Prima versione
Installazioni attive
1000+
Valutazione
4.8 / 5 (18)Leggi le recensioni
  • PHP
  • WordPress
  • WooCommerce
  • WP_Query
  • MySQL (tabelle personalizzate tramite dbDelta)
  • admin-ajax
  • WC AJAX (wc-ajax=add_to_cart)
  • JavaScript (classi ES6, fetch, AbortController)
  • AlaSQL
  • WPML
Vedi su wordpress.org wordpress.org

Chi sono

WOOT mostra un catalogo WooCommerce come tabella: una riga per prodotto, una colonna per qualsiasi campo del prodotto, attributo, tassonomia o chiave meta, e un controllo di aggiunta al carrello su ogni riga. Le tabelle si configurano nel pannello di amministrazione o si descrivono direttamente in uno shortcode [woot]. Lo stesso motore disegna anche il carrello, gli elenchi di variazioni, gli upsell, i cross-sell, i prodotti correlati e le tabelle del singolo prodotto.

La parte difficile è che una colonna deve svolgere tre compiti: mostrare una cella, ordinare la query del server e fare da filtro. I prodotti sono di diversi tipi (semplice, variabile, raggruppato, esterno, variazione) che si comportano in modo diverso in una cella e nel carrello. Tutti i dati della tabella passano da un unico endpoint AJAX pubblico, che deve restare utilizzabile su cataloghi grandi e non deve esporre bozze, tipi di contenuto non pubblici né file sul server.

Il motore della tabella nel browser (data-table-23.js) è JavaScript semplice con classi ES6 e fetch. Mette in cache le pagine in base all'hash della richiesta, annulla le richieste superate, può portare una tabella in modalità nel browser e interrogarla con SQL su un array JSON, e cambia layout per gli schermi piccoli. jQuery serve solo per attivare gli eventi del carrello propri di WooCommerce.

WOOT · tabelle prodotti

cosa è stato risolto

ATTIVOdal 2020

Query della tabella lato server

shipped · 2020

Cosa offreI clienti scorrono, ordinano e filtrano le tabelle dei prodotti per prezzo, SKU o giacenza nella propria lingua, e gli elenchi preimpostati come i più venduti mostrano il numero esatto di articoli.

Problema
Ogni cambio di pagina, clic di ordinamento e modifica di filtro arriva come una richiesta AJAX. Deve diventare un'unica WP_Query che rispetti la visibilità nel catalogo, i preset della tabella, i filtri, la lingua del visitatore e le chiavi di ordinamento che WP_Query non supporta.
Soluzione

get_table_data() legge un insieme consentito di chiavi della richiesta, applica preset e filtri come trasformazioni degli argomenti della query, interviene sull'SQL solo dove WP_Query non basta e restituisce le righe con un conteggio totale per la paginazione.

Stack
  • PHP
  • WP_Query
  • WooCommerce
  • WPML
Attività · 6
Un endpoint pubblico serve ogni tabella e ogni visitatoreChiavi della richiesta in lista consentita, ciascuna sanitizzata per tipo, costruzione degli argomenti di WP_Query, restituzione di righe e conteggio

get_table_data() è registrata per gli utenti connessi e anonimi. Scorre $_REQUEST con uno switch e mantiene solo le chiavi note: post_type, per_page, orderby, order, current_page, table_id, wp_columns_actions, filter_data, filter_provider, fields, lang, predefinition e shortcode_args_set. I numeri passano da intval, le chiavi da sanitize_key, i payload JSON da json_decode e da un sanitizzatore ricorsivo.

Due di queste chiavi sono nomi di hook. wp_columns_actions viene passata ad apply_filters() per caricare il profilo delle colonne, e filter_provider seleziona il filtro woot_filter_provider_{name} che aggiunge le condizioni di filtro. Entrambe sono sanitizzate come testo ma non verificate rispetto a un elenco di nomi registrati.

La stessa funzione viene chiamata da PHP con un array per le tabelle disegnate al caricamento della pagina, così il percorso del server e quello AJAX condividono un'unica implementazione. Ogni riga è prodotta chiamando la closure di rendering di ogni colonna richiesta, con l'ID del prodotto conservato come pid per le azioni della cella.

Ordinare per prezzo, SKU o giacenza significa ordinare per postmetaLe colonne dichiarano meta_key e orderby; la query mappa le chiavi di ordinamento a meta_value(_num)

Una voce di colonna come price porta 'orderby' => 'meta_value_num' e 'meta_key' => '_price'. get_table_data() cerca la chiave di ordinamento richiesta nel profilo delle colonne e riscrive da essa gli argomenti della query.

Il menu a tendina di ordinamento usa chiavi proprie (price-desc, sku, stock-desc, sales e così via), tradotte in un filtro woot_wp_query_args. Gli ordinamenti per giacenza e vendite totali escludono i prodotti raggruppati ed esterni con una clausola product_type NOT IN, perché quei tipi non hanno un valore proprio di giacenza o di vendite. Per gli ordinamenti del menu a tendina il plugin chiama anche WC()->query->get_catalog_ordering_args(), che collega le clausole di ordinamento proprie di WooCommerce per popolarità, valutazione e prezzo, così questi ordinamenti coincidono con la pagina del negozio.

WP_Query non può ordinare per post_statusCollegare un filtro posts_orderby per quella sola query e rimuoverlo subito dopo l'esecuzione

Per orderby=post_status una closure viene aggiunta a posts_orderby prima di WP_Query e rimossa dopo, così le altre query della stessa richiesta mantengono il proprio ordinamento.

I preset Top-N (più venduti, più recenti) devono mostrare esattamente N prodottiLimitare posts_per_page a N e impostare found_posts a N perché il paginatore conti solo N articoli

Il preset dei più venduti ordina per total_sales e quello dei più recenti per post_date, entrambi con posts_per_page impostato a N. WP_Query riporta found_posts per tutti i prodotti corrispondenti, quindi dopo la query found_posts viene impostato al limite del preset e il paginatore mostra solo i primi N.

I preset richiedono inclusione ed esclusione per più tassonomieAnalizzare una stringa compatta di regole in un tax_query annidato; invertire la relazione per l'esclusione

Una regola di preset è memorizzata come stringa, per esempio product_cat:25,26|pa_color:19|rel:AND. get_by_taxonomy() la trasforma in un unico gruppo tax_query annidato e salta le tassonomie che non esistono più.

Per la variante di esclusione ogni clausola usa NOT IN e la relazione viene scambiata (AND diventa OR e viceversa), ovvero la legge di De Morgan: escludere i prodotti che corrispondono ad A e B significa mantenere quelli fuori da A oppure fuori da B. I preset SKU mappano lo SKU di una variazione all'ID del suo prodotto genitore, perché la tabella elenca i prodotti genitore.

Le richieste admin-ajax perdono la lingua del visitatoreInviare la locale con ogni richiesta e portare WPML su di essa prima di interrogare e disegnare

admin-ajax.php viene eseguito fuori dal contesto linguistico del front-end. draw_table_data() scrive get_locale() nel JSON della tabella, il browser lo rimanda come lang e get_table_data() lo fa passare dal filtro woot_current_lang.

La classe del vocabolario si aggancia a quel filtro e chiama $sitepress->switch_lang(), così WP_Query restituisce i prodotti nella lingua giusta. I titoli delle colonne e le etichette sono tradotti da WOOT_Vocabulary::get() dalla tabella propria del plugin, caricata una volta per richiesta e indicizzata per locale.

Modello delle colonne

shipped · 2020

Cosa offreIl titolare sceglie quali dettagli dei prodotti compaiono come colonne della tabella, compresi i campi personalizzati del negozio, e può copiare o spostare le configurazioni delle tabelle.

Problema
Una colonna è più di una cella. Lo stesso campo deve essere mostrato per ogni tipo di prodotto, guidare l'ordinamento e comparire come widget di filtro, e i titolari dei negozi aggiungono le proprie tassonomie e chiavi meta.
Soluzione

Ogni tabella funziona su un profilo: un array di descrittori di campo le cui closure disegnano la cella, modificano gli argomenti di WP_Query per il filtraggio e descrivono il widget di filtro. Tassonomie e chiavi meta vengono aggiunte al profilo a runtime.

Stack
  • PHP closures
  • WordPress filters
  • MySQL
  • dbDelta
Attività · 5
Una definizione di campo deve guidare la cella, l'ordinamento e il filtroProfilo di descrittori con closure di rendering, argomenti di filtro e interfaccia di filtro per ogni campo

WOOT_WooCommerce::action() restituisce il profilo. Ogni chiave è un campo con un titolo, una closure action che disegna la cella per un ID di prodotto, i dati di ordinamento (order, orderby, meta_key) e, per i campi filtrabili, le closure get_filter_query_args e get_filter_draw_data. L'indice 0 contiene le impostazioni a livello di tabella: tipo di contenuto, stati consentiti, filter provider.

I profili sono registrati per nome e risolti con apply_filters sull'azione della tabella. Il carrello, le variazioni, la vista del singolo prodotto e persino le schermate di amministrazione del plugin (elenco tabelle, chiavi meta, vocabolario) girano sullo stesso motore con i propri profili.

Ogni tassonomia e attributo dei prodotti dovrebbe essere una colonnaColonne da get_object_taxonomies('product') meno quelle interne, mostrate come alberi di termini

product_type, product_visibility, product_shipping_class e translation_priority di WPML vengono rimossi dall'elenco. La cella mostra i termini propri del prodotto tramite build_taxonomy_tree() limitato agli ID dei termini assegnati, come link o testo semplice secondo l'opzione di colonna.

Il lato filtro aggiunge una clausola tax_query il cui operatore (IN, NOT IN, AND) proviene dalle impostazioni della tabella ed è verificato rispetto a quella lista consentita.

I titolari dei negozi hanno bisogno di colonne per chiavi meta arbitrarieRegistro di meta tipizzati (testo, numero, calendario) che fornisce modalità di ordinamento e filtro per ogni chiave

Le chiavi meta sono memorizzate per tabella in woot_tables_meta con un tipo. assemble_meta_for_system() trasforma ciascuna in un campo del profilo: il testo ordina per meta_value e filtra con LIKE; il numero ordina per meta_value_num e filtra con un BETWEEN numerico su un cursore di intervallo; il calendario filtra come DATETIME o come timestamp unix numerico, scelto per campo, perché plugin come ACF memorizzano le date in formati diversi.

I campi vengono uniti al profilo tramite il filtro ext_{action}, e ogni chiave compare anche nel menu di ordinamento con voci crescente e decrescente.

Righe per colonne ripetono le stesse ricerche di prodotto e di opzioniCache statiche a livello di richiesta per prodotti, opzioni della tabella, righe delle colonne e righe dei meta

Ogni closure di colonna ha bisogno dell'oggetto WC_Product, quindi get_product() conserva una mappa statica dei risultati di wc_get_product(). Le opzioni della tabella sono decodificate dal JSON una volta per tabella, le righe dei meta sono messe in cache in base all'md5 della stringa SQL, e il costruttore dei filtri risolve il profilo una volta invece che per ogni campo.

Le configurazioni delle tabelle hanno bisogno di archiviazione, clonazione e trasferimento propriQuattro tabelle personalizzate tramite dbDelta; clone copia colonne e meta; import riempie da JSON

install.php crea woot_tables, woot_tables_columns (indicizzata per table_id e is_active, ordinata per pos_num), woot_tables_meta e woot_vocabulary. L'ordine delle colonne trascinate arriva come elenco di ID e viene riscritto come pos_num.

clone() copia la riga della tabella, poi le sue colonne e chiavi meta sotto il nuovo ID di tabella. L'esportazione scarica le quattro tabelle e le opzioni come JSON; l'importazione svuota ogni tabella e inserisce le righe, dopo un controllo di capability e nonce.

Filtri

shipped · 2020

Cosa offreI clienti restringono la tabella per intervalli, date, categorie e testo, e le tabelle seguono il plugin di filtri già presente nel negozio sulla stessa pagina.

Problema
I filtri arrivano dal browser come una mappa piatta chiave/valore e devono diventare argomenti di WP_Query: intervalli meta, clausole di tassonomia, ricerca testuale e intervalli di date. I negozi che usano già un plugin di filtri si aspettano che la tabella lo segua.
Soluzione

Un filter provider passa ogni chiave alla closure di query della colonna. I plugin di filtri esterni si collegano come provider alternativi che restituiscono un elenco di ID di prodotto.

Stack
  • WP_Query
  • meta_query
  • tax_query
  • posts_where
  • $wpdb->prepare
Attività · 5
Un filtro per intervallo di date richiede due input per una colonnaDividere un campo calendario in key e key---to; il provider rimuove il suffisso e inverte il confronto

Quando il modulo del filtro viene costruito, un campo calendario viene duplicato sotto una chiave ---to con le etichette Da e A. Al ritorno provider() vede una chiave sconosciuta che termina con ---to, ne rimuove il suffisso e chiama la stessa closure di colonna con un flag, così la closure confronta con <= invece di >=.

I cursori di intervallo hanno bisogno di limiti prima che sia impostato un filtroCalcolare MIN e MAX della chiave meta in SQL quando l'amministratore ha lasciato i limiti non impostati

Se un campo di intervallo non ha minimo o massimo configurati (-1), get_field_drawing_data() esegue SELECT MIN o MAX(cast(meta_value as UNSIGNED)) su postmeta per la chiave meta del campo tramite $wpdb->prepare. Il nome della funzione proviene da una lista consentita interna, non dalla richiesta. Il cursore del numero di commenti legge i propri limiti dalla tabella dei post.

La ricerca testuale deve coprire i campi scelti senza SQL injectionClausola posts_where con esc_like e prepare; elenco dei campi limitato a tre colonne dei post

I campi ricercabili provengono dallo shortcode ma vengono filtrati su post_title, post_content e post_excerpt. Ognuno diventa LOWER(field) LIKE %s con il valore sottoposto a escape da esc_like e associato da prepare.

Nel browser una ricerca parte con Invio solo quando l'input raggiunge il suo minlength, e un Invio vuoto o Esc rimuove il termine, il che evita che parole parziali troppo corte raggiungano il server.

Le tabelle devono seguire il filtro HUSKY (WOOF) sulla stessa paginaRiprodurre la richiesta di WOOF, eseguire la sua previsione degli ID e passare gli ID a post__in

Con filter_provider=woof lo shortcode cattura i dati della richiesta di WOOF nel JSON della tabella. A ogni chiamata AJAX il provider ripristina $_GET da esso, chiede tutti i risultati, chiama woof_products_ids_prediction() e legge woof_wp_query_ids, accettando un array o una stringa separata da virgole e mantenendo solo interi positivi. Nessun ID significa post__in = [0].

Lo stato del filtro MDTF deve raggiungere la richiesta AJAXDecodificare lo stato MDTF, richiedere solo gli argomenti della query, eliminare i suoi flag, precaricare gli ID dei prodotti

Il parametro page_mdf viene decodificato e MDTF viene eseguito con mdf_get_query_args_only, così restituisce argomenti di WP_Query invece di HTML. La clausola meta mdf_hide_post e quella di product_visibility vengono rimosse (WOOT aggiunge le proprie), l'ordinamento viene scartato e la query viene eseguita con fields=ids. L'elenco di ID viaggia come dati del filtro e diventa post__in.

Aggiunta al carrello dalla tabella

shipped · 2020

Cosa offreI clienti acquistano qualsiasi tipo di prodotto direttamente dalla tabella, aggiungono molte righe in una volta, e il carrello resta allineato al resto del negozio.

Problema
Ogni tipo di prodotto ha bisogno di un diverso controllo di acquisto, le quantità sono limitate dalla giacenza, e il carrello della tabella deve restare allineato al mini-carrello del tema e alla pagina del carrello di WooCommerce.
Soluzione

Il server emette un descrittore compatto per tipo di prodotto, il browser costruisce i controlli da esso e invia all'endpoint AJAX proprio di WooCommerce. Il contenuto del carrello viene disegnato dallo stesso motore di tabelle.

Stack
  • WooCommerce cart API
  • WC AJAX
  • JavaScript
  • fetch
Attività · 5
Semplice, variabile, raggruppato ed esterno richiedono controlli diversiIl server emette un descrittore data-about tipizzato; JS costruisce input, checkbox o link a popup

add_to_cart.php controlla is_purchasable() e is_in_stock() e, quando la giacenza è gestita, richiede una quantità diversa da zero. Per i prodotti semplici il descrittore porta ID, giacenza e SKU; il client costruisce un input numerico con max impostato alla giacenza, reso di sola lettura per i prodotti venduti singolarmente, più una checkbox per l'aggiunta multipla.

I prodotti variabili e raggruppati hanno un pulsante che apre un popup con una tabella dei loro figli. I prodotti esterni rimandano all'URL esterno. I tipi sconosciuti passano dal filtro woot_woocommerce_add_to_cart così altri plugin possono fornire il markup.

L'aggiunta al carrello deve comportarsi come il pulsante proprio di WooCommercePOST a wc-ajax=add_to_cart, poi attivare wc_fragment_refresh per i mini-carrelli del tema

L'URL dell'endpoint viene preso da wc_add_to_cart_params quando WooCommerce lo stampa, così gli endpoint AJAX personalizzati continuano a funzionare. La quantità viene confrontata con max prima dell'invio. Dopo il successo il plugin attiva wc_fragment_refresh, aggiorna le proprie informazioni sul carrello e, a seconda di un'opzione della tabella, reindirizza al carrello o al checkout.

I clienti vogliono aggiungere molte righe con una sola azioneRighe selezionate e quantità in una sola richiesta; le variazioni ricevono ID del genitore e attributi

Una checkbox nell'intestazione della colonna del carrello seleziona tutte le righe. add_to_cart_some() scorre gli articoli inviati. Per una variazione ricostruisce la mappa attribute_* da get_attributes('edit') e chiama WC()->cart->add_to_cart() con l'ID del genitore, la quantità, l'ID della variazione e quella mappa, che è la forma attesa dal carrello di WooCommerce.

I prodotti variabili hanno bisogno di una tabella delle loro variazioniIl filter provider porta post_type a product_variation e limita post__in ai figli

WOOT_WooCommerceVariations::filter_provider() imposta post_type a product_variation e post__in ai figli del genitore dopo aver verificato che il genitore sia visibile al visitatore. Le tabelle di upsell, cross-sell, raggruppati e correlati condividono la classe base WOOT_WooCommerceUniversal e differiscono solo per la sorgente degli ID.

Nelle righe delle variazioni il titolo riceve in coda i nomi dei termini di attributo, e le colonne di tassonomia leggono lo slug di attributo proprio della variazione invece dei termini assegnati al post.

Il carrello stesso dovrebbe essere una tabella ordinabileLe closure del profilo carrello ricevono ID del prodotto e quantità; il motore la disegna in modalità JSON

Il profilo woot_cart combina le colonne di prodotto configurate con quantità, subtotale (WC_Cart::get_product_subtotal) e rimozione. Ogni modifica del carrello risponde con una tabella del carrello aggiornata, il numero di articoli e il subtotale. Rimozione e aggiornamento trovano la riga del carrello tramite product_id o variation_id.

Il popup del carrello assume lo stile della tabella che lo ha aperto: il blocco di stile del genitore viene copiato e il suo ID di tabella sostituito con l'ID della tabella del popup. Un'opzione della tabella può anche nascondere i prodotti già nel carrello tramite post__not_in.

Motore della tabella nel browser

shipped · 2020

Cosa offreLe tabelle rispondono rapidamente a paginazione e ordinamento, più tabelle possono condividere una pagina e le tabelle larghe restano utilizzabili sui telefoni.

Problema
Paginazione, ordinamento e ricerca devono sembrare immediati, più tabelle con skin diverse possono condividere una pagina e le tabelle larghe devono funzionare sui telefoni.
Soluzione

data-table-23.js è una classe senza dipendenze per tabella con una cache basata sull'hash della richiesta, annullamento delle richieste, una modalità SQL opzionale nel browser e un passaggio a un layout compatto.

Stack
  • JavaScript (classi ES6)
  • fetch
  • AbortController
  • AlaSQL
  • CustomEvent
Attività · 6
Una pagina o un ordinamento già visti non dovrebbero raggiungere di nuovo il serverMettere in cache le risposte sotto l'hash dell'intero oggetto della richiesta; svuotare la cache su eventi

__hash_object() serializza request_data in JSON e lo riduce a un hash a 32 bit usato come chiave della cache. La cache è disattivata nelle modalità JSON e load-more, dove i dati sono già locali. Estensioni come compare e favourites inviano table23-reset-cache quando i loro dati cambiano.

I cataloghi piccoli dovrebbero ordinarsi e cercarsi senza viaggi al serverLa modalità to_json carica tutte le righe una volta, poi le ordina, le pagina e le cerca con AlaSQL

Con la modalità to_json il server restituisce ogni riga (posts_per_page -1). Dopo la prima risposta la tabella passa da sé alla modalità json, e draw_data() costruisce SELECT ... WHERE ... ORDER BY ... LIMIT ... OFFSET e lo esegue con AlaSQL sull'array. Una tabella di una sola pagina trovata nella cache viene cercata e ordinata allo stesso modo.

Una risposta precedente lenta non deve sovrascrivere una pagina più recenteInterrompere il fetch precedente con AbortController prima di inviare il successivo

Ogni tabella mantiene il proprio AbortController corrente. Una nuova richiesta di pagina, ordinamento o filtro interrompe quella in sospeso, così una risposta precedente lenta non può più sovrascrivere la pagina più recente.

Le tabelle larghe devono passare a un layout compatto sui telefoniRidisegnare solo quando la larghezza supera il breakpoint; gestore del resize bloccato per 999 ms

Ogni tabella ha il proprio compact_view_width. Il listener di resize confronta il nuovo stato con il precedente e ridisegna solo in caso di cambiamento; un flag di blocco gli impedisce di scattare di nuovo per 999 ms. Le colonne marcate hide-on-mobile vengono saltate quando si costruiscono le intestazioni, l'intestazione flottante viene disattivata in modalità compatta e le regole media-hide per colonna sono generate come CSS per l'ID HTML della tabella.

Più tabelle con skin diverse in una stessa paginaIl CSS dello skin usa un segnaposto tid sostituito dall'ID HTML di ogni tabella al momento del rendering

get_theme_css() legge lo skin prima dalla cartella woot-skins del tema e poi dalla cartella skins del plugin, sostituisce il segnaposto tid con l'ID HTML della tabella ed elimina commenti e spazi superflui. Ogni regola è limitata a una sola tabella, così gli skin non si propagano tra le tabelle della stessa pagina.

Le celle possono contenere tabelle proprieLa configurazione della tabella annidata viaggia come JSON in un div nascosto e viene istanziata dopo ogni disegno

draw_table_data() codifica la configurazione con JSON_HEX_QUOT e JSON_HEX_TAG così può stare dentro l'HTML senza uscire dall'elemento. Dopo che le righe sono state disegnate, do_after_draw() trova le tabelle dentro le celle e crea per ciascuna un'istanza di WOOT_GeneratedTables, senza la barra di scorrimento orizzontale.

Sicurezza degli endpoint pubblici

nel prodotto

Cosa offreLe tabelle pubbliche mostrano solo i prodotti che devono essere visibili, e i visitatori non possono usare le richieste delle tabelle per raggiungere contenuti nascosti o eseguire codice.

Problema
I dati delle tabelle, i popup e le azioni del carrello sono serviti a visitatori anonimi tramite admin-ajax, e le richieste portano impostazioni della tabella, argomenti dello shortcode, nomi di skin e nomi di hook.
Soluzione

La visibilità è imposta al momento della query e per singolo post, i nomi che raggiungono percorsi, CSS o SQL sono ridotti a insiemi di caratteri sicuri in un unico punto e ogni scrittura in amministrazione controlla capability e nonce.

Stack
  • WordPress capabilities
  • nonces
  • $wpdb->prepare
  • input sanitization
Attività · 5
Le richieste pubbliche delle tabelle portano un tipo di contenuto e uno stato scelti dal clientForzare lo stato publish per i visitatori; i tipi non pubblici solo per le tabelle costruite su di essi

Subito prima che WP_Query venga eseguita, post_status viene riportato a publish per chiunque non abbia read_private_posts, qualunque cosa abbiano chiesto la richiesta, lo shortcode o le impostazioni della tabella. Uno stato proveniente dagli argomenti dello shortcode è rispettato solo per tali utenti.

I tipi di contenuto non visualizzabili (coupon, ordini, template) sono rifiutati per gli utenti senza edit_posts, a meno che la tabella salvata sia stata costruita per quel tipo di contenuto da un amministratore.

Popup e shortcode ricevono un ID di prodotto dal clientwoot_can_read_post() controlla stato, visualizzabilità e, per le variazioni, il genitore

Una funzione decide se un visitatore può vedere i dati di un post: i post pubblicati di tipi pubblici sono aperti, i tipi non pubblici richiedono diritti di modifica, gli altri stati richiedono read_post, e una variazione è visibile solo quando lo è il suo genitore. Le tabelle del singolo prodotto, delle variazioni, degli upsell e degli altri popup, lo shortcode della galleria e le estensioni la chiamano prima del rendering.

I nomi degli skin arrivano da più fonti e finiscono in un percorso di filebasename() più un filtro [A-Za-z0-9_-] in un unico punto di controllo; ID della tabella filtrato prima del CSS

Lo skin può provenire da ?woot_skin=, dagli shortcode, dalle estensioni o dalle impostazioni della tabella, e tutti passano da get_theme_css(). Lì il nome viene ridotto con basename() e un filtro di caratteri che rimuove punti e slash, così non può puntare fuori dalle cartelle degli skin. L'ID HTML della tabella, che viene scritto nel CSS stampato, è filtrato allo stesso modo perché parentesi graffe o angolari non possano uscire dal blocco style.

L'endpoint dei popup richiama hook e shortcode per nomeSolo gli hook woot_ sono richiamabili, call_id viene ripulito, vengono eseguiti solo gli shortcode del plugin

get_smth() è pubblica. Il suo ramo generico chiama apply_filters su un nome proveniente dalla richiesta solo quando il nome inizia con woot_, e il call_id che lo accompagna viene ridotto a lettere, cifre, trattino basso e trattino prima che qualsiasi query a valle lo veda. Il ramo shortcodes_set rimuove ogni shortcode non presente nella lista consentita del plugin prima di do_shortcode(). I rami di esportazione e importazione richiedono manage_woocommerce.

Scritture di amministrazione e SQL costruito da nomi di colonnaCapability e nonce su ogni scrittura; identificatori SQL ridotti a [A-Za-z0-9_]

I gestori di tabelle, colonne, meta e vocabolario controllano manage_woocommerce e woot_settings_nonce prima di scrivere. L'estensione degli allegati aggiunge un controllo di login e controlli edit_post a livello di oggetto.

I nomi delle colonne, i campi ORDER BY e le chiavi WHERE non possono essere associati con prepare(), quindi get_rows() li riduce a un insieme di caratteri sicuro, limita l'ordine a ASC o DESC e la logica ad AND o OR, e associa solo i valori.

Numeri

wordpress.org
  • Installazioni attive 1000+ contatore di wordpress.org.
  • Recensioni 18 Media 4.8 su 5.
  • Anni di supporto 6 Dal 4 settembre 2020, ultimo aggiornamento 12 ottobre 2026.