Hur man arbetar med WordPress Term Meta Term Metadata API

Det första inlägget i denna serie lagde grunden för att förstå taxonomier, villkor och deras förhållande inom ramen för WordPress. Om du inte har läst det ännu och du är helt ny på WordPress-utveckling, rekommenderar jag starkt att läsa igenom det eftersom det här inlägget kommer att byggas utöver allt som omfattas av den artikeln.

Dessutom, när vi fortsätter med att prata om fler typer av metadata är det viktigt att se över tidigare serier som vi täckte:

  • Skicka metadata
  • Användarmetadata
  • Kommentera metadata

Anledningen till att det är värt att granska dessa artiklar är att den här artikeln kommer att likna några av de tekniker som omfattas av dessa artiklar och kommer också att bygga på några av strategierna med att arbeta med liknande API.

Framför allt syftar denna handledning till att ge ett genomgång av hur man arbetar med ett av de nyaste metadata-API-erna som finns tillgängliga i WordPress.

En ansvarsfriskrivning för utvecklare

Som tidigare nämnts är den här artikeln riktad mot dem som bara kommer in i WordPress-utveckling eller som ser ut att växa sina färdigheter. Så om du är en avancerad utvecklare, kan innehållet som omfattas av den här artikeln inte vara av intresse för dig.

En av de viktigaste sakerna att komma ihåg när vi arbetar genom denna handledning är att koden inte ska användas i en produktionsmiljö. Det vill säga att det endast är att studera API: n och att förstå hur det fungerar.

Koden som vi skriver är inte avsedd att användas i ett projekt som kommer att användas för en publik eller en grupp användare. Huvudskälet är att det finns ämnen som sanering, validering, flykt och så vidare som ligger utanför ramen för den tidigare serien och den här serien.

När vi har paketerat den här artikeln går vi vidare till mer avancerade ämnen som de, men för närvarande kommer vi att fokusera enbart på API-metadata.

En uppfriskning om taxonomier och villkor

Innan vi pratar om metadataprogrammet, låt oss se till att vi alla är på samma sida som det gäller de olika terminologier som vi ska använda. Specifikt måste vi se till att vi förstår taxonomier, villkor och förhållandet mellan de två.

För det första definierar Codex taxonomierna som:

I WordPress är en "taxonomi" en grupperingsmekanism för vissa inlägg (eller länkar eller anpassade posttyper).

I en standard WordPress-installation kan du tänka på dessa som kategorier och taggar. De kan vara hierarkiska, som kategorier eller icke-hierarkiska liknande taggar.

Villkor, å andra sidan, definieras som:

I WordPress är en term en klassificering, grupp eller delmängd av en taxonomi, där den senare kan vara en kategori, tagg eller anpassad taxonomi. Som standard har termen en titel, en slug och en beskrivning. Hierarkiska taxonomier som kategorier kan definiera en föräldraperiod.

Slutligen är förhållandet mellan taxonomier och termer sådant att man inte kan existera utan den andra (särskilt i hierarkiska taxonomier). Det vill säga att en kategori taxonomi måste ha minst en term som är associerad med den; icke-hierarkiska taxonomier behöver dock inte nödvändigtvis följa det.

Med det sagt, låt oss börja med att arbeta med Term Metadata API.

Arbeta med API: n

Precis som med de andra metadata-API: er som är tillgängliga, kommer vi att kunna göra saker som:

  • Lägg till
  • uppdatering
  • hämta
  • radera

Och eftersom det här är ett nytt API, kanske det inte är omedelbart klart vad några av fördelarna med detta API är. Även om vi bara ska utforska några av grunderna i den här artikeln är det värt att överväga några av de saker som vi kan göra.

Till exempel:

  • Associera färger eller bilder med en term
  • Begränsa vissa inlägg som hör till en term
  • Lägg till binära data, t.ex. dokument eller PDF-filer, för en term som kan göras tillgänglig i fronten
  • … och mer.

Självklart finns det många fler möjligheter. Men för nu, låt oss se hur vi kan införliva detta i vårt arbete.

Förbereda teman

För att komma igång, låt oss se till att vi är på samma sida om vad vi ska använda för att få det här arbetet gjort. Specifikt, här är vad du behöver, och här är vad jag använder.

  • en IDE-jag använder Atom
  • en databas front-end-Jag använder Sequel Pro
  • en version av WordPress-Jag använder WordPress 4.4.2
  • ett grundläggande tema-jag ska använda tjugotixen

När du har allt detta satt upp, så är vi redo att gå. Om du behöver hjälp med att få din utvecklingsmiljö upprättad, vänligen se denna serie artiklar.

Komma igång

Det första vi behöver göra är att skapa en fil som innehåller allt arbete som vi ska göra i denna handledning.

Först måste vi skapa tutsplus sikt-metadata.php i roden av tjugo sexton temakatalog.

Därefter måste vi lägga till följande rad kod till tematets funktioner.php-fil. Detta kommer att se till att vi inkluderar vårt arbete i temat.

När du laddar om webbläsaren bör du se något som följande bild:

Det ska inte finnas någon felutgång, och det ska fungera som om ingenting har förändrats. Slutligen, om du arbetar med en ny installation av WordPress, bör termen metadatabordet se helt tomt ut:

För att vi ska kunna se till att vi har en kategori som vi jobbar med, fortsätt och skapa en ny kategori i din WordPress-installation. Jag ska skapa en kallad Huvudsaklig och se till att Hej världen är stämplat med detta.

När du är klar, ta en titt på villkorstabellen i databasen för att få term_id. I mitt fall är term_id är 2. Din kan variera, men poängen är att du vet att ID för termen ifråga:

Notera att vi kommer att använda detta under hela handledningen.

Lägga till metadata

För att komma igång är det viktigt att känna igen det add_term_meta funktionen kan tjäna två syften:

  1. Funktionen kan skapa icke-unika värden associerade med ett enda term ID och en enda metatangent.
  2. Funktionen kan skapa unika värden förknippade med ett enda term ID och en enda metatangent.

Funktionen accepterar ett term ID, en metatangent, ett metavärde och ett valfritt booleskt värde som bestämmer huruvida det värde som lagras är unikt eller inte.

Unika värden

Låt oss först skapa ett unikt värde i databasen. Ange följande kod i redigeraren, uppdatera Hej världen, och sedan se termmeta tabell. 

term_id; om (1 === get_the_ID () && 2 === $ term_id) add_term_meta ($ term_id, 'my_meta_key', 'my_meta_value', true);  returnera $ innehåll  

Du borde se din information.

Om du ändrar metavärdet och uppdaterar sidan ska du märka att värdet i databasen har inte ändrats. Detta beror på att du har sagt att detta ska vara ett unikt värde och det första värdet som skrivs kommer inte att ändras eller skrivas över. 

Detta kan uppnås med update_term_meta, men vi ser tillfälligt på den koden.

Icke-unika värden

Innan vi tittar på hur vi kan uppdatera termen meta, låt oss se hur vi kan lägga till flera värden till samma meta-nyckel och samma term ID. Koden nedan liknar koden ovan, förutom att vi inte passerar sant i funktionen.

term_id; om (1 === get_the_ID () && 2 === $ term_id) för ($ i = 0; $ i < 3; $i++ )  $meta_value = "my_meta_value_$i"; add_term_meta( $term_id, 'non_unique_key', $meta_value );   return $content; 

Uppdatera Hej världen några gånger och ta en titt på databasen. Du borde se något så här:

Vettigt? I grund och botten när du säger att du vill ha ett unikt värde, kommer det första värdet du anger att fortsätta som endast värde (om du inte uppdaterar eller tar bort det). 

Om du däremot inte anger att du vill att det ska vara ett unikt värde, kan du lagra så många värden som du vill ha med termen ID och metatangenten.

Detta leder emellertid till att hämta information och radera information annorlunda från databasen. Vi tar en titt på detta mer i detalj senare i artikeln.

Uppdatering av metadata

API-funktionen update_term_meta ger oss några bra alternativ. För det första ger vi oss möjlighet att lägga till en enda, unik post i databasen utan att behöva använda den fjärde parametern för add_post_meta.

För det andra tillåter vi oss att uppdatera en viss metadata så länge vi vet vad det tidigare värdet var. Låt oss ta en titt på båda dessa fall med tanke på vår databas nuvarande status.

Lägga till unika data

För att lägga till unika metadata kan vi ringa det som väldigt liknar det vi såg i det första exemplet till add_term_meta. I stället använder vi den här gången update_term_meta. Titta till exempel på följande kod:

term_id; om (1 === get_the_ID () && 2 === $ term_id) update_term_meta ($ term_id, 'update_key', 'my_unique_update_value');  returnera $ innehåll 

Uppdatera Hej världen några gånger och oavsett hur många gånger du uppdaterar det, ser du ett enda värde som skrivs in i databasen. Om du följer med koden bör du se något så här:

Men vad händer när det finns flera poster med samma meta-nyckel och vi vill uppdatera dem?

Uppdatering av ett icke-unikt register

För att uppdatera en post som har samma term ID och samma metatangent är det viktigt att känna till det tidigare värdet. I vårt fall vet vi att vi har ett värde som heter my_meta_value_1

För det ändamålet kan vi uppdatera den här specifika raden genom att ange det nya värdet och det gamla värdet i update_term_meta fungera. För att göra detta, ta en titt på följande kod:

term_id; om (1 === get_the_ID () && 2 === $ term_id) update_term_meta ($ term_id, 'non_unique_key', 'my_meta_value_1_updated', 'my_meta_value_1');  returnera $ innehåll 

Och sedan uppdatera Hej världen. När det är gjort bör det uppdaterade metavärdet se ut så här:

Om du inte ser samma resultat, se till att du korrekt angett det korrekta funktionsnamnet i din krok, skriv termen ID, rätt metatangent och rätt föregående meta värde.

Hämtar metadata

För att få metadata som vi har hämtat kan vi använda get_term_meta fungera. 

Observera dock att när vi hämtar termiska metadata kan vi hantera en metatangent som har flera värden förknippade med det. Eller vi kan hantera en metatangent som bara har ett enda värde.

Beroende på situationen måste vi ange olika uppgifter för funktionen. 

Hämtar alla metadata

Att hämta alla metadata som är associerade med en enda term är lätt, som koden nedan visar. Den viktigaste saken att uppmärksamma är att resultaten returneras i en array. 

I exemplet nedan ska vi använda non_unique_key som vår metatangent eftersom den har flera värden som är associerade med den.

term_id; om (1 === get_the_ID () && 2 === $ term_id) get_term_meta ($ term_id, 'non_unique_key');  returnera $ innehåll 

Du kan välja att echo resultaten ut till skärmen, du kan välja att använda var_dump, eller du kan välja att använda en debugger för att visa informationen. Oavsett fallet bör du se något som följande som dina resultat:

array (3) [0] => sträng (15) "my_meta_value_0" [1] => sträng (23) "my_meta_value_1_updated" [2] => sträng (15) "my_meta_value_2"

Med tanke på denna produktion kan du välja att lagra den i en variabel och sedan hämta ett visst värde från ett visst index. Eller kanske du skulle välja att slingra igenom data och läsa eller manipulera det.

Oavsett användningsfall, så här kan du hämta all information som är associerad med en metatangent.

Hämtar ett enskilt stycke metadata

När vi pratar om att hämta en enda metadata, menar vi normalt att vi letar efter att hämta en post från många (som i vårt exempel ovan); Det kan dock finnas fall där vi vill hämta ett enskilt metavärde associerat med en enda metatangent.

Vi pratar om det senare fallet på ett ögonblick. Men först låt oss täcka fallet där vi vill hämta ett enda värde från en uppsättning data som har samma term ID och samma metatangent.

Observera i koden nedan, vi passerar ett fjärde värde, Sann:

term_id; om (1 === get_the_ID () && 2 === $ term_id) get_term_meta ($ term_id, 'non_unique_key', true);  returnera $ innehåll 

Och här är det som returneras:

sträng (15) "my_meta_value_0"

Observera att detta returnerar det första värdet som det finner, och det gör det i form av en sträng.

Vad händer om det bara finns en post?

Om det bara finns en post, har du två alternativ:

  1. Du kan hämta informationen utan att ange det Sann.
  2. Du kan hämta informationen genom att ange Sann.

Om du väljer det första fallet kommer du att få tillbaka en array med ett enda index och ett enda värde. Som sådan måste du ta bort värdet ur resultatet genom att göra något liknande $ värde = $ resultat [0] förutsatt att du lagrar resultatet av funktionssamtalet i $ result.

Å andra sidan, om du väljer det andra alternativet, kan du förvänta dig att resultatet returneras till dig som en sträng.

Förmodligen är det viktigaste att notera om att närma sig värdena den här strategin är att värdena är unika med tanke på deras metatangent.

Radering av metadata

Slutligen måste vi ta en titt på att ta bort associerade metadata. Och i överensstämmelse med resten av våra exempel beror detta på om det finns flera bitar metadata som är förknippade med en metatangent eller ett enda metavärde associerat med en metatangent.

Radera alla poster

Om du vet att det finns en enda metatangent som har flera värden associerade med det, kan du använda följande kod:

term_id; om (1 === get_the_ID () && 2 === $ term_id) delete_term_meta ($ term_id, 'non_unique_key');  returnera $ innehåll  

Och det kommer att uppdatera databastabellen så att det ser ut så här:

Om du har följt med, vet du att det här tog bort alla data som är associerade med non_unique_key metatangent.

Radering av en enskild post

Om du vill ta bort en enskild post, finns det två sätt att göra detta:

  1. Du vet meta-värdet associerat med metatangenten som du vill radera.
  2. Värdet associerat med den angivna metatangenten är unik, eftersom metatangenten och metavärdet är unika.

För det ändamålet tar vi en titt på det första exemplet i det här avsnittet, och vi tar en titt på det andra exemplet i det här avsnittet.

För att radera en enskild post där vi känner till det associerade metavärdet kan vi skriva kod som anger både metatangenten och metavärdet. Till exempel:

term_id; om (1 === get_the_ID () && 2 === $ term_id) delete_term_meta ($ term_id, 'my_meta_key', 'my_meta_value');  returnera $ innehåll 

Detta tar bort raden i samband med denna information från databasen.

Sletter en unik post

Slutligen, om det finns en enda unik post där du känner till metatangenten men du inte vet meta-värdet, kan du fortfarande radera den inspelningen från databasen.

Allt du behöver ange i källkoden är metatangenten. Se i följande funktion:

term_id; om (1 === get_the_ID () && 2 === $ term_id) delete_term_meta ($ term_id, 'update_key');  returnera $ innehåll 

Starka läsare kommer sannolikt att fånga att funktionen ovan är samma funktionsdefinition som vi angav när raderade poster som har alla flera värden. Och det är för att de är det samma.

Skillnaden är dock avsikt av funktionen. En funktions avsikt kommer ofta att driva hur vi namnger funktionen. I det föregående fallet ville vi ta bort alla metadata. I det här fallet ville vi ta bort en enda terminsmetadata.

Detta har konsekvenser när det gäller att skriva kvalitetskod och när det gäller att skriva enhetstester.

Den fullständiga källkoden

Här kommer du hitta all kod som vi har använt genom hela det här inlägget tillsammans med ytterligare kommentarer som förklarar vad som händer i koden. Kom ihåg att alla dessa funktioner är anslutna till innehållet, vilket innebär att funktionerna kommer att elda varje gång posten laddas.

Som sådan, den add_filter samtal kommenteras så att du kan aktivera dem efter behov.

term_id; om (1 === get_the_ID () && 2 === $ term_id) add_term_meta ($ term_id, 'my_meta_key', 'my_meta_value_changed', true);  returnera $ innehåll  // add_filter ('the_content', 'tutsplus_add_term_metas'); / ** * Om vi ​​är på det första inlägget och i kategorin som har * ID för '2', lägger vi till flera meta-värden med samma * metatangent till termen metadata. * * @param string $ content Inläggets innehåll. * @returnsträng Postinnehållet. * / funktion tutsplus_add_term_metas ($ content) $ category = get_the_category (); $ term_id = $ category [0] -> term_id; om (1 === get_the_ID () && 2 === $ term_id) för ($ i = 0; $ i < 3; $i++ )  $meta_value = "my_meta_value_$i"; add_term_meta( $term_id, 'non_unique_key', $meta_value );   return $content;  //add_filter( 'the_content', 'tutsplus_update_term_meta' ); /** * Updates the term meta value with the specified key. If the value * doesn't exist, then the record will be created. This will only * be added if the 'Hello World' page is loaded with the category * having the ID of '2'. * * @param string $content The post content. * @return string The post content. */ function tutsplus_update_term_meta( $content )  $category = get_the_category(); $term_id = $category[0]->term_id; om (1 === get_the_ID () && 2 === $ term_id) update_term_meta ($ term_id, 'update_key', 'my_unique_update_value');  returnera $ innehåll  // add_filter ('the_content', 'tutsplus_update_term_metas'); / ** * Uppdaterar det existerande värdet för metadata som har metatangenten 'non_unique_key' * med det angivna metavärdet. Detta händer bara om vi är på * inlägget med ID för en och det har kategorin ID för '2'. * * @param string $ content Inläggets innehåll. * @returnsträng Postinnehållet. * / funktion tutsplus_update_term_metas ($ content) $ category = get_the_category (); $ term_id = $ category [0] -> term_id; om (1 === get_the_ID () && 2 === $ term_id) update_term_meta ($ term_id, 'non_unique_key', 'my_meta_value_1_updated', 'my_meta_value_1');  returnera $ innehåll  // add_filter ('the_content', 'tutsplus_get_term_metas'); / ** * Om vi ​​är på det första inlägget och posten har kategoridokumentet för "2", hämta sedan termen meta i form av en matris. * * @param string $ content Inläggets innehåll. * @returnsträng Postinnehållet. * / funktion tutsplus_get_term_metas ($ content) $ category = get_the_category (); $ term_id = $ category [0] -> term_id; om (1 === get_the_ID () && 2 === $ term_id) get_term_meta ($ term_id, 'non_unique_key');  returnera $ innehåll  // add_filter ('the_content', 'tutsplus_get_term_meta'); / ** * Om vi ​​är på det första inlägget och inlägget har kategorin ID för '2' hämtar * det första värdet från metadata som en sträng. * * @param string $ content Inläggets innehåll. * @returnsträng Postinnehållet. * / funktion tutsplus_get_term_meta ($ content) $ category = get_the_category (); $ term_id = $ category [0] -> term_id; om (1 === get_the_ID () && 2 === $ term_id) get_term_meta ($ term_id, 'non_unique_key', true);  returnera $ innehåll  // add_filter ('the_content', 'tutsplus_delete_term_metas'); / ** * Om vi ​​befinner oss på det första inlägget och posten har kategoridokumentet för '2', tar * de metatvärden som är associerade med den angivna nyckeln bort. * * @param string $ content Inläggets innehåll. * @returnsträng Postinnehållet. * / funktion tutsplus_delete_term_metas ($ content) $ category = get_the_category (); $ term_id = $ category [0] -> term_id; om (1 === get_the_ID () && 2 === $ term_id) delete_term_meta ($ term_id, 'non_unique_key');  returnera $ innehåll  // add_filter ('the_content', 'tutsplus_delete_term_meta'); / ** * Om vi ​​befinner oss på det första inlägget och posten har kategoridokumentet för "2" tar * det angivna metavärdet i samband med den angivna metatangenten. * * @param string $ content Inläggets innehåll. * @returnsträng Postinnehållet. * / funktion tutsplus_delete_term_meta ($ content) $ category = get_the_category (); $ term_id = $ category [0] -> term_id; om (1 === get_the_ID () && 2 === $ term_id) delete_term_meta ($ term_id, 'my_meta_key', 'my_meta_value');  returnera $ innehåll  // add_filter ('the_content', 'tutsplus_delete_single_term_meta'); / ** * Om vi ​​befinner oss på det första inlägget och posten har kategoridokumentet för '2', tar * de metatvärden som är associerade med den angivna nyckeln bort. * * @param string $ content Inläggets innehåll. * @returnsträng Postinnehållet. * / funktion tutsplus_delete_single_term_meta ($ content) $ category = get_the_category (); $ term_id = $ category [0] -> term_id; om (1 === get_the_ID () && 2 === $ term_id) delete_term_meta ($ term_id, 'update_key');  returnera $ innehåll  

Det är inte alls ovanligt att hitta funktioner som detta hakade i en annan krok som spara inlägget eller något liknande. Det här är något som vi kommer att beskriva närmare i en avancerad handledning senare i år.

Slutsats

För dem som har följt den här serien och tidigare serier som arbetar med resten av metadataprogrammet, bör mycket av materialet som omfattas av denna serie inte vara för svårt att förstå.

Kanske är den svåraste delen av att arbeta med detta API utövar din kreativitet på de många sätt som faktiskt kan användas. Men eftersom vi har täckt på vilket sätt att arbeta med API, att sätta det på jobbet borde inte vara fruktansvärt svårt.

Kom ihåg att vi under de närmaste veckorna ska titta på avancerade och korrekta tekniker för att skriva och läsa information i databasen så att vi kan arbeta med dem i en produktionsmiljö.

Under tiden, om du letar efter andra verktyg för att hjälpa dig att bygga upp din växande uppsättning verktyg för WordPress eller för att koden ska studera och bli mer välbevandrad i WordPress, glöm inte att se vad vi har tillgängliga i Envato Marknadsföra.

Kom ihåg att du kan fånga alla mina kurser och handledning på min profilsida, och du kan följa mig på min blogg och / eller Twitter på @tommcfarlin där jag pratar om olika mjukvaruutveckling och hur vi kan använda dem i WordPress.

Tveka inte att lämna några frågor eller kommentarer i foderet nedan, och jag vill sikta på att svara på var och en av dem.

Relaterade resurser

  • Anpassade fält
  • get_the_category
  • add_term_meta
  • update_term_meta
  • get_term_meta
  • delete_term_meta
  • eko
  • var_dump