Gettin 'Jiggy met de WP-database Category Slugs converteren naar ID's ($ wpdb)

Het "out-of-the-box" type data-extractie dat je kunt doen met Wordpress is geweldig? echt, het is. Tot het niet is. Zie je, er zijn eigenlijk nogal wat scenario's waar je meer dan een simpele functie of tag nodig hebt om de data te pakken die je wilt en deze om te zetten in iets dat echt nuttig is. Maak je veiligheidsgordels om, we staan ​​op het punt om een ​​paar minuten van de baan te springen?


Omgaan met de database voor plezier en Winst Categorie-ID's

Vandaag ga ik een klein codefragment met je delen dat ik de afgelopen maanden ongelooflijk nuttig heb gevonden? maar voordat je verder leest, weet dat dat zo is

  • ? gaan graven in een aantal dingen in de database (die harig kunnen worden als je een gloednieuwe WP-ontwikkelaar bent)
  • ? Ik ga een gebruiken werkelijk specifiek voorbeeld om een ​​aantal veel grotere lessen te leren.

In feite is het voorbeeld zelf zinloos? dit gaat allemaal over de technieken die we zullen gebruiken om het hypothetische probleem op te lossen. Aan het einde hiervan leer je dat er vrijwel geen limiet is voor wat je kunt doen met zo ongeveer elk stukje informatie dat in de WordPress-database is opgeslagen.

Oh, en omdat dit homebrew dingen zijn, denk ik dat iemand daar een andere manier zal hebben om dit te doen. Deel, zeg het, snuffel erover in de comments: P Ik ben een en al oor!

Onze veronderstelling: We hebben een lijst met categorie-naaktslakken (opgeslagen vanuit een aangepaste metabox op een pagina).

Ons probleem: Je kunt geen categorienakels gebruiken in query_posts () ;, maar als het enige stukje informatie dat we hebben de slug is, moeten we een manier vinden om het in iets te veranderen dat we eigenlijk kunnen gebruiken: category ID's. Er zijn een paar manieren om slakken om te zetten in ID's (get_category_by_slug, get_term_by, etc.), maar ze zijn niet zo flexibel of krachtig als de methode die ik je zal laten zien. Zullen ze wel werken? Ja, die zullen goed werken en we zullen ze aan het einde bespreken. Zoals ik al zei, we gaan hier een paar minuten van de baan? geniet van de rit :)

Ons doel: om een ​​stuk categoriegegevens naar een ander te converteren door de database mooi te vragen, combineer het met andere vergelijkbare stukjes om een ​​array te maken, verander die array dan in een reeks die we ook daadwerkelijk kunnen gebruiken in andere plaatsen van ons thema of plugin.


Het hypothetische probleem: de categorie-ID uit een categorieslak halen


Ons hypothetisch probleem omvat een aangepaste metabox die alleen Category Slugs retourneert. Ons probleem is dat we ze moeten converteren naar ID's voordat we ze kunnen gebruiken in query_posts ();.

Stel je dit voor: U hebt een aangepast veld toegewezen aan een paginasjabloon met de naam "category_filterWat is betekent: pak een lijst met categorieën die de gebruiker heeft geselecteerd in een aangepaste metabox en retourneert de categorieën categorie-naaktslakken. Super goed? naaktslakken. Wat gaan we ermee doen??

Vanaf de huidige WordPress-versie is er geen snelle en eenvoudige manier (die ik tenminste zou kunnen vinden) waarmee je eenvoudig categorienlugs in categorie-ID's kunt converteren. Wat, eerlijk gezegd, nogal stom is omdat dit soort "valutaconversie" dingen opvallend eenvoudig is als we hetzelfde proberen te doen met postgegevens (dat wil zeggen: een naam veranderen in een slug, een slug in een ID, of een ID in een naam).

In het geval van berichten hoeft u alleen maar op te starten query_posts of get_posts en het wordt vrij gemakkelijk om alles te pakken wat je nodig hebt. Niet zozeer in het geval van categorieën? maar zoals alles in WordPress, waar een wil is, is er een manier.

We weten dat de gegevens bestaan ​​in onze WordPress-database; Dus zolang er een manier is om het ene stuk gegevens (categorie-ID) te associëren met het andere (categorie slug), kunnen we het omzetten? het kost maar een beetje extra inspanning. Dit is hoe onze gegevens eruit zien in de databasetabel:


De tabel wp_terms weergeven? laat alleen de relatie zien tussen de category-id (term_id) en de slug (weergegeven).
Een voorbeeld van de gegevens in de eigenlijke tabel.

Bewerk: We staan ​​op het punt om $ wpdb hier in te springen, maar zoals enkele commentatoren hebben opgemerkt, zijn er snelkoppelingen om dit heen? en als ik zeg kortere weg, bedoel ik, dat er kortere manieren zijn om een ​​enkele categorie-ID te pakken. Voor wat we uiteindelijk gaan doen, zijn die manieren eigenlijk een beetje langere manieren om dit te doen? maar zoals ik hierboven al zei, gaat het om het leren van een paar manieren om dingen te doen? dus ik zal beide tonen (plus een bonusmethode) aan het eind!


Introductie van $ wpdb->

De interface met de database is een van de meer obscure gedeelten van de WordPress codex, maar het bevat alleen de informatie die we nodig hebben om onze conversie te maken (en een leuke nieuwe truc te leren die we in veel verschillende situaties kunnen gebruiken) . Dit zijn de basics:

U kunt het object gebruiken $ wpdb om met een willekeurige tabel in de WordPress-database te "praten". Als je ooit met MySQL hebt gesleuteld, herken je een deel van hoe dit wordt gedaan, omdat dit allemaal gebeurt met een versie van de ezSQL-klasse. Bijvoorbeeld, de vraag functie kunt u elke SQL-query uitvoeren in de WordPress-database.

 vraag (vraag); ?> // Waar 'query' staat voor de SQL-query die u wilt uitvoeren

U kunt meer lezen over $ wpdb-> query op de codex-pagina? Vandaag zullen we weinig verfijnder zijn en het volgende gebruiken:

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

Van de codex: De get_var functie retourneert een enkele variabele uit de database. Hoewel slechts één variabele wordt geretourneerd, wordt het volledige resultaat van de query opgeslagen in de cache voor later gebruik?

Perfect! Wat dit betekent, is dat we in feite ELKAAR iets in de WordPress-database kunnen grijpen zolang we weten waar we het kunnen vinden? en we weten toevallig waar we onze Category ID kunnen vinden omdat we de Category Slug al kennen. Mij ​​nog steeds volgen?


Een enkele-categorie-ID extraheren uit een single-category-slug

Hier wordt het warm en zwaar. Met behulp van ons voorbeeld waarbij we de categorie slug kennen, kunnen we de ID als volgt uitpakken:

 $ cats = get_post_custom_values ​​('category_filter'); // Retourneert een array met katenslakken uit het aangepaste veld. $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> terms WHERE slug =" $ cat ""); // Pak de categorie-ID van de WPDB met behulp van de categorie slug ($ cat).

Hierdoor wordt een enkele categorie-ID geretourneerd (term_id zoals het bekend is in de DB) en sla het op in onze $ catid variabel. In sommige situaties zijn we misschien klaar? je zou eenvoudig kunnen zijn echo de $ catid waar je maar wilde. In ons voorbeeld hebben we echter nog wat werk te doen.

Voor de duidelijkheid, de eerste $ katten variabele is het grijpen van de categorie naaktslakken uit ons aangepaste veld? zou je de slakken ook met andere methoden kunnen invoegen? maar je hebt wel een manier nodig om de slakken te pakken (of een stukje gegevens dat bij onze ID hoort).


Grijpen van meerdere Category ID's van Multiple Category Slugs

Laten we ons kleine fragment nu uitbreiden door meer dan één categorie snel te gebruiken foreach lus:

 $ cats = get_post_custom_values ​​('category_filter'); // Retourneert een array met katenslakken uit het aangepaste veld. foreach ($ cats as $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> terms WHERE slug =" $ cat ""); // Pak de cat-id uit de database met behulp van de categorie slug ($ cat). $ acats [] = $ catid; // Zet de lijst met ID's om in een ARRAY, $ acats []

Dit laatste stuk code ($ acats?) Maakt gebruik van enkele eenvoudige PHP om elke categorie-ID die we vinden om te zetten in een deel van een array? wat nuttig voor u zou kunnen zijn. Maar laten we gaan nog een ander stap en converteer de array naar een string (omdat de meeste functies in WordPress strings gebruiken).


De array omzetten in een door komma's gescheiden tekenreeks met Join ();

We komen nu in de buurt! Laten we een beetje meer eenvoudige PHP gebruiken om de array met Category ID's die we hebben gemaakt om te zetten in een tekenreeks die we kunnen gebruiken in query_posts.

 $ cats = get_post_custom_values ​​('category_filter'); // Retourneert een array met katenslakken uit het aangepaste veld. foreach ($ cats as $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> terms WHERE slug =" $ cat ""); // Pak de cat-id uit de database met behulp van de categorie slug ($ cat). $ acats [] = $ catid; // Zet de lijst met ID's om in een ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Word lid van de ARRAY in een door komma's gescheiden STRING voor gebruik in query_posts // echo $ cat_string; // Reactie op testuitvoer verwijderen

Let op de laatste regel waar u de "//" kunt verwijderen om uw uitvoer te testen op dit punt, wat een reeks getallen (de categorie-ID's) zou moeten zijn zoals dit: 11, 123, 198, 210?

Je kunt lezen hoe de PHP 'join'-functie hier precies werkt, maar het enige dat je echt moet weten, is dat we onze array van categorie-ID's hebben veranderd in een string, met elke ID gescheiden door een komma? Dit is handig, want dat is precies wat we nodig hebben voor onze laatste stap?


Alles samenvoegen met Query_Posts ();

Laten we de grote onthulling eens bekijken. We hebben een bekende waarde aangenomen (onze categorie-naaktslakken), hebben deze omgezet in categorie-ID's door de database te vragen en zijn vervolgens lid geworden van onze categorie-ID's tot een tekenreeks die we kunnen gebruiken in query_posts ();. Alles goed? Ok, hier is hoe dat allemaal uitziet:

 $ cats = get_post_custom_values ​​('category_filter'); // Retourneert een array met katenslakken uit het aangepaste veld. foreach ($ cats as $ cat) $ catid = $ wpdb-> get_var ("SELECT term_id FROM $ wpdb-> terms WHERE slug =" $ cat ""); // Pak de cat-id uit de database met behulp van de categorie slug ($ cat). $ acats [] = $ catid; // Zet de lijst met ID's om in een ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Word lid van de ARRAY in een door komma's gescheiden STRING voor gebruik in query_posts // echo $ cat_string; // Remove Commenting to Test Output $ args = array ('cat' => $ cat_string, // Query voor de cat-ID's (omdat u niet meerdere namen of slakken kunt gebruiken? Crazy WP!)); query_posts ($ args);

Niet slecht toch? We zijn klaar voor actie - Nu kunnen we dit in de basis gebruiken Als / Terwijl post loop om berichten uit te delen die dat zijn enkel en alleen in het bijzonder categorie IDs die de gebruiker heeft geselecteerd in de selectievakjes (onthoudt u het aanvinkvakje bovenaan?).


Het complete fragment

Oke, de grote onthulling! We moeten alleen enkele extra voorzorgsmaatregelen toevoegen om ervoor te zorgen dat we dit fragment kunnen gebruiken / opnieuw kunnen gebruiken. We moeten ervoor zorgen dat het aangepaste veld, "category_filter"bestaat (er is altijd een kans dat de gebruiker helemaal geen categorieën selecteert.) Als deze niet bestaat, heeft het geen zin om in cirkels rond te rennen, dus gebruiken we een eenvoudig / / wrapper om alleen uit te voeren ons fragment wanneer het aangepaste veld bestaat:

 get_var ("SELECT term_id FROM $ wpdb-> terms WHERE slug =" $ cat ""); // Pak de cat-id uit de database met behulp van de categorie slug ($ cat). $ acats [] = $ catid; // Zet de lijst met ID's om in een ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Word lid van de ARRAY in een door komma's gescheiden STRING voor gebruik in query_posts // echo $ cat_string; // Verwijder commentaar op testuitvoer endif; // Beëindigt u de situatie? ga door zoals gebruikelijk als er geen categoriefilter was. ?> $ cat_string, // Zoekopdracht voor de katten-ID's (omdat je niet meerdere namen of slakken kunt gebruiken? crazy WP!)); query_posts ($ args); ?>

In dit fragment wordt ervan uitgegaan dat u een aangepast veld hebt met de naam 'category_filter"toegewezen aan uw bericht? maar u kunt dit fragment Franken-coderen om vrijwel alles te doen wat u maar wilt. Ok, misschien maakt het u niet een sammich? Maar het is nog steeds een vrij handig fragment.


Een praktisch voorbeeld


Zie die afbeeldingen? Elk is een blogbericht dat is gepakt uit onze aangepaste query_posts (); opstelling? Zie, categorie slakken zijn toch niet helemaal nutteloos! Bekijk het volledige voorbeeld.

Ik heb dit fragment bijvoorbeeld gebruikt als basis voor een aangepaste filterbare portfoliosjabloon in mijn nieuwste SuperSkeleton WordPress-thema. Het "sjabloon voor de portfolio-pagina" bevat de lijst met vakjes voor categorieën, waarmee de gebruiker kan selecteren welke categorieën portfolio-berichten hij op de pagina wil weergeven. De werkstroom is hetzelfde, ik voeg wat extra wendingen toe nadat we query_posts () gebruiken;.

  1. Categorie naaktslakken?
  2. Omgezet naar Categorie-ID's?
  3. Gebruikt in Query_Posts?
  4. Winst!!! Pagina sjabloon filterbaar

Je kunt dit echter voor veel verschillende dingen gebruiken? in feite kan vrijwel elk geval waarin u een paginasjabloon moet maken die naar een specifieke categorie zoekt, dit gebruiken.


Waarom $ wpdb gebruiken?

Twee redenen. In de eerste plaats kon ik de voorkeurstechnieken van niet krijgen get_category_by_slug en get_term_by om in mijn geval te werken omdat ze simpelweg niet teruggaven wat ik nodig had om veel van dit spul te pakken (ze werkten prima voor het grijpen van afzonderlijke categorieën toen ik de categorie slug kende? maar wat als ik de code niet hard wilde coderen naaktslak?).

De tweede reden is educatief? deze kleine, omslachtige probleemoplossende oefening geeft me de gelegenheid om iets te schrijven over $ wpdb, wat een zeer ondergewaardeerde techniek is bij het manipuleren en extraheren van zeer specifieke informatie uit de database. Eerlijk gezegd, vanwege het feit dat je er directe SQL-query's mee kunt gebruiken, is het moeilijk om iets te vinden dat het niet kan.

Oh, en de thumbnail voor deze post is Will Smith die een rapnummer zingt? Ik hoop dat je niets te officieel hebt verwacht: P Dit is goed schoon plezier en niemand zegt dat dit de enige manier is om te grijpen wat we hebben gedaan? in feite zijn hier nog een paar andere ideeën:


Alternatieve methoden Zonder $ wpdb

Get_Category_By_Slug () gebruiken;

Dankzij Andrew voor het feit dat je dit hebt gedaan, kun je ook een meer specifieke functie gebruiken om een ​​Category Slug in een ID te converteren met get_category_by_slug ();. Bekijk hiervoor de codex-pagina en u kunt hieronder bekijken hoe onze code er uit zou zien:

Eenvoudige versie:

 term_id; ?>

Onze versie (die nog steeds lang is, maar je kunt zien waar we gebruik van maken get_category_by_slug (); in plaats van de $ Wpdb-> als onze tool voor het verzamelen van gegevens:

 term_id; $ acats [] = $ id; // Zet de lijst met ID's om in een ARRAY, $ acats [] $ cat_string = join (',', $ acats); // Word lid van de ARRAY in een door komma's gescheiden STRING voor gebruik in query_posts // echo $ cat_string; // Verwijder commentaar op testuitvoer endif; // Beëindigt u de situatie? ga door zoals gebruikelijk als er geen categoriefilter was. ?> $ cat_string, // Zoekopdracht voor de katten-ID's (omdat je niet meerdere namen of slakken kunt gebruiken? crazy WP!)); query_posts ($ args); ?>

Nog een methode met Get_Term_By ();

Eindelijk, zoals Thomas het in de comments duidelijk stelde, lijkt dit veel op "equivalent programmeren van Rochester, NY naar Boston via Wheeling WV"? U kunt de volgende codex-pagina gebruiken voor meer informatie over deze methode. Er is zelfs een ingebouwde functie voor het bouwen van onze array, waardoor we in dit geval een stap overslaan:

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

We kunnen gewoon onze slak passeren en op onze vrolijke manier zijn;)


Inpakken

Ja, dit was een heel specifiek voorbeeld met enkele zeer specifieke aannames van tevoren? maar als je op dit punt nog steeds meegaat, had je met succes het een en ander over het volgende geleerd:

  • Hoe u $ wpdb gebruikt om SQL-query's uit te voeren in de WordPress-database (door in ons voorbeeld de categorie-ID uit een categorie-slak te halen, maar u kunt veel meer doen dan dit)
  • Een foreach-lus uitvoeren in een lijst met categorieën en deze in een array opslaan
  • Converteer een array met categorie-ID's naar een door komma's gescheiden reeks voor gebruik in query_posts ();

Heckler's Note: Ja, als we in de eerste plaats met categorie-ID's begonnen, zouden we ons nooit met dit langdradige proces bezig hoeven te houden? maar dan zou het geen erg leerzame tutorial zijn, toch? ; P Alleen de tijd (en uw opmerkingen) zal uitwijzen of dit daadwerkelijk het is het beste manier om dit te benaderen, maar hopelijk weet je nu net een beetje meer over WordPress! Bedankt voor het lezen!