Gettin 'Jiggy wit' WP-databasen Konvertere Kategori Slugs til ID ($ wpdb)

Den "ut av boksen" type data utvinning som du kan gjøre med Wordpress er kjempebra? virkelig, det er det. Inntil det ikke er det. Du ser, det er faktisk ganske mange scenarier der ute der du trenger mer enn en enkel funksjon eller tag for å ta tak i dataene du vil ha og konvertere den til noe som egentlig er nyttig. Spenn sikkerhetsbelter, vi skal hoppe av sporene i noen minutter?


Interfacing med databasen for moro og Profitt Kategori ID-er

I dag skal jeg dele en liten kodebit med deg som jeg har funnet utrolig nyttig de siste månedene? men før du leser videre, vet at det er

  • ? kommer til å dykke inn i noen database ting (som kan bli hårete hvis du er en helt ny WP utvikler)
  • ? Jeg skal bruke en egentlig spesifikt eksempel for å undervise noen mye større leksjoner.

Faktisk er selve eksemplet meningsløst? Dette handler om teknikker vi skal bruke for å løse det hypotetiske problemet. Ved slutten av dette lærer du at det er nesten ingen grense for hva du kan gjøre med omtrent alle opplysninger som er lagret i WordPress-databasen.

Oh, og fordi dette er homebrew ting, gjetter jeg at noen der ute kommer til å ha en annen måte å gjøre dette på. Del, rant, vent ut det i kommentarfeltet: P Jeg er alle ører!

Vår antagelse: Vi har en liste over kategori snegler (lagret fra en tilpasset meta-boks på en side).

Vårt problem: Du kan ikke bruke kategori snegler i query_posts () ;, men hvis den eneste informasjonen vi har er slug, må vi finne en måte å gjøre det til noe vi faktisk kan bruke: kategori-IDer. Det er noen måter å konvertere slugger til ID-er (get_category_by_slug, get_term_by, etc.), men de er ikke like fleksible eller kraftige som metoden jeg skal vise deg. Vil de jobbe skjønt? Ja, de vil fungere bra, og vi diskuterer dem på slutten. Som jeg sa, går vi av sporene i noen minutter her? Nyt turen :)

Vårt mål: å konvertere en del av kategoridataene til en annen ved å spørre databasen pent for den, kombinere den med andre lignende brikker for å lage en matrise, og slå så den inn i en streng som vi faktisk kan bruke på andre steder i vårt tema eller plugin.


Det hypotetiske problemet: Hvordan gripe kategori-ID-en fra en kategori slug


Vårt hypotetiske problem inkluderer en tilpasset meta-boks som bare returnerer kategori snegler. Vårt problem er at vi trenger dem konvertert til ID før vi kan bruke dem i query_posts ();.

Se for deg dette: Du har et egendefinert felt tilordnet en sidemal som heter "category_filter". Hva er det, tar en liste over kategorier som brukeren har valgt fra en tilpasset meta-boks, og returnerer deres kategori-slugs. Flott? snegler. Hva skal vi gjøre med dem?

Som i den nåværende WordPress-versjonen, er det ingen rask og enkel måte (minst det jeg kunne finne) som gjør at du enkelt kan konvertere kategori-slugger til kategori-ids. Som sant, sårer sånn fordi denne typen "valutaomregning" -typer er utrolig enkelt hvis vi prøver å gjøre det samme med postdata (dvs.: slå et navn til en slug, en slug til en ID eller en ID til et navn).

I tilfelle av innlegg, alt du trenger å gjøre er å slå opp query_posts eller get_posts og det blir ganske enkelt å ta tak i alt du trenger. Ikke så mye i tilfelle av kategorier? men som noe i WordPress, hvor det er en vilje, er det en måte.

Vi vet at dataene finnes i vår WordPress-database; Så så lenge det er noen måte for oss å knytte det ene datafeltet (kategori ID) til det andre (kategori slug), kan vi konvertere det? det vil bare ta litt ekstra innsats. Slik ser dataene våre ut i databasetabellen:


Viser wp_terms tabellen? bare viser forholdet mellom kategori-id (term_id) og slug (vist).
Et eksempel på dataene på selve tabellen.

Redigere: Vi er i ferd med å hoppe inn i $ wpdb her, men som noen kommentatorer har påpekt, er det snarveier rundt dette? og når jeg sier snarveier, mener jeg at det er kortere måter å ta tak i en enkelt kategori ID. For hva vi skal gjøre i siste omgang, er disse måtene faktisk litt lengre måter å gjøre dette på? men som nevnt ovenfor handler det om å lære noen måter å gjøre ting på? så jeg vil vise begge (pluss en bonusmetode) på slutten!


Vi presenterer $ wpdb->

Interfacing med databasen er en av de mer uklare delene av WordPress-kodeksen, men den inneholder bare informasjonen vi trenger for å gjøre konverteringen vår (og lære et fancy nytt triks som vi kan bruke i mange forskjellige situasjoner) . Her er det grunnleggende:

Du kan bruke objektet $ wpdb å "snakke" til et hvilket som helst bord på WordPress-databasen. Hvis du noen gang har tinkered med MySQL i det hele tatt, vil du gjenkjenne noen av hvordan dette er gjort, siden dette er gjort med en versjon av ezSQL-klassen. For eksempel, spørsmål funksjonen lar deg utføre noen SQL-spørringer på WordPress-databasen.

 spørring ( 'spørring'); ?> // Hvor spørring representerer SQL-spørringen du vil utføre

Du kan lese mer om $ wpdb-> spørring på kodeksiden? I dag skal vi være litt mer raffinert og bruke følgende:

 get_var ( 'spørring', column_offset, row_offset); ?>

Fra kodeksen: De get_var funksjon returnerer en enkelt variabel fra databasen. Selv om bare én variabel returneres, blir hele resultatet av spørringen cachet for senere bruk?

Perfekt! Hva dette betyr er at vi i utgangspunktet kan gripe noe inne i WordPress-databasen så lenge vi vet hvor du skal finne den? og vi kommer bare til å vite hvor du finner vår kategoridokument fordi vi allerede kjenner kategorislipen. Følger meg fortsatt?


Utvinning av en enkelt kategori-ID fra en enkelt kategori slug

Her er hvor det blir varmt og tungt. Ved hjelp av vårt eksempel hvor vi kjenner kategorislibben, kan vi trekke ut IDen slik:

 $ cats = get_post_custom_values ​​('category_filter'); // Returnerer en rekke kattemaler fra det tilpassede feltet. $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> vilkår WHERE slug =" $ cat ""); // Grab kategori-id fra WPDB ved hjelp av kategorien slug ($ cat).

Dette vil returnere en enkelt kategori ID (term_id som det er kjent i DB) og lagre det i vår $ KatID variabel. I noen situasjoner kan vi bli gjort? du kan enkelt ekko de $ KatID uansett hvor du ønsket. I vårt eksempel har vi fortsatt noe arbeid å gjøre.

For å være klar, den første $ katter variabel er å gripe kategorien snegler fra vårt tilpassede felt? kan du sette inn sneglene ved hjelp av andre metoder også? men du trenger en måte å ta tak i sneglene (eller noe data som forbinder med vår ID).


Griper flere kategorid IDer fra flere kategori slugger

La oss utvide vår lille utdrag nå ved å tillate mer enn én kategori ved hjelp av en rask for hver løkke:

 $ cats = get_post_custom_values ​​('category_filter'); // Returnerer en rekke kattemaler fra det tilpassede feltet. foreach ($ katter som $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> vilkår WHERE slug =" $ cat ""); // Hent katt-id fra DB ved hjelp av kategorien slug ($ cat). $ acats [] = $ catid; // Vri listen over ID-er til en ARRAY, $ acats []

Denne siste koden ($ acats?) Bruker noen enkle PHP for å slå hver kategori-ID som vi finner i en del av en matrise? som kan være nyttig for deg. Men la oss gå enda en trinn og konverter arrayet til en streng (fordi de fleste funksjoner i WordPress bruker strenger).


Konvertere arrayet til en kommaseparert streng ved hjelp av Join ();

Vi kommer nærmere nå! La oss bruke litt enklere PHP for å konvertere gruppen av kategori-IDer som vi har opprettet til en streng som vi kan bruke i query_posts.

 $ cats = get_post_custom_values ​​('category_filter'); // Returnerer en rekke kattemaler fra det tilpassede feltet. foreach ($ katter som $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> vilkår WHERE slug =" $ cat ""); // Hent katt-id fra DB ved hjelp av kategorien slug ($ cat). $ acats [] = $ catid; // Vri listen over ID-er til en ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Bli med ARRAY i en kommaseparert STRING for bruk i query_posts // echo $ cat_string; // Fjern Kommentering til Test Output

Legg merke til den siste linjen der du kan fjerne "//" for å teste utdataene dine på dette punktet, som skal være en serie med tall (kategori-IDene) slik: 11, 123, 198, 210?

Du kan lese om hvordan PHP 'join' -funksjonen fungerer her, men alt du trenger å vite er at vi nettopp har vendt vårt utvalg av kategori ID til en streng, med hver ID separert av et komma? Dette er praktisk, fordi det er akkurat det vi trenger for vårt siste skritt?


Setter alt sammen sammen med Query_Posts ();

La oss se gjennom den store avsløringen. Vi har tatt en kjent verdi (våre kategori snegler), slått dem inn i kategori-IDer ved å spørre databasen, og ble deretter med i kategorin ID-ene til en streng som vi kan bruke i query_posts ();. Helt fint? Ok, her er det som alle ser ut som:

 $ cats = get_post_custom_values ​​('category_filter'); // Returnerer en rekke kattemaler fra det tilpassede feltet. foreach ($ katter som $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> vilkår WHERE slug =" $ cat ""); // Hent katt-id fra DB ved hjelp av kategorien slug ($ cat). $ acats [] = $ catid; // Vri listen over ID-er til en ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Bli med ARRAY i en kommaseparert STRING for bruk i query_posts // echo $ cat_string; // Fjern Kommentar til Test Output $ args = array ('cat' => $ cat_string, // Query for katt-ID-er (fordi du ikke kan bruke flere navn eller snegler? Gal WP!)); query_posts ($ args);

Ikke dårlig riktig? Vi er klare til handling - Nå kan vi bruke dette i grunnleggende Hvis / Mens innleggsløyfe for å skille ut innlegg som er bare i det spesielle kategori IDs som brukeren har valgt for i boksene (husk boksen bildet øverst?).


Komplett utdrag

Ok, det store avslører! Vi trenger bare å legge til noen ekstra sikkerhetstiltak for å sikre at vi kan bruke / gjenbruk denne koden. Vi må sørge for at det egendefinerte feltet, "category_filter"eksisterer (det er alltid sjansen for at brukeren ikke velger noen kategorier i det hele tatt.) Hvis det ikke eksisterer, er det ingen mening å løpe rundt i kretser, så vi bruker en enkel om / da-wrapper til å bare løpe vår utdrag når det egendefinerte feltet eksisterer:

 get_var ("SELECT term_id FROM $ wpdb-> vilkår WHERE slug =" $ cat ""); // Hent katt-id fra DB ved hjelp av kategorien slug ($ cat). $ acats [] = $ catid; // Vri listen over ID-er til en ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Bli med ARRAY i en kommaseparert STRING for bruk i query_posts // echo $ cat_string; // Fjern Kommentar til Test Output endif; // Slutt situasjonen? Fortsett som vanlig hvis det ikke var noe kategorifilter. ?> $ cat_string, // Query for katt-ID-er (fordi du ikke kan bruke flere navn eller snegler? gal WP!)); query_posts ($ args); ?>

Denne utdrag antar at du har et egendefinert felt kalt "category_filter"Tilordnet til innlegget ditt, men du kan Franken-kodes dette utdraget for å gjøre stort sett alt du vil. Ok, kanskje det ikke vil gjøre deg til en sammich? Men det er fortsatt et ganske greit utdrag.


Et praktisk eksempel


Se disse bildene? Hver og en er et blogginnlegg som ble tatt fra våre tilpassede query_posts (); setup? Se, kategori snegler er ikke helt ubrukelige tross alt! Se hele eksemplet.

For eksempel brukte jeg denne brikken til å danne grunnlag for en tilpasset filterbar porteføljeside-mal i mitt nyeste SuperSkeleton WordPress-tema. "Porteføljesidenmalen" inneholder listen over kategoribokser, som gjør det mulig for brukeren å velge hvilke kategorier porteføljeposter han vil vise opp på siden. Arbeidsflyten er den samme, jeg legger bare litt ekstra vendinger etter at vi bruker query_posts ();.

  1. Kategori Snegler?
  2. Konvertert til Kategori ID-er?
  3. Brukes i Query_Posts?
  4. Profitt!!! Filterbar porteføljesidemaler

Du kan bruke dette til mange forskjellige ting skjønt? Faktisk, omtrent alle tilfeller der du trenger å opprette en sidemaler som spørringer for en bestemt kategori kan sette dette til å bruke.


Hvorfor Bruk $ wpdb?

To grunner. Først og fremst kunne jeg ikke få de foretrukne teknikkene til get_category_by_slug og get_term_by å jobbe i mitt tilfelle fordi de rett og slett ikke returnerte det jeg trengte for å få tak i mange av disse tingene (de jobbet greit for å få tak i enkelte kategorier da jeg kjente kategorien slug? men hva om jeg ikke ville hardt kode slug?).

Den andre grunnen er pedagogisk? Denne lille kretsløse problemløsende øvelsen gir meg en mulighet til å skrive noe om $ wpdb, som er en svært underrated teknikk når man prøver å manipulere og trekke ut meget spesifikk informasjon fra databasen. Helt ærlig, på grunn av det faktum at du kan kjøre direkte SQL-spørringer med det, er det vanskelig å finne noe det ikke kan gjøre.

Oh, og miniatyrbildet for dette innlegget, vil Will Smith synge en rapsang? Jeg håper du ikke hadde forventet noe for offisielt: P Dette er bra, rent, morsomt, og ingen sier at dette er den eneste måten å ta tak i hva vi gjorde? Faktisk, her er noen andre ideer:


Alternativ metode uten $ wpdb

Bruke Get_Category_By_Slug ();

Takk til Andrew for å få opp det du kan også bruke en mer spesifikk funksjon for å konvertere en kategori slug til en ID ved hjelp av get_category_by_slug ();. Sjekk kodeseks siden for dette, og du kan se hvordan vår kode vil se ut nedenfor:

Enkel versjon:

 term_id; ?>

Vår versjon (som fortsatt er lang, men du kan se hvor vi bruker get_category_by_slug (); i stedet for $ Wpdb-> som vårt datainnsamlingsverktøy:

 term_id; $ acats [] = $ id; // Vri listen over ID-er til en ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Bli med ARRAY i en kommaseparert STRING for bruk i query_posts // echo $ cat_string; // Fjern Kommentar til Test Output endif; // Slutt situasjonen? Fortsett som vanlig hvis det ikke var noe kategorifilter. ?> $ cat_string, // Query for katt-ID-er (fordi du ikke kan bruke flere navn eller snegler? gal WP!)); query_posts ($ args); ?>

En mer metode ved hjelp av Get_Term_By ();

Til slutt, som Thomas ellers satte det i kommentarene, er dette mye som "programmering tilsvarende å gå fra Rochester, NY til Boston via Wheeling WV"? Du kan bruke følgende codex-side for flere detaljer om denne metoden. Det er enda en innebygd funksjon for å bygge vårt utvalg, noe som hjelper oss å hoppe over et skritt i dette tilfellet:

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

Vi kunne bare passere i vår slug og være på vår glede måte;)


Pakke det opp

Ja, dette var et veldig spesifikt eksempel med noen svært spesifikke forutsetninger foran? men hvis du fortsatt følger med på dette punktet, burde du ha lært en eller to ting om følgende:

  • Slik bruker du $ wpdb til å utføre SQL-spørringer på WordPress-databasen (ta tak i kategoridokumentet fra en kategori slug i vårt eksempel, men du kan gjøre mye mer enn dette)
  • Slik kjører du en foreach loop på en liste over kategorier og lagrer dem i en matrise
  • Konverter en rekke kategorier-IDer til en kommaseparert streng for bruk i query_posts ();

Hecklers kommentar: Ja, hvis vi startet med kategori ID-er i utgangspunktet, ville vi aldri trenger å bry oss med denne lange vikingsprosessen? men da ville det ikke være en veldig pedagogisk opplæring, nå ville det? ; P Kun tid (og dine kommentarer) vil fortelle om dette faktisk er beste måte å nærme seg dette, men forhåpentligvis vet du bare litt mer om WordPress nå! Takk for at du leste!