Gettin 'Jiggy wit' în baza de date WP Convertirea categoriilor Slugs către ID-uri ($ wpdb)

"Out of the box" tip de extragere de date pe care o puteți face cu Wordpress este minunat? într-adevăr, este. Până nu este. Vedeți, există de fapt câteva scenarii acolo unde aveți nevoie de mai mult decât o simplă funcție sau o etichetă pentru a apuca datele pe care le doriți și a le converti la ceva care este de fapt util. Cuplați centurile de siguranță, suntem pe cale să sari de pe șine pentru câteva minute?


Interfața cu baza de date pentru distracție și Profit ID-uri de categorii

Astăzi am de gând să împărtășesc un fragment de cod mic cu tine pe care l-am găsit incredibil de util în ultimele câteva luni? dar înainte de a citi mai departe, știți că este

  • ? mergi să pătrunzi în unele chestii de bază de date (care pot deveni păroase dacă ești un nou dezvoltator WP)
  • ? O să folosesc a într-adevăr exemplu specific pentru a învăța lecții mult mai mari.

De fapt, exemplul în sine este lipsit de sens? acest lucru este vorba despre tehnicile pe care le vom folosi pentru a rezolva problema ipotetică. Până la sfârșitul acestui lucru veți afla că nu există practic nici o limită a ceea ce puteți face cu orice informație care este salvată în baza de date WordPress.

Oh, și pentru că ăsta e chestii de la domiciliu, presupun că cineva de acolo va avea un alt mod de a face asta. Distribuiți-vă, răsfoiți, deschideți-o în secțiunea de comentarii: P Sunt urechi!

Premisele noastre: Avem o listă cu gloanțe de categorie (salvate dintr-o casetă meta personalizată dintr-o pagină).

Problema noastră: Nu puteți utiliza categoriile de cozi în query_posts () ;, dar dacă singura informație pe care o avem este "slug", trebuie să găsim o modalitate de ao transforma într-un lucru pe care îl putem folosi: ID-uri de categorii. Există câteva modalități de a converti melci la ID-uri (get_category_by_slug, get_term_by, etc.), dar nu sunt la fel de flexibile sau de puternice ca metoda pe care o voi arăta. Vor lucra totuși? Da, acestea vor funcționa bine și le vom discuta la sfârșit. Așa cum am spus, plecăm de aici câteva minute aici? bucurați-vă de plimbare :)

Scopul nostru: pentru a converti o bucată de date de categorie în alta prin solicitarea unei baze de date pentru aceasta, combinarea acesteia cu alte piese similare pentru a face o matrice, apoi transformarea matricei într-un șir pe care îl putem folosi de fapt în alte locuri din tema sau pluginul nostru.


Problema ipotetică: Cum să luați ID-ul categoriei dintr-o categorie Slug


Problema noastră ipotetică include o meta-casetă personalizată care returnează numai categoriile Slugs. Problema noastră este că avem nevoie de ele să fie convertite în ID-uri înainte de a le putea folosi în query_posts ();.

Imaginează-le: Aveți un câmp particularizat atribuit unui șablon de pagină numit "category_filter"Ceea ce face este să apucă o listă de categorii pe care utilizatorul le-a selectat dintr-o casetă de metode personalizate și le returnează Categorie-melcii. Grozav? melcii. Ce vom face cu ei?

Din versiunea actuală WordPress, nu există nici un mod rapid și ușor (cel puțin că aș putea găsi) care să vă permită să transformați pur și simplu categorii-slugs în categorii-ID-uri. Ceea ce, sincer, e de rahat, pentru că genul ăsta de tip "conversie de tip monetar" este remarcabil de ușor dacă încercăm să facem același lucru cu datele postului (adică: transformarea unui nume într-un ghiveci, ID-ul într-un nume).

În cazul posturilor, tot ce trebuie să faceți este să faceți foc query_posts sau get_posts și devine destul de ușor să luați orice aveți nevoie. Nu atât de mult în cazul categoriilor? dar ca orice în WordPress, unde există voință, există o cale.

Știm că datele există în baza noastră de date WordPress; Atât timp cât există o modalitate de a asocia o singură piesă de date (ID de categorie) cu cealaltă (categoria slug), o putem converti? va face doar un efort suplimentar. Iată cum arată datele noastre în tabela de baze de date:


Se afișează tabelul wp_terms? arătând doar relația dintre categoria-id (termen_id) și slug (prezentat).
Un exemplu de date despre tabelul real.

Editați | ×: Suntem pe cale să sarăm în $ wpdb chiar aici, dar, așa cum au subliniat câțiva comentatori, există comenzi rapide în jurul acestui lucru? și când spun comenzi rapide, vreau să spun că există modalități mai scurte de a obține o singură identitate a categoriei. Pentru ceea ce vom face în cele din urmă, acele căi sunt de fapt modalități mai lungi de a face acest lucru? dar, așa cum am menționat mai sus, este vorba despre învățarea câtorva modalități de a face lucrurile? așa că am să arăt amândouă (plus o metodă de bonus) la sfârșit!


Introducerea $ wpdb->

Interfața cu baza de date este una dintre cele mai obscure secțiuni ale codului WordPress, dar include doar informațiile pe care le vom avea nevoie pentru a face conversia noastră (și pentru a afla un nou truc fantezist pe care îl putem folosi în multe situații diferite) . Iată elementele de bază:

Puteți utiliza obiectul $ wpdb pentru a "vorbi" cu orice tabel din baza de date WordPress. Dacă v-ați gândit vreodată cu MySQL, veți recunoaște cum se face acest lucru, deoarece totul se face folosind o versiune a clasei ezSQL. De exemplu, întrebare vă permite să executați orice interogare SQL din baza de date WordPress.

 interogare ( 'query'); ?> În cazul în care "interogare" reprezintă interogarea SQL pe care doriți să o executați

Puteți citi mai multe despre interogarea $ wpdb-> în pagina codex? Astăzi, vom fi puțin mai rafinate și vom folosi următoarele:

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

Din codul: get_var funcția returnează o singură variabilă din baza de date. Deși numai o variabilă este returnată, întregul rezultat al interogării este stocat în cache pentru o utilizare ulterioară?

Perfect! Ce înseamnă acest lucru este faptul că putem să luăm în esență orice în interiorul bazei de date WordPress atâta timp cât știm unde să-l găsim? și se întâmplă să știm unde să găsim ID-ul categoriei noastre deoarece știm deja categoria Slug. Urmați-mă încă?


Extragerea unui singur ID de categorie dintr-o singură categorie Slug

Iată în cazul în care devine fierbinte și grele. Folosind exemplul nostru în cazul în care știm categoria slug, putem extrage ID-ul astfel:

 $ cats = get_post_custom_values ​​('categoria_filter'); // Returnează un șir de pisici din câmpul personalizat. $ catid = $ wpdb-> get_var ("SELECT termen_id FROM $ wpdb-> termeni WHERE slug =" $ cat ""); / / Luați categoria-id din WPDB folosind categoria slug ($ cat).

Aceasta va reveni la un singur ID de categorie (term_id așa cum este cunoscut în DB) și să o păstrăm în noi $ CatID variabil. În unele situații, am putea fi terminat? ai putea simplu ecou $ CatID oriunde vroiai. În exemplul nostru, totuși, avem încă ceva de făcut.

Pentru a fi clar, inițial $ pisici variabilă este grabbing categoria slugs din domeniul nostru personalizat? ai putea să introduci și melcii folosind și alte metode? dar aveți nevoie de o modalitate de a apuca gloanțele (sau o parte din datele care se asociază cu ID-ul nostru).


Câștigarea mai multor coduri de categorii din mai multe categorii de slugi

Să ne extindem acum fragmentul mic, permițând utilizarea mai multor categorii folosind o secțiune rapidă pentru fiecare buclă:

 $ cats = get_post_custom_values ​​('categoria_filter'); // Returnează un șir de pisici din câmpul personalizat. foreach ($ cats ca $ cat) $ catid = $ wpdb-> get_var ("SELECT termen_id FROM $ wpdb-> termeni WHERE slug =" $ cat ""); / / Luați pisica-id din DB folosind categoria slug ($ cat). $ acats [] = $ catid; // Transformați lista ID-urilor într-un ARRAY, $ acats []

Această ultimă bucată de cod ($ acats?) Utilizează câteva PHP simple pentru a transforma fiecare ID de categorie pe care o găsim în parte dintr-o matrice? care ar putea fi folositoare pentru dvs. Dar să mergem Inca unul pas și converti matricea într-un șir (deoarece majoritatea funcțiilor din WordPress utilizează șiruri de caractere).


Convertirea matricei într-o șir separată prin șir folosind comanda Join ();

Ne apropiem acum! Să folosim PHP un pic mai simplu pentru a converti matricea ID-urilor de categorii pe care le-am creat într-un șir pe care îl putem folosi în query_posts.

 $ cats = get_post_custom_values ​​('categoria_filter'); // Returnează un șir de pisici din câmpul personalizat. foreach ($ cats ca $ cat) $ catid = $ wpdb-> get_var ("SELECT termen_id FROM $ wpdb-> termeni WHERE slug =" $ cat ""); / / Luați pisica-id din DB folosind categoria slug ($ cat). $ acats [] = $ catid; // Transformați lista ID-urilor într-un ARRAY, $ acats [] $ cat_string = se alăture (',', $ acats); // Alăturați-vă la ARRAY într-un STRING separat prin virgulă pentru a fi utilizat în query_posts // echo $ cat_string; // Eliminați comentariile la ieșirea de testare

Observați ultima linie în care puteți șterge "//" pentru a testa ieșirea în acest moment, care ar trebui să fie o serie de numere (ID-urile categoriei), cum ar fi: 11, 123, 198, 210?

Puteți citi despre modul în care funcționează funcția PHP "join", dar tot ce trebuie să știți este că tocmai am transformat seria de ID-uri de categorii într-un șir, fiecare identificator fiind separat de o virgulă? Acest lucru este util, pentru că asta este exact ceea ce avem nevoie pentru ultimul nostru pas?


Punerea împreună cu Query_Posts ();

Să examinăm înainte de revelarea mare. Am luat o valoare cunoscută (categoriile noastre de bani), le-am transformat în ID-uri de categorii solicitând baza de date, apoi s-au alăturat ID-urilor noastre de categorii într-un șir pe care îl putem folosi query_posts ();. Toate bune? Ok, iată cum arată toate acestea:

 $ cats = get_post_custom_values ​​('categoria_filter'); // Returnează un șir de pisici din câmpul personalizat. foreach ($ cats ca $ cat) $ catid = $ wpdb-> get_var ("SELECT termen_id FROM $ wpdb-> termeni WHERE slug =" $ cat ""); / / Luați pisica-id din DB folosind categoria slug ($ cat). $ acats [] = $ catid; // Transformați lista ID-urilor într-un ARRAY, $ acats [] $ cat_string = se alăture (',', $ acats); // Alăturați-vă la ARRAY într-un STRING separat prin virgulă pentru a fi utilizat în query_posts // echo $ cat_string; // Eliminarea comentariilor la rezultatele testelor $ args = array ('cat' => $ cat_string, // Cerere pentru ID-urile pisicilor (pentru că nu puteți folosi mai multe nume sau sunete? WP nebun!)); query_posts ($ args);

Nu-i rău? Suntem pregătiți de acțiune - Acum putem folosi acest lucru în cele de bază Dacă / În timp ce post bucla pentru a antena posturi care sunt numai în particular ID-ul categorieiuri pe care utilizatorul le-a selectat în casetele de selectare (amintiți-vă imaginea căsuței din partea de sus?).


Fragmentul complet

Bine, marele dezvălui! Trebuie doar să adăugăm câteva garanții suplimentare pentru a ne asigura că putem folosi / reutiliza acest fragment. Trebuie să ne asigurăm că domeniul personalizat, "category_filter"există (există întotdeauna șansa ca utilizatorul să nu selecteze deloc nicio categorie) .Dacă nu există, nu are sens să rulați în cercuri ?, deci vom folosi un simplu if / apoi wrapper pentru a rula doar fragmentul nostru când există câmpul personalizat:

 get_var ("SELECT termen_id FROM $ wpdb-> termeni WHERE slug =" $ cat ""); / / Luați pisica-id din DB folosind categoria slug ($ cat). $ acats [] = $ catid; // Transformați lista ID-urilor într-un ARRAY, $ acats [] $ cat_string = se alăture (',', $ acats); // Alăturați-vă la ARRAY într-un STRING separat prin virgulă pentru a fi utilizat în query_posts // echo $ cat_string; // Eliminarea comentariilor la testul de ieșire endif; // Încheiați situația? continuați ca de obicei dacă nu exista filtru de categorie. ?> $ cat_string, // Interogare pentru ID-ul pisicilor (pentru că nu puteți folosi mai multe nume sau sunete? WP nebun!)); query_posts ($ args); ?>

Acest fragment presupune că aveți un câmp personalizat numit "category_filter"alocat postării dvs., dar puteți să codificați acest fragment de Franken pentru a face cât de mult doriți, poate că nu vă va face un sammich, dar este încă un fragment frumos.


Un exemplu practic


Vedeți acele imagini? Fiecare dintre ele este o postare pe blog care a fost preluată de la propriile query_posts (); înființat? Vedeți, categoriile de mușchi nu sunt complet inutili la urma urmei! Vedeți exemplul complet.

De exemplu, am folosit acest fragment pentru a forma baza pentru un șablon de pagină de portofoliu personalizabil filtrat în ultima mea temă SuperSkeleton WordPress. "Șablonul de pagină de portofoliu" include lista de casete de selectare a categoriei, care permite utilizatorului să selecteze categoriile de posturi din portofoliu pe care dorește să le afișeze pe pagină. Fluxul de lucru este același, adăugând câteva răsturnări suplimentare după ce am folosit query_posts ();.

  1. Categorie Slugs?
  2. Conversia la ID-uri de categorii?
  3. Utilizat în Query_Posts?
  4. Profit!!! Filtrabilă pagină de șablon pentru portofoliu

Puteți folosi acest lucru pentru multe lucruri diferite? de fapt, aproape orice caz în care trebuie să creați un șablon de pagină, care poate solicita utilizarea unei anumite categorii.


De ce folosiți $ wpdb?

Două motive. În primul rând, nu am putut obține tehnicile preferate de get_category_by_slug și get_term_by pentru a lucra în cazul meu pentru că ei pur și simplu nu au fost întoarcerea ceea ce am nevoie pentru a lua o mulțime de lucruri (au lucrat bine pentru grabbing categorii unice, atunci când am știut categoria slug, dar dacă nu am vrut să codifica greu melc?).

Al doilea motiv este educativ? acest exercițiu mic de rezolvare a problemelor mă oferă o oportunitate de a scrie ceva despre $ wpdb, care este o tehnică foarte subevaluată atunci când încerci să manipulezi și să extragi informații foarte specifice din baza de date. Sincer, din cauza faptului că puteți rula interogări directe SQL utilizând, este greu să găsiți ceva ce nu poate face.

Oh, și miniatură pentru acest post este Will Smith cântând un cântec rap? Sper că nu v-ați aștepta la ceva prea oficial: P Este o distracție bună și nimeni nu spune că acesta este singurul mod de a prinde ceea ce am făcut? de fapt, iată câteva alte idei:


Metode alternative fără $ wpdb

Utilizând Get_Category_By_Slug ();

Vă mulțumim lui Andrew pentru că ați putut să folosiți o funcție mai specifică pentru a transforma o Categorie de Slug într-o identitate folosind get_category_by_slug ();. Consultați pagina codex pentru aceasta și puteți vedea cum va arăta codul nostru de mai jos:

Versiune simplă:

 term_id; ?>

Versiunea noastră (care este încă lungă, dar puteți vedea unde folosim get_category_by_slug (); in loc de $ Wpdb-> ca instrument de colectare a datelor:

 term_id; $ acaturi [] = $ id; // Transformați lista ID-urilor într-un ARRAY, $ acats [] $ cat_string = se alăture (',', $ acats); // Alăturați-vă la ARRAY într-un STRING separat prin virgulă pentru a fi utilizat în query_posts // echo $ cat_string; // Eliminarea comentariilor la testul de ieșire endif; // Încheiați situația? continuați ca de obicei dacă nu exista filtru de categorie. ?> $ cat_string, // Interogare pentru ID-ul pisicilor (pentru că nu puteți folosi mai multe nume sau sunete? WP nebun!)); query_posts ($ args); ?>

O altă metodă folosind Get_Term_By ();

În cele din urmă, așa cum Thomas a pus-o în mod expres în comentariile, aceasta este mult asemănătoare cu "programarea echivalentă a plecării de la Rochester, NY la Boston via Wheeling WV"? Puteți utiliza următoarea pagină de cod pentru mai multe detalii despre această metodă. Există chiar și o funcție construită pentru a construi matricea noastră, ceea ce ne ajută să ignorăm un pas în acest caz:

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

Am putea pur și simplu să trecem în slugul nostru și să fim pe calea noastră veselă;)


Înfășurați-o

Da, acesta a fost un exemplu foarte specific, cu unele ipoteze foarte specifice în față? dar, dacă încă mai urmăriți în acest moment, ar fi trebuit să învățați cu succes un lucru sau două despre următoarele:

  • Cum se utilizează $ wpdb pentru a executa interogări SQL în baza de date WordPress (apucând ID-ul categoriei dintr-o categorie de slug în exemplul nostru, dar puteți face mult mai mult decât acest lucru)
  • Cum să executați o buclă de foreach pe o listă de categorii și să le stocați într-o matrice
  • Conversia unui șir de coduri ID la un șir separat prin virgulă pentru a fi utilizat în query_posts ();

Nota lui Heckler: Da, dacă am începe cu codurile de categorii, în primul rând, nu trebuia să ne mai deranjăm niciodată cu acest proces lung de timp? dar atunci, nu ar fi un tutorial foarte educativ, acum? ; P Numai timpul (și comentariile dvs.) vor spune dacă acesta este de fapt Cel mai bun mod de a aborda acest lucru, dar sperăm că știi doar puțin mai mult despre WordPress acum! Vă mulțumim pentru lectură!

Cod