Om din webbplats använder flera taxonomier för att kategorisera information kan det vara till hjälp att dela upp inlägg i ett taxonomisarkiv med villkoren för en andra taxonomi.
I den här handledningen visar jag dig hur du skapar ett taxonomyarkiv för att göra just det.
Om du någonsin har arbetat med databaser med flera relationer, vet du att en av deras fantastiska funktioner är hur du kan visa data enligt flera taxonomier. Om du till exempel har en databas med kunder kan du enkelt se vilka kunder som har anställt dig för olika kategorier av projekt och sortera sedan vidare genom att se vilka webbdesignklienter som står på en viss plats.
När jag började arbeta med WordPress fann jag det frustrerande att du inte enkelt kunde göra det här - åtminstone kan du inte göra det med en out-of-the-box WordPress-installation som kör standardtema.
Det är dock möjligt att klassificera dina data med mer än en taxonomi. I denna handledning. Jag ska visa dig hur man skapar en taxonomisida för att lista inlägg i den taxonomin, beställd av villkoren för en annan taxonomi som också gäller dem.
Jag skapar sedan ett andra taxonomiarkiv för den andra taxonomin, som listar sina inlägg i enlighet med de första taxonomins villkor (lita på mig - det kommer att ge bättre mening när du ser det hända!)
För att slutföra denna handledning behöver du:
För denna handledning skapar jag ett barntema av tjugofemtio med två nya mallfiler, ett stilark och en funktionsfil. Om du arbetar med ditt eget tema kopierar du bara koden från min funktionsfil till ditt temas funktionsfil och lägger till mallfilerna med tweaks för att återspegla ditt temas markup.
För att skapa mitt tema skapar jag en fil som heter style.css
i min tomma temapapp och fyll i den med följande:
/ * Tema Namn: WPTutsPlus Skapa ett Taxonomy-arkiv till listan inlägg med en andra taxonomi Villkor Tema URI: http://rachelmccollin.co.uk/wptutsplus-taxonomy-archive-list-by-second-taxonomy/ Beskrivning: Tema för att stödja WPTutsPlus handledning om att skapa ett anpassat taxonomy arkiv. Barn tema för tjugofjorton tema. Författare: Rachel McCollin Författare URI: http://rachelmccollin.co.uk/ Mall: twentyfourteen Version: 1.0 * / @import url ("... /twentyfourteen/style.css");
Detta skapar mitt barntema.
För denna handledning ska jag använda samma sak 'djur'
posttyp och 'Animal_cat'
taxonomi som jag använde i min handledning om att skapa en anpassad posttypmall. Jag lägger också till en andra taxonomi som heter 'livsmiljö'
.
För att göra detta skapar jag en ny fil som heter functions.php
. Först lägger jag till funktionen för att registrera min posttyp:
__ ('Djur'), 'singular_name' => __ ('animal'), 'add_new' => __ ('Nytt djur'), 'add_new_item' => __ ('Lägg till nytt djur'), 'edit_item' = > __ ('Redigera djur'), 'new_item' => __ ('Nytt djur'), 'view_item' => __ ('Visa djur'), 'search_items' => __ ('Sök djur'), 'not_found '=> __ (' Inga djur hittades '),' not_found_in_trash '=> __ (' Inga djur hittades i papperskorg ')); $ args = array ('labels' => $ etiketter, 'has_archive' => true, 'public' => true, 'hierarchical' => false, 'supports' => utdrag ',' anpassade fält ',' miniatyrbild ',' sidattribut '),' taxonomies '=> array (' post_tag ',' category ')); register_post_type ('animal', $ args); add_action ('init', 'wptp_create_post_type'); ?>
Och då registrerar jag mina två taxonomier inom en funktion:
array ('name' => 'Animal Families', 'singular_name' => 'Djurfamilj', 'search_items' => 'Sök djurfamiljer', 'all_items' => 'Alla djurfamiljer', 'edit_item' => ' Redigera djurfamiljer ',' update_item '=>' Uppdatera djurfamilj ',' add_new_item '=>' Lägg till nytt djurfamilj ',' new_item_name '=>' Nytt djurfamiljnamn ',' menu_name '=>' Animalfamilj ' ), 'hierarchical' => true, 'sort' => sant, 'args' => array ('orderby' => 'term_order'), 'rewrite' => array ('slug' => 'djurfamilj' ), 'show_admin_column' => true)); // registrera en taxonomi som heter 'Habitat' register_taxonomy ('habitat', 'animal', array ('etiketter' => array ('name' => 'Habitats', 'singular_name' => 'Habitat', 'search_items' = > 'Habitat', 'all_items' => 'Alla habitat', 'edit_item' => 'Redigera habitat', 'update_item' => 'Uppdateringshabitat', 'add_new_item' => 'Lägg till ny habitat', 'new_item_name' => 'Habitat', 'hierarchical' => true, 'sort' => true, 'args' => array ('orderby' => 'term_order'), 'show_admin_column' => true)); add_action ('init', 'wptp_register_taxonomies'); ?>
Detta skapar 'djur'
posttyp och de två taxonomierna som gäller för den. Observera att jag har använt 'Show_admin_column'
för att göra livet lite enklare när du administrerar mina inlägg.
Efter att ha lagt till några data och klassificerat djuren enligt min taxonomi kan jag nu se mina data i WordPress instrumentbrädan, som visas nedan.
Obs! Min klassificering av de djur jag har använt är inte särskilt vetenskaplig. Vänligen kommentera inte mina livsmiljöer eller familjer!
Nästa steg är att skapa en mallfil för 'Animal_cat'
taxonomi arkiv. Skapa en fil i temakartan och ring den taxonomi-animal_cat.php
. Nu lägger du in omslagskoden till det från ditt tema (jag har kopierat det från mitt föräldertema, det kommer att vara annorlunda om du använder ditt eget tema):
Denna mallfil behöver nu ha lite data till den.
Identifiera den aktuella Queried termen
Arkivmallen ska användas
WP_Query
att skapa en anpassad fråga för varje term. Ett av de frågade objekten kommer att vara den aktuella taxonomitermen som visas, så du måste identifiera den och lagra den som en variabel.Under
get_header ()
rad, lägg till:Du kan då använda det
$ animalcat
variabel senare.Utmatning av en sidrubrik
Arkivet har för närvarande inte ett huvudrubrik, så du måste lägga till en med den variabel du just definierat.
Efter öppningen
tagg, lägg till följande:namn; ?>
Hämtar villkor för den andra taxonomin
Därefter måste du hämta listan över termer för den andra taxonomin. Nedanför koden som du just lagt till, sätt in det här:
0)); ?>Detta hämtar en lista över alla termer och lagrar den i en array. Genom att använda
'Hide_empty'
Du kan undvika att några tomma villkor visas - men som du kommer att se inom kort, förhindras det bara att villkor ställs in som inte har några inlägg alls, inte de som inte har några inlägg med den aktuella frågesatsperioden.Skapa loopen
Skapa nu en slinga som kommer att köras för var och en av villkoren:
'animal', 'animal_cat' => $ animalcat-> slug, 'habitat' => $ term-> slug); $ query = nytt WP_Query ($ args); // mata ut namnet i ett rubrik tag echo "'. $ term-> namn. ' livsmiljö
'; // skriva ut titlarna i en lista echo ''; // Starta Loop medan ($ query-> have_posts ()): $ query-> the_post (); ?>
- ">
'; // Använd återställ postdata för att återställa den ursprungliga sökningen wp_reset_postdata (); ?>Några anteckningar om detta:
- För varje term definieras en ny fråga.
- Argumenten för frågan inkluderar termen i den andra taxonomin (
$ term
) och termen som för närvarande frågas ($ animalcat
).- Om din taxonomi endast gäller för en posttyp, kan du lämna ut det
'Post_type'
argument men jag föredrar att inkludera det bara i fallet.- De
$ term
variabel används för att mata ut en titel för varje sektion med$ Sikt-> namn
.Spara nu din mallfil och ta en titt på taxonomins arkiv för en av dina Djurfamilj villkor:
Lägga till en kontroll för inlägg till varje fråga
För tillfället som du kan se är mallen utmatad tomma listor. Det här kan enkelt lösas genom att kontrollera om varje fråga har inlägg.
Wrap följande runt din loop:
om ($ query-> have_posts ())Din slinga kommer nu att se ut så här:
om $ query-> have_posts ()) // matar ut termen i ett rubrik tag echo ''. $ term-> namn. ' livsmiljö
'; // skriva ut titlarna i en lista echo ''; // Starta Loop medan ($ query-> have_posts ()): $ query-> the_post (); ?>
- ">
';Detta förhindrar att WordPress kör lösenordet om frågan inte har några inlägg, vilket tar bort de tomma rubrikerna. Nu ser min arkivsida ut så här:
Mycket bättre!
Skapa mallfilen för den andra taxonomin
Det sista steget är att skapa en mallfil för den andra taxonomins arkiv.
Kopiera din första mallfil och byt namn på den
taxonomi-habitat.php
. Redigera det så att terminologin är korrekt. De ändringar som jag behöver göra till min fil är:
- tweaking kommentarerna längst upp i filen så att de är korrekta
- ändra namn på
$ animalcat
variabel till$ habitat
(du kan undvika detta problem genom att ge variabeln ett mer generiskt namn - men ring det inte$ term
som du använder det på annat håll)- redigera
rubrik så det använder
$ habitat
variabel för att mata ut namnet på den aktuella queried termen (jag har också lagt till lite förklarande text här som är valfri)- ändra den första parametern för
get_terms ()
funktion så det använderanimal_cat
termen, inte denlivsmiljö
termin.- redigering av frågargumenten, väsentligen byta värdena för
'Animal_cat'
och'livsmiljö'
.- redigera
innehåll i slingan för att referera till familjer som inte är livsmiljöer.
Det betyder att min nya mallfil ser ut så här:
Livsmiljö - namn; ?>
0)); ?> 'djur', 'animal_cat' => $ term-> slug, 'habitat' => $ habitat-> slug); $ query = nytt WP_Query ($ args); om $ query-> have_posts ()) // matar ut termen i ett rubrik tag echo ''. $ term-> namn. "familj
'; // skriva ut titlarna i en lista echo ''; // Starta Loop medan ($ query-> have_posts ()): $ query-> the_post (); ?>
- ">
'; // Använd återställ postdata för att återställa den ursprungliga sökningen wp_reset_postdata (); ?>När du har gjort ändringarna, spara din nya mallfil och kolla ett av dina arkiv:
Du har nu en sida för den andra taxonomin som fungerar på samma sätt som den första.
Sammanfattning
I denna handledning har du lärt dig ett sätt att visa data med flera taxonomier. Du kan ta detta vidare genom att arbeta med en tredje taxonomi på ett av två sätt:
- Upprepa processen för att hämta termer, definiera en fråga och köra slingan för tredje termen efter andra termen, så att du har två separata listor.
- Slå samman dina data med alla tre termerna, med hjälp av varje
$ term
variabel på samma sätt som$ habitat
eller$ animalcat
variabel och lägger till en extraför varje()
uttalande inuti ditt existerandeför varje()
påstående. Du skulle då behöva tänka på hur man lägger ut den resulterande data med hjälp av listor eller ett nät.Varför inte gå?