WP_Query Arguments Inlägg, Sidor och Posttyper

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.

Ett sammanfattning om hur argument fungerar i WP_Query

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:

  • Argumenten för frågan, med parametrar som kommer att omfattas av denna handledning
  • själva frågan
  • loopen
  • avslutas: stänger om och under taggar och återställer postdata

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.

Kodning av dina argument

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.

Fråga efter enskilda inlägg eller sidor

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.

Fråga efter en post

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.

Fråga efter en sida

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');

Fråga efter ett inlägg av en annan typ

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');

Fråga efter barnsidor

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'));

Fråga efter flera inlägg

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.

Fråga efter inläggstyper

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.
  • Anpassade posttyper (t.ex.. 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');

Anpassade inläggstyper

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');

bilagor

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.

Sammanfattning

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:

  • Använd den för att fråga efter högsta sidor på din webbplats.
  • Använd den för att fråga efter inlägg av en viss posttyp.
  • Använd den för att fråga efter alla inlägg utom de du anger.
  • Använd den för att fråga alla barn på den aktuella sidan.

Det finns många fler möjligheter med argumenten som omfattas här, men det borde ge dig en smak.