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.
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:
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.
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.
La oss starte med det enkleste scenariet: Kjør en spørring for å finne et bestemt innlegg eller en side.
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.
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');
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');
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'));
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.
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.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');
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');
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 må inkludere post_status
argument:
$ args = array ('post_type' => 'vedlegg', 'post_status' => 'arve');
Merk at du også kan bruke noen
i stedet for arve
.
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:
Det er mange flere muligheter ved å bruke argumentene som er dekket her, men dette bør gi deg en smak.