Gettin 'Jiggy wit' il Database WP convertire gli slug di categoria in ID ($ wpdb)

Il tipo di estrazione dati "out of the box" che puoi eseguire con Wordpress è fantastico? davvero, lo è. Finché non lo è. Vedete, in realtà ci sono parecchi scenari là fuori in cui avete bisogno di più di una semplice funzione o tag per afferrare i dati che volete e convertirli in qualcosa che sia effettivamente utile. Allacciate le cinture di sicurezza, stiamo per saltare fuori dai binari per qualche minuto?


Interfaccia con il database per divertimento e Profitto ID di categoria

Oggi ho intenzione di condividere con te un frammento di codice che ho trovato incredibilmente utile negli ultimi mesi? ma prima di continuare a leggere, sappi che lo è

  • ? andando ad approfondire alcune cose del database (che possono diventare pelose se sei un nuovo sviluppatore WP)
  • ? Userò a veramente esempio specifico per insegnare alcune lezioni molto più grandi.

In realtà, l'esempio in sé non ha senso? questo è tutto sulle tecniche che useremo per risolvere il problema ipotetico. Alla fine imparerai che non c'è praticamente limite a ciò che puoi fare con qualsiasi informazione che viene salvata all'interno del database di WordPress.

Oh, e dato che è roba casalinga, immagino che qualcuno là fuori avrà un modo diverso di farlo. Condividi, battibecca, parla di questo nella sezione commenti: P Sono tutto orecchie!

La nostra assunzione: Abbiamo un elenco di slug di categorie (salvato da una metabox personalizzata in una pagina).

Il nostro problema: Non è possibile utilizzare gli slug di categoria in query_posts () ;, ma se l'unica informazione che abbiamo è lo slug, dobbiamo trovare un modo per trasformarlo in qualcosa che possiamo effettivamente usare: ID di categoria. Ci sono alcuni modi per convertire gli slug in ID (get_category_by_slug, get_term_by, ecc.), Ma non sono altrettanto flessibili o potenti come il metodo che ti mostrerò. Funzioneranno comunque? Sì, quelli funzioneranno bene e li discuteremo alla fine. Come ho detto, stiamo andando fuori pista per qualche minuto qui? godetevi il viaggio :)

Il nostro obbiettivo: convertire un pezzo di dati di categoria in un altro chiedendo il database per esso, combinarlo con altri pezzi simili per creare un array, quindi trasformare quell'array in una stringa che possiamo effettivamente usare in altri posti del nostro tema o plugin.


Il problema ipotetico: come afferrare l'ID di categoria da una lumaca di categoria


Il nostro problema ipotetico include una meta box personalizzata che restituisce solo Slug di categoria. Il nostro problema è che abbiamo bisogno di convertirli in ID prima di poterli utilizzare in query_posts ();.

Immaginare questo: Hai un campo personalizzato assegnato a un modello di pagina chiamato "category_filter"Ciò che è fare è prendere una lista di categorie che l'utente ha selezionato da una meta-box personalizzata, e restituisce le loro categoria-lumache. Grande? lumache. Cosa faremo con quelli?

A partire dall'attuale versione di WordPress, non esiste un modo facile e veloce (almeno quello che potrei trovare) che ti permetta di convertire semplicemente gli slug di categoria in ID di categoria. Che, francamente, fa schifo perché questo tipo di roba di "conversione di valuta" è straordinariamente facile se stiamo cercando di fare la stessa cosa con i dati del post (ad esempio: trasformare un nome in una lumaca, una lumaca in un ID o un ID in un nome).

Nel caso dei post, tutto ciò che devi fare è attivare query_posts o get_posts e diventa abbastanza facile afferrare tutto ciò di cui hai bisogno. Non tanto nel caso di categorie? ma come qualsiasi cosa in WordPress, dove c'è una volontà, c'è un modo.

Sappiamo che i dati esistono nel nostro database WordPress; Quindi fino a quando ci sarà un modo per associare l'un pezzo di dati (ID di categoria) all'altro (categoria slug), possiamo convertirlo? ci vorrà solo un piccolo sforzo in più. Ecco come appaiono i nostri dati nella tabella del database:


Mostrando la tabella wp_terms? mostra solo la relazione tra id di categoria (term_id) e slug (mostrato).
Un esempio dei dati sulla tabella attuale.

Modificare: Stiamo per saltare in $ wpdb proprio qui, ma come alcuni commentatori hanno sottolineato, ci sono scorciatoie intorno a questo? e quando dico scorciatoie, voglio dire, ci sono modi più brevi per afferrare un singolo ID di categoria. Per quello che faremo alla fine, quei modi sono in realtà modi un po 'più lunghi per farlo? ma come ho detto sopra, si tratta di imparare alcuni modi di fare le cose? quindi mostrerò entrambi (più un metodo bonus) alla fine!


Presentazione di $ wpdb->

Interfacciare con il Database è una delle sezioni più oscure del codice WordPress, ma include solo le informazioni di cui avremo bisogno per fare la nostra conversione (e imparare un nuovo trucco stravagante che possiamo usare in molte situazioni diverse) . Ecco le basi:

Puoi usare l'oggetto $ wpdb "parlare" con qualsiasi tabella sul database di WordPress. Se hai mai avuto problemi con MySQL, riconoscerai alcune di queste operazioni, poiché tutto questo è stato fatto usando una versione della classe ezSQL. Ad esempio, il domanda funzione consente di eseguire qualsiasi query SQL sul database di WordPress.

 query ( 'query'); ?> // Dove 'query' rappresenta la query SQL che si desidera eseguire

Puoi leggere ulteriori informazioni su $ wpdb-> query nella pagina del codice? Oggi, saremo leggermente più raffinati e useremo quanto segue:

 get_var ( 'query', column_offset, row_offset); ?>

Dal codice: Il get_var la funzione restituisce una singola variabile dal database. Anche se viene restituita una sola variabile, l'intero risultato della query viene memorizzato nella cache per un uso successivo?

Perfezionare! Ciò significa che possiamo essenzialmente afferrare QUALSIASI parte del database di WordPress finché sappiamo dove trovarlo? e sappiamo solo dove trovare il nostro ID di categoria perché conosciamo già la Categoria Slug. Seguimi ancora?


Estrazione di un ID di categoria singola da una singola categoria Slug

Ecco dove diventa caldo e pesante. Usando il nostro esempio in cui conosciamo la categoria slug, possiamo estrarre l'ID in questo modo:

 $ cats = get_post_custom_values ​​('category_filter'); // Restituisce una matrice di cat-slug dal campo personalizzato. $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> termini WHERE slug =" $ cat ""); // Cattura l'ID della categoria dal WPDB usando la categoria slug ($ cat).

Ciò restituirà un ID di categoria singola (term_id come è noto nel DB) e memorizzarlo nel nostro $ catid variabile. In alcune situazioni, potremmo essere fatti? potresti semplice eco il $ catid ovunque tu volessi. Nel nostro esempio, abbiamo ancora del lavoro da fare.

Per essere chiari, l'iniziale $ gatti la variabile sta acquisendo gli slug di categoria dal nostro campo personalizzato? potresti inserire le lumache usando anche altri metodi? ma hai bisogno di un modo per afferrare le lumache (o qualche pezzo di dati che si associa al nostro ID).


Acquisizione di più ID di categoria da Slug di categorie multiple

Estendiamo il nostro piccolo frammento ora consentendo più di una categoria usando un rapido per ciascuno ciclo continuo:

 $ cats = get_post_custom_values ​​('category_filter'); // Restituisce una matrice di cat-slug dal campo personalizzato. foreach ($ cats as $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> termini WHERE slug =" $ cat ""); // Cattura il cat-id dal DB usando la categoria slug ($ cat). $ acats [] = $ catid; // Trasforma l'elenco degli ID in un ARRAY, $ acats []

Quest'ultimo pezzo di codice ($ acats?) Usa un semplice PHP per trasformare ogni ID di categoria che troviamo in una parte di un array? che potrebbe esserti utile. Ma andiamo ancora un altro passo e converti l'array in una stringa (perché la maggior parte delle funzioni in WordPress usano stringhe).


Conversione della matrice in una stringa separata da virgola usando Join ();

Ci stiamo avvicinando ora! Usiamo un po 'più semplice PHP per convertire la matrice di ID di categoria che abbiamo creato in una stringa che possiamo usare in query_posts.

 $ cats = get_post_custom_values ​​('category_filter'); // Restituisce una matrice di cat-slug dal campo personalizzato. foreach ($ cats as $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> termini WHERE slug =" $ cat ""); // Cattura il cat-id dal DB usando la categoria slug ($ cat). $ acats [] = $ catid; // Trasforma l'elenco degli ID in un ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Unisciti all'ARRAY in una STRING separata da virgola per l'utilizzo in query_posts // echo $ cat_string; // Rimuovi commenti all'output di test

Notare l'ultima riga in cui è possibile rimuovere il "//" per testare l'output a questo punto, che dovrebbe essere una serie di numeri (gli ID di categoria) come questo: 11, 123, 198, 210?

Puoi leggere come funziona la funzione PHP 'join' qui, ma tutto quello che devi sapere è che abbiamo trasformato il nostro array di ID di categoria in una stringa, con ogni ID separato da una virgola? Questo è utile, perché è esattamente ciò di cui abbiamo bisogno per il nostro passo finale?


Mettendo tutto insieme a Query_Posts ();

Facciamo una revisione prima della grande rivelazione. Abbiamo preso un valore noto (i nostri slug di categoria), li abbiamo trasformati in ID di categoria chiedendo al database, quindi abbiamo unito i nostri ID di categoria in una stringa che possiamo usare in query_posts ();. Tutto bene? Ok, ecco come sono fatti tutti:

 $ cats = get_post_custom_values ​​('category_filter'); // Restituisce una matrice di cat-slug dal campo personalizzato. foreach ($ cats as $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> termini WHERE slug =" $ cat ""); // Cattura il cat-id dal DB usando la categoria slug ($ cat). $ acats [] = $ catid; // Trasforma l'elenco degli ID in un ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Unisciti all'ARRAY in una STRING separata da virgola per l'utilizzo in query_posts // echo $ cat_string; // Rimuovi commenti all'output di test $ args = array ('cat' => $ cat_string, // Query per gli ID cat (perché non puoi usare più nomi o slug? Pazzo WP!)); query_posts ($ args);

Non male vero? Siamo pronti per l'azione - Ora possiamo usarlo nella versione base Se / Mentre post loop per distribuire post che sono solo nel particolare ID categorias che l'utente ha selezionato nelle caselle di controllo (ricorda l'immagine della casella di controllo in alto?).


Lo snippet completo

Bene, la grande rivelazione! Abbiamo solo bisogno di aggiungere alcune misure di sicurezza aggiuntive per assicurarci che possiamo usare / riutilizzare questo frammento di codice. Dobbiamo garantire che il campo personalizzato "category_filter"esiste (c'è sempre la possibilità che l'utente non selezioni nessuna categoria) Se non esiste, non ha senso girare intorno alle cerchie, quindi useremo un semplice if / then wrapper per eseguire solo il nostro snippet quando esiste il campo personalizzato:

 get_var ("SELECT term_id FROM $ wpdb-> termini WHERE slug =" $ cat ""); // Cattura il cat-id dal DB usando la categoria slug ($ cat). $ acats [] = $ catid; // Trasforma l'elenco degli ID in un ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Unisciti all'ARRAY in una STRING separata da virgola per l'utilizzo in query_posts // echo $ cat_string; // Rimuovi commenti a Test Output endif; // fine della situazione? continuare come al solito se non ci fosse nessun filtro di categoria. ?> $ cat_string, // Query per l'ID del gatto (perché non puoi usare più nomi o lumache? pazzo WP!)); query_posts ($ args); ?>

Questo snippet presuppone che tu abbia un campo personalizzato chiamato "category_filter"assegnato al tuo post? ma puoi codificare in Franken-codice questo snippet per fare praticamente tutto quello che vuoi. Ok, forse non ti farà diventare un sammic? ma è comunque un frammento abbastanza carino.


Un esempio pratico


Vedi quelle immagini? Ognuno è un post del blog che è stato afferrato dal nostro custom query_posts (); impostare? Vedi, le lumache di categoria non sono completamente inutili dopo tutto! Guarda l'esempio completo.

Ad esempio, ho utilizzato questo snippet per creare la base per un modello di pagina del portfolio filtrabile personalizzato nel mio ultimo tema SuperSkeleton WordPress. Il "modello di pagina portfolio" include l'elenco delle caselle di controllo delle categorie, che consente all'utente di selezionare le categorie di post sul portfolio che desidera visualizzare nella pagina. Il flusso di lavoro è lo stesso, sto solo aggiungendo alcuni colpi di scena aggiuntivi dopo aver usato query_posts ();.

  1. Slug di categoria?
  2. Convertito in ID di categoria?
  3. Utilizzato in Query_Posts?
  4. Profitto!!! Modello di pagina del portafoglio filtrabile

Puoi usare questo per un sacco di cose diverse però? in effetti, quasi tutti i casi in cui è necessario creare un modello di pagina che richieda una determinata categoria può metterlo in pratica.


Perché usare $ wpdb?

Due ragioni. Principalmente, non ho potuto ottenere le tecniche preferite di get_category_by_slug e get_term_by lavorare nel mio caso perché semplicemente non stavano restituendo ciò di cui avevo bisogno per prendere un sacco di questa roba (hanno funzionato bene per l'acquisizione di singole categorie quando conoscevo la categoria slug? ma cosa succede se non volevo codificare il codice slug?).

La seconda ragione è educativa? questo piccolo tortuoso esercizio di risoluzione dei problemi mi dà l'opportunità di scrivere qualcosa su $ wpdb, che è una tecnica sottovalutata quando si tenta di manipolare ed estrarre informazioni molto specifiche dal database. Francamente, poiché è possibile eseguire query SQL dirette che lo utilizzano, è difficile trovare qualcosa che non può fare.

Oh, e la miniatura di questo post è Will Smith che canta una canzone rap? Spero che non ti aspetti niente di troppo ufficiale: P Questo è un bel divertimento pulito e nessuno sta dicendo che questo è l'unico modo per afferrare ciò che abbiamo fatto? infatti, ecco alcune altre idee:


Metodi alternativi senza $ wpdb

Utilizzando Get_Category_By_Slug ();

Grazie ad Andrew per averlo fatto, puoi anche usare una funzione più specifica per convertire una Slug di categoria in un ID usando get_category_by_slug ();. Controlla la pagina del codice per questo, e puoi vedere come sarà il nostro codice qui sotto:

Versione semplice:

 term_id; ?>

La nostra versione (che è ancora lunga, ma puoi vedere dove stiamo usando get_category_by_slug (); invece del $ Wpdb-> come strumento per la raccolta dei dati:

 term_id; $ acats [] = $ id; // Trasforma l'elenco degli ID in un ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Unisciti all'ARRAY in una STRING separata da virgola per l'utilizzo in query_posts // echo $ cat_string; // Rimuovi commenti a Test Output endif; // fine della situazione? continuare come al solito se non ci fosse nessun filtro di categoria. ?> $ cat_string, // Query per l'ID del gatto (perché non puoi usare più nomi o lumache? pazzo WP!)); query_posts ($ args); ?>

Un altro metodo che utilizza Get_Term_By ();

Infine, come ha detto Thomas nei commenti, è molto simile a "un equivalente di programmazione che va da Rochester, NY a Boston tramite Wheeling WV"? È possibile utilizzare la seguente pagina del codice per ulteriori dettagli su questo metodo. C'è anche una funzione incorporata per costruire il nostro array, che ci aiuta a saltare un passaggio in questo caso:

 $ myCategory = get_term_by ('id', $ postCategories [0] -> cat_ID, 'categoria');

Potremmo semplicemente passare nel nostro slug e essere sulla nostra strada allegra;)


Avvolgendolo

Sì, questo era un esempio molto specifico con alcune ipotesi molto specifiche in testa? ma, se stai ancora seguendo a questo punto, dovresti aver imparato con successo una o due cose su quanto segue:

  • Come usare $ wpdb per eseguire query SQL sul database di WordPress (afferrando l'ID della categoria da una lumaca di categoria nel nostro esempio, ma si può fare molto più di questo)
  • Come eseguire un ciclo foreach in un elenco di categorie e memorizzarle in un array
  • Convertire un array di ID di categoria in una stringa separata da virgola da utilizzare in query_posts ();

Nota di Heckler: Sì, se iniziassimo con gli ID di categoria in primo luogo, non avremmo mai bisogno di preoccuparci di questo processo a lungo termine? ma poi, non sarebbe un tutorial molto educativo, ora sarebbe? ; P Solo il tempo (ei tuoi commenti) dirà se questo è effettivamente il migliore un modo per avvicinarsi a questo, ma si spera che tu sappia solo un po 'di più su WordPress ora! Grazie per aver letto!