TableOn
Mostra articoli WordPress e custom post type come tabelle ordinabili e filtrabili, costruite da un costruttore di colonne.
- Prima versione
- Installazioni attive
- 200+
- Valutazione
- Leggi le recensioni
Chi sono
TableOn mostra gli articoli di qualsiasi post type come tabella. L'amministratore costruisce le tabelle a partire da colonne predefinite (titolo, miniatura, autore, date, numero di commenti, tassonomie, galleria) e da campi meta dei post, aggiunge un modulo di filtro, sottoinsiemi predefiniti e skin, e colloca il risultato con uno shortcode, in un popup o all'interno di un altro sito tramite un iframe.
Dal punto di vista ingegneristico si compone di due parti. Sul server un unico endpoint ajax pubblico trasforma la definizione di una tabella e uno stato dei filtri in una WP_Query e restituisce le righe come JSON. Nel browser una classe di tabella senza dipendenze pagina, ordina e cerca, via ajax o su dati già caricati, e passa a un layout compatto sugli schermi stretti.
Le parti difficili sono trasformare un'unica definizione configurabile di tabella in una WP_Query per qualsiasi post type, tipizzare i campi meta che WordPress memorizza come stringhe e mantenere indipendenti, in una sola pagina, più tabelle con skin e lingue diverse.
TableOn · tabella degli articoli
cosa è stato risolto
Profili delle colonne ed endpoint delle query
shipped · 2020Cosa offreIl personale decide quali colonne mostra una tabella e quali articoli include, e ogni colonna può essere ordinata e filtrata allo stesso modo.
- Problema
- Un unico endpoint ajax serve le righe di ogni tabella: qualsiasi post type, colonne meta definite dall'amministratore, filtri, sottoinsiemi predefiniti e ordinamenti. Lo stesso campo deve generare una cella, ordinare la query e fare da filtro.
- Soluzione
Una tabella è descritta da un profilo: un array di chiavi di campo, ciascuna con closure per il valore della cella, per gli argomenti della query e per i dati del widget di filtro. Le colonne richieste vengono cercate in quel profilo per chiave.
- Stack
Un'unica definizione di campo deve guidare la cella, l'ordinamento e il filtroI campi richiesti si limitano a indicizzare il profilo; ogni chiave porta con sé le proprie closure
TABLEON_Default::action() restituisce il profilo: per ogni chiave un titolo, una closure 'action' che genera la cella e, per le chiavi filtrabili, get_filter_query_args e get_filter_draw_data. get_table_data() scorre i campi richiesti e chiama $profile[$field]['action'] solo quando la chiave esiste, quindi un nome di campo sconosciuto viene ignorato. Ogni riga porta inoltre pid, che le azioni di cella sul front usano.
I campi meta definiti dall'amministratore richiedono un comportamento tipizzato nelle queryRighe meta di tipo testo, numero o calendario; ogni tipo costruisce la propria meta_query
assemble_meta_for_system() trasforma una riga della tabella dei meta in una voce del profilo. Il testo usa LIKE e un campo di testo. Il numero usa BETWEEN con tipo numeric da un valore 'min:max', un cursore a intervallo e l'ordinamento meta_value_num. Il calendario confronta come timestamp unix (numerico) o come DATETIME, scelto per campo, perché plugin come ACF memorizzano stringhe di data mentre altri memorizzano timestamp.
Alcuni ordinamenti non sono esprimibili come argomenti di WP_QueryClosure temporanea su posts_orderby per post_status, rimossa subito dopo la query
L'ordinamento per post_status viene eseguito con una closure agganciata a posts_orderby per la durata di una WP_Query e rimossa subito dopo, così non si propaga ad altre query della pagina. I valori del menu a discesa di ordinamento come title-desc o <meta_key>-desc sono mappati su orderby/order, con meta_value_num per i campi meta tipizzati come numero.
Tabelle limitate a un sottoinsieme scelto di articoliLe regole di predefinizione diventano post__in, post__not_in, author__in e tax_query
Ogni tabella può memorizzare regole: ID degli articoli, ID esclusi, autori, termini da includere o escludere. get_table_data() le applica prima dei filtri del visitatore, con gli ID convertiti in interi. Un attributo dello shortcode author=N viene inglobato nelle stesse regole (commento nel codice datato 16-09-2020).
La configurazione delle tabelle non si adatta bene ai meta dei postQuattro tabelle proprie create con dbDelta: tabelle, colonne, campi meta, vocabolario
Le colonne sono righe con table_id, field_key, pos_num, is_active, show_on_mobile e opzioni JSON, indicizzate su table_id e is_active, così le colonne attive di una tabella richiedono una sola query indicizzata. L'intera configurazione si esporta come un unico documento JSON; l'importazione svuota ogni tabella e reinserisce le righe, dietro un controllo del ruolo.
Modulo di filtro su articoli e meta
shipped · 2020Cosa offreI visitatori restringono le tabelle per testo, categorie, intervalli numerici e date. I limiti dei cursori seguono i dati reali, quindi il personale non deve inserirli.
- Problema
- Il modulo di filtro viene generato dallo stesso profilo per qualsiasi post type: ricerca testuale, alberi di tassonomia, intervalli numerici e intervalli di date. Il plugin non ha un proprio indice, quindi limiti e opzioni devono provenire da dati reali.
- Soluzione
Ogni chiave di filtro fornisce i dati di disegno (limiti, opzioni, etichette) e un costruttore di query. I limiti numerici provengono da query MIN/MAX a meno che l'amministratore non li abbia impostati. Le condizioni che WP_Query non può esprimere passano da posts_where: i valori di testo sono sottoposti a escape e preparati, le date formattate con date() e i conteggi convertiti con intval().
- Stack
Ricerca testuale nelle colonne scelte, senza distinzione tra maiuscole e minuscole, sicuraposts_where con LOWER(field) LIKE; campi in lista bianca, valori preparati ed esc_like
Le colonne ricercabili provengono dall'attributo dello shortcode tableon_text_search_by ma vengono filtrate su post_title, post_content e post_excerpt, quindi un nome di colonna non raggiunge mai l'SQL dall'esterno dell'elenco. Il termine viene portato in minuscolo con un helper compatibile con i caratteri multibyte, sottoposto a escape con esc_like() e associato con $wpdb->prepare().
I cursori a intervallo richiedono limiti che l'amministratore non ha inseritoI limiti predefiniti sono MIN/MAX di CAST(meta_value AS UNSIGNED) per la chiave meta
get_field_drawing_data() usa i valori min/max memorizzati della tabella quando sono impostati; altrimenti interroga wp_postmeta per la chiave con un cast numerico, così i numeri memorizzati come testo vengono confrontati come numeri. I limiti del numero di commenti sono MIN/MAX su wp_posts per il post type della tabella.
Un campo data richiede due input, da e aDisegnare una chiave gemella con suffisso ---to; il provider la instrada con un flag di direzione
draw_filter_form_data() duplica un campo calendario come <key>---to con le etichette 'From:' e 'To:'. La chiave non esiste nel profilo, quindi provider() riconosce il suffisso, lo rimuove e chiama il costruttore di query del campo originale con is_calendar_dir_to = true, che inverte >= in <=.
La selezione multipla di tassonomia richiede IN, NOT IN o AND per tabellaOperatore memorizzato per tabella, verificato con una lista bianca prima di tax_query
L'opzione mselect-logic viene letta dalle opzioni di filtro della tabella e sostituita con IN se non è uno tra IN, NOT IN, AND. Gli ID dei termini entrano in tax_query tramite term_id.
Elenchi gerarchici di termini con insiemi di inclusione ed esclusioneAlbero ricorsivo per genitore con prefisso di profondità, filtrato da elenchi di ID
build_taxonomy_tree() percorre i termini genitore per genitore, salta gli ID esclusi, mantiene solo gli ID inclusi quando quell'elenco è impostato e antepone ai titoli un trattino per livello, così un select piatto mostra la gerarchia. Esegue una chiamata get_terms() per genitore con hide_empty.
Altri plugin di filtro devono poter pilotare la stessa tabellaL'hook provider tableon_filter_provider_{name} riscrive gli argomenti di WP_Query
La richiesta indica un provider di filtro; get_table_data() fa passare gli argomenti della query, i dati del filtro e gli argomenti dello shortcode attraverso il filtro corrispondente. Il modulo integrato è il provider 'default'. Taxonomy Chain Menu usa il lato client di questo meccanismo, scrivendo filter_data nella tabella e chiedendole di ridisegnarsi.
Motore di tabella lato client
shipped · 2020Cosa offrePaginazione, ordinamento e ricerca risultano rapidi perché i dati già caricati vengono riutilizzati, e le tabelle larghe passano a un layout compatto sui telefoni.
- Problema
- Le tabelle girano in pagine, popup e iframe e devono paginare, ordinare e cercare senza attendere il server a ogni clic. I clic rapidi fanno arrivare le risposte in ordine sparso, e le tabelle larghe non entrano nei telefoni.
- Soluzione
Una classe JavaScript senza dipendenze con tre modalità di dati, un motore SQL nel browser per le righe caricate, una cache per richiesta, l'annullamento delle richieste e un layout compatto sotto una larghezza configurabile.
- Stack
Una risposta precedente lenta non deve sovrascrivere una pagina più recenteAbortController annulla il fetch precedente prima che parta una nuova richiesta
Ogni richiesta ajax memorizza il proprio AbortController; una nuova richiesta annulla prima quella in sospeso, così viene disegnato solo l'ultimo stato di pagina, ordinamento o filtro.
Ordinare e paginare dati già presenti nel browserLa modalità json esegue SELECT, ORDER BY e LIMIT di AlaSQL sulle righe caricate
Nella modalità json le righe arrivano incorporate nella pagina. Ricerca per titolo, conteggio, ORDER BY e LIMIT/OFFSET vengono costruiti come stringhe SQL ed eseguiti da AlaSQL sull'array in memoria, quindi paginazione e ordinamento non richiedono richieste.
Caricare una volta via ajax, poi smettere di fare andata e ritornoModalità to_json: la prima risposta ajax diventa dato locale e la modalità passa a json
to_json parte come ajax con un flag di passaggio. Dopo la prima risposta le righe vengono conservate come table_data e la modalità diventa json. Sul server le modalità json richiedono tutti gli articoli corrispondenti (posts_per_page = -1), cosa che il codice segnala come rischio di memoria, quindi la modalità si adatta a insiemi piccoli e medi.
Richieste ripetute per pagine già visteMettere in cache le risposte sotto un hash a 32 bit dell'oggetto JSON della richiesta
set_cache() e get_cache() indicizzano le risposte con __hash_object(request_data), un hash di stringa su JSON.stringify dell'intera richiesta (pagina, ordinamento, filtri). Tornare a una pagina già vista viene servito dalla memoria. La cache è disattivata nelle modalità json, to_json e load-more, dove i dati sono comunque locali.
Tabelle larghe sui telefoniVista compatta sotto una larghezza impostata, nascondimento mobile per colonna, resize con throttling
Sotto compact_view_width le righe vengono disegnate come celle impilate e le intestazioni sono nascoste. Il gestore del resize ridisegna solo quando lo stato compatto cambia davvero e si blocca per 999 ms tra un'esecuzione e l'altra. Le colonne possono essere eliminate su mobile (hide_on_mobile) o nascoste sotto una larghezza in pixel da regole @media generate. Le righe sono costruite in un DocumentFragment e inserite una sola volta.
Incorporamento, isolamento e accesso all'amministrazione
nel prodottoCosa offrePiù tabelle con stili diversi possono condividere una pagina, le tabelle possono essere mostrate su altri siti web, le etichette seguono la lingua del sito e ruoli del personale scelti possono gestirle.
- Problema
- Più tabelle con skin diverse possono condividere una pagina, una tabella può essere incorporata in un altro sito, le etichette devono seguire la lingua del sito e la gestione delle tabelle non è limitata agli amministratori.
- Soluzione
Il CSS è limitato all'id HTML di ciascuna tabella al momento del rendering, l'incorporamento remoto passa da uno script loader generato, le etichette passano da una tabella di traduzione e le schermate di amministrazione sono protette da un'impostazione dei ruoli.
- Stack
Più tabelle con skin diverse in una paginaIl CSS della skin usa un segnaposto 'tid' sostituito con l'id HTML della tabella, poi minificato
get_theme_css() carica la skin prima dalla cartella tableon-skins del tema, poi dal plugin, sostituisce tid con l'id HTML della tabella, elimina commenti e spazi. Anche gli stili per colonna e il CSS personalizzato della tabella sono preceduti da #<table id>, così le regole di una tabella non toccano le altre.
Mostrare una tabella su un sito che non è WordPressLo script loader costruisce un iframe lazy verso una pagina che usa il template vuoto del plugin
Una richiesta con tableon-remote-page e anchor restituisce JavaScript invece di una pagina: le impostazioni come variabili più remote.js, che crea un iframe a caricamento lazy nel contenitore indicato. La pagina al suo interno usa un template vuoto registrato dal plugin, quindi l'impalcatura del tema non viene mostrata.
La configurazione JSON inline non deve uscire dal proprio contenitore HTMLjson_encode con JSON_HEX_TAG, JSON_HEX_QUOT e JSON_HEX_AMP in un div nascosto
Le impostazioni della tabella e, nella modalità json, tutte le righe vengono stampate nella pagina. Codificare <, >, virgolette e & come escape unicode fa sì che titoli degli articoli o valori meta non possano chiudere l'elemento né iniettare markup.
Stringhe dell'interfaccia in più lingue senza file .poUna tabella di vocabolario associa una stringa a valori per lingua, caricata una volta per richiesta
TABLEON_Vocabulary legge l'intera tabella una sola volta in un array statico; get() restituisce il valore per la lingua corrente o la stringa originale. La lingua corrente passa dal filtro tableon_current_lang, che cambia anche WPML, così le richieste ajax vengono generate nella lingua del visitatore.
Editor diversi dagli amministratori gestiscono le tabellecan_manage_data(): amministratore o ruoli dalle impostazioni, più un nonce a ogni salvataggio
Le schermate di amministrazione si registrano solo per gli utenti che superano can_manage_data(), che accetta gli amministratori e i ruoli elencati nell'impostazione user_roles_can. I gestori di salvataggio, creazione ed eliminazione verificano ciascuno il nonce 'tableon'.
Numeri
wordpress.org- Installazioni attive 200+ contatore di wordpress.org.
- Recensioni 15 Media 4.6 su 5.
- Anni di supporto 6 Dal 2 novembre 2020, ultimo aggiornamento 12 giugno 2026.