I den här delen av denna serie på WP_Query
, Du lär dig att använda WP_Query
att fråga efter inlägg, sidor och anpassade inläggstyper. Du kan fråga efter specifika inlägg och sidor eller du kan köra en fråga för att returnera inlägg av en eller flera posttyper.
Innan vi börjar, låt oss få en snabb omgång om hur argument fungerar WP_Query
. När du kodar WP_Query
i dina teman eller plugins måste du inkludera fyra huvudelement:
I praktiken kommer det att se ut som följande:
have_posts ()) // Starta looping över sökresultatet. medan ($ query-> have_posts ()) $ query-> the_post (); // Innehållet i de efterfrågade postresultaten går här. // Återställ ursprungliga postdata. wp_reset_postdata (); ?>
Argumenten är vad som säger WordPress vilka data som hämtas från databasen och det är de som jag täcker här. Så allt vi fokuserar på här är den första delen av koden:
$ args = array (// Arguments for your query.);
Som du kan se finns argumenten i en array. Du lär dig hur du kodar dem när du arbetar genom den här handledningen.
Det finns ett visst sätt att koda argumenten i arrayen, vilket är enligt följande:
$ args = array ('parameter1' => 'värde', 'parameter2' => 'värde', 'parameter3' => 'värde');
Du måste bifoga parametrarna och deras värden i enskilda citattecken, använd =>
mellan dem och separera dem med ett komma. Om du får fel kan WordPress inte lägga till alla dina argument på frågan eller du kan få en vit skärm.
Låt oss börja med det enklaste scenariot: kör en fråga för att hitta ett specifikt inlägg eller en sida.
För att hitta ett visst inlägg (eller uppsättning inlägg) har du två alternativ:
p
(int): Använd post-ID.namn
(sträng): Använd eftersläp.Du kan använda dessa parametrar med vilken posttyp som helst, inklusive inlägg, sidor, bilagor och anpassade posttyper. Som standard frågar WordPress för 'posta'
posttyp och returnera inte sidor eller anpassade posttyper - om du vill göra det måste du lägga till fler argument eller använda ett annat argument som jag kommer senare till i denna handledning.
Så, för att returnera ett specifikt inlägg skulle du använda en av dessa:
$ args = array ('p' => '32');
eller:
$ args = array ('name' => 'post_slug');
Observera att namn
parametern tar stolpen som sitt argument, inte dess titel.
Använda namn
Parameter gör det enklare att identifiera vad din fråga kommer att hämta från databasen när du besöker din kod vid ett senare tillfälle, men det finns risk för att det inte fungerar om en av dina webbplatsers användare ändrar eftersläpningen. Post-ID kan inte ändras så det här är säkrare.
För att fråga efter en viss sida har du två alternativ igen:
page_id
(int): Använd sid ID.pagename
(sträng): Använd sidoslag.Så, för att köra en fråga som hämtar bara en specifik sida från databasen, använder du en av dessa:
$ args = array ('page_id' => '20');
eller:
$ args = array ('pagename' => 'page_slug');
Om du vill köra en fråga för ett inlägg av en annan posttyp, inklusive en anpassad posttyp, använder du också post_type
parameter. Jag kommer att beskriva det här lite mer detaljer senare i denna handledning, men i korthet, för att fråga om ett enda inlägg i produkt
anpassad posttyp, skulle du använda detta:
$ args = array ('p' => '46', 'post_type' => 'produkt');
Eller för att fråga efter en bilaga, skulle du använda:
$ args = array ('p' => '46', 'post_type' => 'bilaga');
Ibland kan du behöva hämta alla sidor som är barn på en given sida, till exempel om din webbplats har en hierarkisk sidstruktur och du vill visa en lista på varje sida på sidans barn.
Obs! Du skulle inte göra det här med inlägg eftersom de inte är hierarkiska, även om du kan med en anpassad posttyp om den är hierarkisk.
Du har tre argument du kan använda för att göra detta:
post_parent
(int): Använd sid ID för att returnera endast barnsidor. Ställ in på 0 för att bara returnera överordnade poster.post_parent__in
(array): Använd en rad post-ID.post_parent__not_in
(array): Använd en rad post-ID.Låt oss ta en titt på var och en av dem.
Den första, post_parent
, kan du söka efter sidor som är barn på en viss sida.
Så att hitta alla sidor som är barn på en given sida, använder du det här:
$ args = array ('post_type' => 'sida', 'post_parent' => '2');
Observera att du måste inkludera post_type
argument som standardposttyp som WP_Query
letar efter är posta
.
Med detta vidare, så här använder du den för att hitta barn på den aktuella sidan:
$ current_page_id = get_the_ID (); $ args = array ('post_type' => 'sida', 'post_parent' => $ current_page_id);
Du kan även använda den här parametern för att identifiera sidor på toppnivå, dvs de som inte har en förälder:
$ args = array ('post_type' => 'sida', 'post_parent' => '0');
Men vad händer om du vill identifiera barn på flera sidor? Det kan du också göra med post_parent__in
parameter. Detta tar en rad post-ID-er.
Så att fråga för barnen på två av dina sidor, skulle du använda det här:
$ args = array ('post_type' => 'sida', 'post_parent__in' => array ('2', '4'));
Du kan också utesluta barnsides från din fråga, med hjälp av post_parent__not_in
parameter:
$ args = array ('post_type' => 'sida', 'post_parent__not_in' => array ('2', '4'));
Det är också vanligt att köra en fråga för att antingen inkludera eller utesluta flera inlägg. Du har två argument du kan använda för detta:
post__in
(array): Använd post-ID.post__not_in
(array): Använd post-ID.De post__in
Argument kan användas för alla posttyper och tar en rad ID-nummer. Så att du ska skriva ut en lista med specifika inlägg använder du det här:
$ args = array ('post__in' => array ('36 ',' 52 ',' 246 ',' 354 '));
Obs! Om du använder det här argumentet för att hämta inlägg kommer WordPress fortfarande hämta kladdiga inlägg, även om de inte finns i din lista. För att utelämna dem använder du ignore_sticky_posts
argument:
$ args = array ('post__in' => array ('36 ',' 52 ',' 246 ',' 354 '),' ignore_sticky_posts '=>' true ');
De post__not_in
Argument fungerar på ett liknande sätt, och tar igen en rad post-ID, men det kommer att mata ut allt annat än de angivna tjänsterna. Du skulle normalt kombinera den med andra argument för att undvika att utge en stor lista med inlägg.
Så att fråga för alla inlägg i produkt
post typ men utesluta några:
$ args = array ('post_type' => 'product', 'post__not_in' => array ('36 ',' 52 ',' 246 ',' 354 '));
Så för att kombinera detta med ett av våra tidigare exempel, så här kan du fråga för alla högsta sidor utom den nuvarande:
$ current_page_ids = array (get_the_ID ()); $ args = array ('post_parent' => '0', 'post__not_in' => $ current_page_ids);
Observera att om du har registrerat en hierarkisk posttyp måste du inkludera post_type
parameter i den här koden för att bara fråga efter sidor.
I några av exemplen ovan har jag använt post_type
parameter för att identifiera inlägg av en viss typ. Låt oss ta en titt på de argument som du kan använda med den här parametern:
posta
: Ett inlägg.sida
: En sida.revision
: En revision.bilaga
: En bilaga.nav_menu_item
: Ett navigeringsmenyobjekt.några
: Hämtar alla typer utom revisioner och typer med 'Exclude_from_search'
satt till Sann
när de var registrerade.produkt
).Som vi har sett ovan kan du använda den här parametern med andra argument för att göra din fråga mer specifik.
Så för att ge ett enkelt exempel, så här kan du fråga för alla sidor på din webbplats:
$ args = array ('post_type' => 'sida');
Fråga efter en anpassad posttyp är enkel: använd det namn du gav posttypen när du registrerade det, inte titeln som används i adminmenyerna. Så låt oss säga att du registrerade dina produktposttyper med register_post_type ()
som följer:
funktion register_product () $ args = array ('name' => __ ('Produkter', 'tutsplus'), 'singular_name' => __ ('Produkt', 'tutsplus')); register_post_type ('produkt', $ args);
Värdet du använder för post_type
argument när du frågar efter produkter är det inte 'Produkt'
eller 'Produkter'
men 'produkt'
:
$ args = array ('post_type' => 'produkt');
Som standard om du försöker köra en fråga för bilagor fungerar det inte, eftersom WordPress sätter in post_status
av bilagor till ärva
och WP_Query
som standard till 'post_status' => 'publicera'
om du inte anger något annat. Så om du vill fråga för bilagor du måste inkludera post_status
argument:
$ args = array ('post_type' => 'attachment', 'post_status' => 'ärva');
Observera att du också kan använda några
istället för ärva
.
Använder sig av WP_Query
Att skapa egna frågor för inlägg och posttyper är något jag gör mycket. Som du har sett från exemplen här finns det många möjligheter:
Det finns många fler möjligheter med argumenten som omfattas här, men det borde ge dig en smak.