WP_Query Argumenter Innlegg, Sider og Posttyper

I denne delen av denne serien på WP_Query, Du lærer å bruke WP_Query å spørre etter innlegg, sider og egendefinerte innleggstyper. Du kan søke etter bestemte innlegg og sider, eller du kan kjøre en forespørsel for å returnere innlegg fra en eller flere posttyper.

Et sammendrag om hvordan argumenter fungerer i WP_Query

Før vi starter, la oss få en rask omtale på hvordan argumenter fungerer WP_Query. Når du kodes WP_Query i dine temaer eller plugins må du inkludere fire hovedelementer:

  • Argumentene for spørringen, ved hjelp av parametere som vil bli dekket i denne opplæringen
  • selve spørringen
  • løkken
  • Etterbehandling: lukking hvis og mens koder og tilbakestilling av postdata

I praksis vil dette se ut som følgende:

have_posts ()) // Start looping over spørringsresultatene. mens ($ query-> have_posts ()) $ query-> the_post (); // Innholdet i de forespurte postresultatene går her.  // Gjenopprett originale innleggsdata. wp_reset_postdata (); ?>

Argumentene er hva som forteller WordPress hvilke data som skal hentes fra databasen, og det er de som jeg vil dekke her. Så alt vi fokuserer på her er den første delen av koden:

$ args = array (// Argumenter for søket ditt.);

Som du kan se, er argumentene inneholdt i en matrise. Du lærer hvordan du kodes dem mens du arbeider gjennom denne opplæringen.

Koding av dine argumenter

Det er en bestemt måte å kode på argumentene i arrayet, som er som følger:

$ args = array ('parameter1' => 'verdi', 'parameter2' => 'verdi', 'parameter3' => 'verdi');

Du må legge inn parametrene og deres verdier i enkelt anførselstegn, bruk => mellom dem, og skill dem med et komma. Hvis du får feil, kan WordPress ikke legge til alle dine argumenter på spørringen, eller du kan få en hvit skjerm.

Spør etter enkelt innlegg eller sider

La oss starte med det enkleste scenariet: Kjør en spørring for å finne et bestemt innlegg eller en side.

Spør etter ett innlegg

For å finne et bestemt innlegg (eller sett med innlegg), har du to alternativer:

  • p (int): Bruk post-ID.
  • Navn (string): Bruk innleggslister.

Du kan bruke disse parameterne med en hvilken som helst innleggstype, inkludert innlegg, sider, vedlegg og egendefinerte innleggstyper. Som standard vil WordPress spørre etter 'post' posttype og ikke returnere sider eller egendefinerte innleggstyper. Hvis du vil gjøre dette, må du legge til flere argumenter eller bruke et annet argument, som jeg kommer til senere i denne opplæringen.

Så, for å returnere et bestemt innlegg, vil du bruke en av disse:

$ args = array ('p' => '32');

eller:

$ args = array ('name' => 'post_slug');

Legg merke til at Navn parameteren tar innleggslisten som argument, ikke sin tittel.

Bruker Navn parameteren gjør det enklere å identifisere hva søket ditt henter fra databasen når du besøker koden din senere, men det er fare for at det ikke vil fungere hvis et av nettstedets brukere endrer postsluggen. Post-ID kan ikke endres, så dette er tryggere.

Spør etter en side

For å søke etter en bestemt side har du to alternativer igjen:

  • PAGE_ID (int): Bruk siden ID.
  • sidenavn (string): Bruk sideskjerm.

Så, for å kjøre en forespørsel som henter bare en bestemt side fra databasen, kan du bruke en av disse:

$ args = array ('page_id' => '20');

eller:

$ args = array ('pagename' => 'page_slug');

Spør etter ett innlegg av en annen type

For å kjøre en forespørsel for et innlegg av en annen innleggstype, inkludert en egendefinert innleggstype, vil du også bruke post_type parameter. Jeg vil dekke dette i litt mer detaljert senere i denne opplæringen, men kort sagt, for å spørre om et enkelt innlegg i produkt egendefinert innleggstype, bruker du dette:

$ args = array ('p' => '46', 'post_type' => 'produkt');

Eller for å spørre om et vedlegg, vil du bruke:

$ args = array ('p' => '46', 'post_type' => 'vedlegg');

Spør etter barnesider

Noen ganger må du kanskje hente alle sider som er barn på en gitt side, for eksempel hvis nettstedet ditt har en hierarkisk sidestruktur, og du vil vise en liste på hver side av sidens barn.

Merk: Du vil ikke gjøre dette med innlegg som de ikke er hierarkiske, selv om du kan med en egendefinert innleggstype hvis den er hierarkisk.

Du har tre argumenter du kan bruke til å gjøre dette:

  • post_parent (int): Bruk siden ID til å returnere bare barnesider. Angi til 0 for å returnere kun toppnivåoppføringer.
  • post_parent__in (matrise): Bruk en rekke post-IDer.
  • post_parent__not_in (matrise): Bruk en rekke post-IDer.

La oss ta en titt på hver av dem.

Den første, post_parent, Lar deg spørre om sider som er barn på en bestemt side. 

For å finne alle sidene som er barn på en gitt side, bruker du dette:

$ args = array ('post_type' => 'side', 'post_parent' => '2');

Legg merke til at du må inkludere post_type argument som standard posttype som WP_Query ser etter er post.

Med dette videre, så kan du bruke den til å finne barn på den nåværende siden:

$ current_page_id = get_the_ID (); $ args = array ('post_type' => 'side', 'post_parent' => $ current_page_id);

Du kan også bruke denne parameteren til å identifisere toppnivå sider, dvs. de uten foreldre:

$ args = array ('post_type' => 'side', 'post_parent' => '0');

Men hva om du vil identifisere barn på flere sider? Du kan også gjøre dette med post_parent__in parameter. Dette tar en rekke post-IDer.

Så for å spørre om barna til to av sidene dine, bruker du dette:

$ args = array ('post_type' => 'side', 'post_parent__in' => array ('2', '4'));

Du kan også ekskludere barnesider fra søket ditt, ved hjelp av post_parent__not_in parameter:

$ args = array ('post_type' => 'side', 'post_parent__not_in' => array ('2', '4'));

Spør etter flere innlegg

Det er også vanlig å kjøre en spørring for å inkludere eller ekskludere flere innlegg. Du har to argumenter du kan bruke til dette:

  • post__in (matrise): Bruk post-IDer.
  • post__not_in (matrise): Bruk post-IDer.

De post__in argument kan brukes til alle posttyper og tar en rekke IDer. For å sende ut en liste over bestemte innlegg, vil du bruke dette:

$ args = array ('post__in' => array ('36 ',' 52 ',' 246 ',' 354 '));

Merk: Hvis du bruker dette argumentet for å hente innlegg, vil WordPress fortsatt hente klissete innlegg, selv om de ikke er i listen. For å utelate dem, bruker du ignore_sticky_posts argument:

$ args = array ('post__in' => array ('36', '52', '246', '354'), 'ignore_sticky_posts' => 'true');

De post__not_in argument fungerer på en lignende måte, igjen tar en rekke post-IDer, men det vil utgjøre alt annet enn de innleggene som er oppført. Du vil normalt kombinere det med andre argumenter for å unngå å skrive ut en stor liste med innlegg.

Så å spørre for alle innlegg fra produkt posttype, men unntatt noen få:

$ args = array ('post_type' => 'produkt', 'post__not_in' => array ('36', '52', '246', '354'));

Så for å kombinere dette med et av våre tidligere eksempler, her er hvordan du vil søke på alle toppnivå sider bortsett fra den nåværende:

$ current_page_ids = array (get_the_ID ()); $ args = array ('post_parent' => '0', 'post__not_in' => $ current_page_ids);

Merk at hvis du også har registrert en hierarkisk posttype, må du inkludere post_type parameter i denne koden for å bare søke etter sider.

Spør etter posttyper

I noen av eksemplene ovenfor har jeg brukt post_type parameter for å identifisere innlegg av en bestemt type. La oss ta en titt på argumentene du kan bruke med parameteren:

  • post: En stolpe.
  • side: En side.
  • revisjon: En revisjon.
  • feste: Et vedlegg.
  • nav_menu_item: Et navigasjonsmenyelement.
  • noen: Henter hvilken som helst type unntatt revisjoner og typer med 'Exclude_from_search' satt til ekte da de var registrert.
  • Egendefinerte innleggstyper (f.eks. produkt).

Som vi har sett ovenfor kan du bruke denne parameteren med andre argumenter for å gjøre søket mer spesifikt.

Så for å gi et enkelt eksempel, kan du spørre etter alle sidens sider:

$ args = array ('post_type' => 'side');

Egendefinerte innleggstyper

Spør etter en egendefinert innleggstype er enkel: Bruk navnet du ga posttypen når du registrerte det, ikke tittelen som brukes i administrasjonsmenyene. Så la oss si at du registrerte dine produktposttyper med register_post_type () som følger:

funksjon register_product () $ args = array ('name' => __ ('Produkter', 'tutsplus'), 'singular_name' => __ ('Produkt', 'tutsplus')); register_post_type ('produkt', $ args); 

Verdien du bruker til post_type argument når forespørsel om produkter ikke er 'Produkt' eller 'Produkter' men 'produkt':

$ args = array ('post_type' => 'produkt');

vedlegg

Som standard hvis du prøver å kjøre et søk for vedlegg, vil det ikke fungere, som WordPress setter inn post_status vedlegg til arve og WP_Query standard til 'post_status' => 'publiser' med mindre du angir noe annet. Så hvis du vil spørre om vedlegg du inkludere post_status argument:

$ args = array ('post_type' => 'vedlegg', 'post_status' => 'arve');

Merk at du også kan bruke noen i stedet for arve.

Sammendrag

Ved hjelp av WP_Query å lage tilpassede spørringer for innlegg og innleggstyper er noe jeg gjør mye. Som du har sett fra eksemplene her, er det mange muligheter:

  • Bruk den til å søke på toppnivå sider på nettstedet ditt.
  • Bruk den til å søke etter innlegg av en bestemt posttype.
  • Bruk den til å søke etter alle innlegg, unntatt de du angir.
  • Bruk den til å spørre for alle barnene på gjeldende side.

Det er mange flere muligheter ved å bruke argumentene som er dekket her, men dette bør gi deg en smak.