Sådan henter du ethvert indlæg, du ønsker med WP_Query

Hvis du har bygget enkle temaer i fortiden, er chancerne for, at behovet for at hente indlæg på egen hånd ikke opstået. Når alt kommer til alt indlæser WordPress de seneste 10 indlæg på hovedsiden og de rigtige poster på arkivsider. Hvad med mere komplekse scenarier? Hvad nu, hvis du gerne vil have et sortimentskort, og du ønsker at liste alle dine indlæg og sider sorteret efter dato?


WP_Query er din ven, det giver dig mulighed for at trække indlæg fra databasen i henhold til dine kriterier. Du kan hente alle indlæg fra en enkelt kategori, der også indeholder bestemte tags. Du kan hente alle sider oprettet sidste år og indlæg, der ikke har et fremhævet billede.

I dette indlæg vil jeg give dig et dybtgående kig på, hvordan WP_Query fungerer – lad os komme i gang!

En brugerdefineret sløjfe

Nøglen til at arbejde godt med brugerdefinerede forespørgsler er at mestre de argumenter, du kan give dem. Før vi ser på dette, lad os oprette en hurtig "skelet" vi kan bruge til at liste stillinger. Løkken på en almindelig arkivside ser sådan ud:

<?php if (have_posts ()): ?>
<?php while (have_posts ()): the_post () ?>

<?php i mellemtiden ?>
<?php andet: ?>

<?php endif ?>

Dette fungerer helt fint, for inden siden er indlæst, har WordPress allerede hentet de korrekte poster. Når vi skriver en brugerdefineret forespørgsel, har vi brug for en tilpasset løkke. Koden er meget ens, her går:

<?php
$ args = matrix (
‘post_type’ => ‘stolpe’,
‘post_status’ => ‘fremtid’
);
$ planlagt = nyt WP_Query ($ args);

if ($ planlagt->have_posts ()):
?>
<?php while ($ planlagt->have_posts ()): $ planlagt->Posten() ?>

<?php i mellemtiden ?>
<?php andet: ?>

<?php endif ?>

Vi opretter en ny WordPress-forespørgsel ved hjælp af klassen WP_Query, og sender det parametre til at specificere de typer stillinger, vi har brug for. Vi kalder derefter have_posts () og the_post () metoderne på vores $ planlagte objekt.

Hvis du er ny med objektorienteret programmering og ikke rigtig forstår hvorfor, så rol ikke, kan du stadig nemt bruge tilpassede forespørgsler. Vi fokuserer på $ args-matrixen i hele indlægget, hvilket vil være ret ligetil.

Enkle argumenter

Som jeg nævnte, det vigtigste "viden" når det kommer til WP_Query ligger dens argumenter. Det Codex viser dem alle, vi ser på de mest nyttige her.

Nogle argumenter er temmelig enkle, såsom tagget eller tag_id-parameteren. Førstnævnte tager et mærkesnegl, jo senere et mærke-id. Du kan også adskille flere emner med komma eller bruge negative id’er for at indikere, at du vil hente indlæg, der gør ikke har det særlige tag vedhæftet.

$ args = matrix (
‘post_type’ => ‘stolpe’,
‘tag_id’ => ’22, 92,44, -21′
);
$ our_posts = nyt WP_Query ($ args);

Uddraget henter artikler, der har nogen af ​​de første tre tags knyttet til dem, men ikke det fjerde. Selvom dette system er kraftfuldt nok til enkle behov, bruger jeg normalt den langt mere fleksible forespørgsel om taksonomi, som jeg vil diskutere lidt senere.

Forfatteren, forfatternavnet, katten, kategorienavnet, s (til søgeudtryk), post_status, post_type er eksempler på nogle mere enkle felter. Bemærk, at nogle felter, som post_status, kræver, at du passerer en række statusstatus, hvis du vil bruge flere værdier.

$ args = matrix (
‘post_type’ => array (‘post’, ‘side’),
‘post_status’ => array (‘draft’, ‘publish’),
‘kat’ => ‘musik, videoer’
);
$ our_posts = nyt WP_Query ($ args);

Eksemplet ovenfor henter alle indlæg, der er enten sider, indlæg; er enten offentliggjort eller i udkaststatus og har enten kategorien musik eller videoer tildelt. Dette kan bruges til at vise titlerne på ethvert aktuelt eller planlagt indhold relateret til musik eller videoer.

Taxonomi Forespørgsler

For enkle ting er det nok at bruge de nævnte argumenter til at hente indlæg baseret på kategorier eller tags, men hvad nu hvis du har en brugerdefineret taksonomi, eller du skal kombinere flere parametre? Svaret ligger i tax_query-argumentet, der i sig selv er en matrix. Lad os først se på et eksempel.

$ args = matrix (
‘post_type’ => ‘Bestil’,
‘tax_query’ => array (
array (
‘taksonomi’ => ‘Genre’,
‘felt’ => ‘Slug’,
‘udtryk’ => array (‘scifi’, ‘thriller’),
‘operator’ => ‘IKKE I’,
),
array (
‘taksonomi’ => ‘forfatter’,
‘felt’ => ‘Id’,
‘udtryk’ => matrix (92, 883, 399),
),
‘relation’ => ‘OG’,
),
);
$ forespørgsel = nyt WP_Query ($ args);

Her henter vi nogle indlæg fra vores “bog” -posttype og tilføjer nogle taxonomiparametre. Ved hjælp af to arrays defineret i tax_query har vi specificeret, at vi ønsker at trække bøger skrevet af forfatterens 92, 883 eller 399, som er ikke i sci-fi- eller thrillergenren. Relationsparameteren definerer forholdet mellem de to arrays. I vores tilfælde er det et ‘og’ forhold, hvilket betyder, at begge betingelser skal være opfyldt.

Hvis vi brugte ‘eller’, ville vi have hentet bøger, som enten ikke er i sci-fi- eller thriller-kategorien, eller de er skrevet af de angivne tre forfattere. På almindeligt engelsk betyder det: Jeg vil se alle mine bøger undtagen sci-fi og thrillergenren. Jeg vil dog gerne se alle bøger fra Terry Pratchett, Douglas Adams og Stephen King, uanset genre.

Metaforespørgsler

Metaforespørgsler ligner meget taksonomispørgsmål i struktur, men de bruger data fra metatabellen efter indlæg til at filtrere indlæg. Koden herunder viser alle offentliggjorte poster, der har et vist billede.

$ args = matrix (
‘post_type’ => ‘stolpe’,
‘meta_query’ => array (
array (
‘nøgle’ ​​=> ‘_Thumbnail_id’,
‘værdi’ => ”,
‘sammenligne’ => ‘! =’,
),
),
);
$ forespørgsel = nyt WP_Query ($ args);

WordPress gemmer ID’et for det fremhævede billede for et indlæg ved hjælp af feltet _ thumbnail_id. Så hvis vi henter alle indlæg, hvor denne metaværdi ikke er tom, skal vi ende med alle indlæg, der har et fremhævet billede.

Hemmeligheden her er at vide, hvordan man kan sammenligne egenskab og type. Du kan bruge et væld af værdier, der skal være kendt fra SQL: ‘=’, ‘! =’, ‘>’,’>= ‘,'<‘,‘<= ‘,’ LIKE ‘,’ NOT LIKE ‘,’ IN ‘,’ NOT IN ‘,’ MELLEM ‘,’ NOT MELLEM ‘,’ EXISTS ‘(fra WordPress 3.5 og nyere) og’ NOT EXISTS ‘(fra WordPress 3.5 og op)

Typeegenskapen er normalt vigtig, når du vil sammenligne tal eller datoer. Mulige værdier er ‘NUMERIC’, ‘BINARY’, ‘CHAR’, ‘DATE’, ‘DATETIME’, ‘DECIMAL’, ‘SIGNED’, ‘TIME’, ‘UNSIGNED’. Husk at bruge NUMERIC, når du sammenligner tal. I de fleste andre tilfælde skal du have det godt.

Ligesom med taxonomispørgsmål kan du stakke flere krav og derefter bruge relationparameter til at specificere forholdet mellem dem.

$ args = matrix (
‘post_type’ => ‘stolpe’,
‘meta_query’ => array (
‘relation’ => ‘ELLER’,
array (
‘nøgle’ ​​=> ‘humør’,
‘værdi’ => array (‘glad’, ‘fantastisk’),
‘sammenligne’ => ‘I’,
),
array (
‘nøgle’ ​​=> ‘indkomst’,
‘værdi’ => 500,
‘sammenligne’ => ‘>’,
‘type’ => ‘NUMERIC’
),
),
);
$ forespørgsel = nyt WP_Query ($ args);

Eksemplet ovenfor viser poster fra en hypotetisk dagbog, hvor der skete noget godt. Jeg følte mig enten glad eller fantastisk, eller jeg tjente mere end $ 500 den dag.

Dato Parametre

Datoer kan blive lidt komplekse, men er meget fleksible. Det WP_Query-dokumentation har masser af eksempler, hvis du har brug for mere information.

Det er ret let at hente indlæg fra et bestemt tidspunkt. Du kan bruge år, måned, w (årets uge), dag og et par andre parametre til at specificere et tidspunkt. Koden nedenfor henter alle indlæg fra marts 2013.

$ args = matrix (
‘post_type’ => ‘stolpe’,
‘år’ => 2013,
‘måned’ => 3
);
$ forespørgsel = nyt WP_Query ($ args);

Hvis du ønsker at komme ind i mere komplekse tidsintervaller, skal du bruge date_query. Dette giver dig mulighed for at specificere vilkårlige intervaller ganske let ved hjælp af et velkendt array-format. Følgende eksempel – med tilladelse af Codex – viser, hvordan du kan hente indlæg, der blev skrevet mellem 09:00 og 17:00 på hverdage.

$ args = matrix (
‘post_type’ => ‘stolpe’,
‘date_query’ => array (
array (
‘time’ => 9,
‘sammenligne’ => ‘>=’,
),
array (
‘time’ => 17,
‘sammenligne’ => ‘<=’,
),
array (
‘dayofweek’ => matrix (2, 6),
‘sammenligne’ => ‘MELLEM’,
),
),
);
$ forespørgsel = nyt WP_Query ($ args);

Bestilling af resultater

Den rækkefølge, som en liste præsenteres i, er lige så vigtig som elementerne deri. Heldigvis tilbyder WordPress os ordre_by og ordreparametre. Ordreparameteren er ret ligetil, du kan bruge ASC eller DESC til at bestille stigende eller faldende.

Parameteren order_by kan antage et antal værdier: ‘ingen’, ‘ID’, ‘forfatter’, ‘titel’, ‘navn’, ‘type’, ‘dato’, ‘ændret’, ‘forælder’, ‘rand’ , ‘comment_count’, ‘menu_order’, ‘meta_value’, ‘meta_value_num’, ‘post__in’. Bestilling efter meta_value kan være særlig nyttigt. I dette tilfælde skal du ikke glemme at specificere metodenøgelfeltet også.

$ args = matrix (
‘post_type’ => ‘maleri’,
‘meta_query’ => array (
array (
‘nøgle’ ​​=> ‘pris’,
‘værdi’ => 50000,
‘sammenligne’ => ‘>’,
‘type’ => ‘NUMERIC’
),
),
‘order_by’ => ‘Meta_value_num’,
‘meta_key’ => ‘pris’
);
$ forespørgsel = nyt WP_Query ($ args);

Dette eksempel henter malerier, der er værdsat over $ 50.000 og bestiller dem stigende efter pris. Bemærk, at da prisen er gemt som et nummer, brugte jeg meta_value_num til at bestille resultaterne, i modsætning til meta_value, der ville blive brugt til strenge.

En anden ordre, der er værd at nævne, er post__in. Dette post__in er en parameter i sig selv, det giver dig mulighed for at specificere en række post-id’er, du skal hente. Som standard bestiller WordPress indlæg efter dato, den ordre, du angav i posten__in, bevares ikke. Hvis du også bruger post__in som ordre efter værdi, vil WordPress bevare ordren.

$ args = matrix (
‘post_type’ => ‘stolpe’,
‘post__in’ => array (23, 441, 12, 322, 34, 33),
‘order_by’ => ‘Post__in’,
);
$ forespørgsel = nyt WP_Query ($ args);

Afslutter

Jeg håber, det er klart fra denne introduktion til WP_Query, at dette virkelig er en magtfuld klasse. Det giver dig mulighed for at hente indlæg ved hjælp af dine egne kriterier på en WP-standard måde. Se på dets dokumentation for mere information og nogle gode egenskaber og metoder denne klasse tilbyder til at manipulere forespørgslen og loopen.

WP_Query er en del af det, der gør WordPress til en god generel CMS – muligheden for at hente objekter fra databasen på en modulopbygget og tilpasselig måde.

Hvis du har spørgsmål, så fortæl os det i kommentarerne!

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map