In dit deel van deze serie op WP_Query
, je zult leren hoe te gebruiken WP_Query
om te vragen naar berichten, pagina's en aangepaste berichttypen. U kunt naar specifieke berichten en pagina's zoeken of u kunt een query uitvoeren om berichten van een of meer berichttypen te retourneren.
Laten we, voordat we beginnen, een korte samenvatting geven van de manier waarop argumenten werken WP_Query
. Wanneer je codeert WP_Query
in uw thema's of plug-ins moet u vier hoofdelementen opnemen:
In de praktijk zal dit er ongeveer zo uitzien:
have_posts ()) // Start het doorlopen van de queryresultaten. while ($ query-> have_posts ()) $ query-> the_post (); // Inhoud van de opgevraagde resultaten van de post ga hier naartoe. // Oorspronkelijke berichtgegevens herstellen. wp_reset_postdata (); ?>
De argumenten zijn wat WordPress vertelt welke gegevens moeten worden opgehaald uit de database en dat zijn de argumenten die ik hier zal behandelen. Dus het enige waar we ons op concentreren is het eerste deel van de code:
$ args = array (// Argumenten voor uw zoekopdracht.);
Zoals u kunt zien, zijn de argumenten in een array opgenomen. Tijdens deze tutorial leer je hoe je ze kunt coderen.
Er is een specifieke manier om de argumenten in de array te coderen, die als volgt is:
$ args = array ('parameter1' => 'waarde', 'parameter2' => 'waarde', 'parameter3' => 'waarde');
U moet de parameters en hun waarden tussen enkele aanhalingstekens plaatsen, gebruik =>
tussen hen, en scheid ze met een komma. Als u dit fout doet, voegt WordPress mogelijk niet al uw argumenten aan de query toe of krijgt u mogelijk een wit scherm.
Laten we beginnen met het eenvoudigste scenario: een query uitvoeren om een specifieke post of pagina te vinden.
Om een specifiek bericht (of reeks berichten) te vinden, hebt u twee opties:
p
(int): Post-id gebruiken.naam
(draad): Gebruik een post-slug.U kunt deze parameters gebruiken voor elk berichttype, inclusief berichten, pagina's, bijlagen en aangepaste berichttypen. WordPress vraagt standaard naar de 'post'
posttype en geen pagina's retourneren of aangepaste berichttypen. Als u dit wilt, moet u meer argumenten toevoegen of een ander argument gebruiken, dat ik later in deze zelfstudie zal vinden..
Dus, om een specifiek bericht terug te sturen, zou je een van deze gebruiken:
$ args = array ('p' => '32');
of:
$ args = array ('name' => 'post_slug');
Merk op dat de naam
parameter neemt de berichtslak als argument, niet de titel.
De ... gebruiken naam
parameter maakt het eenvoudiger om te bepalen wat uw query uit de database haalt wanneer u uw code later opnieuw bezoekt, maar het risico bestaat dat dit niet werkt als een van de gebruikers van uw site de berichtenslak wijzigt. De post-ID kan niet worden gewijzigd, dus dit is veiliger.
Om naar een specifieke pagina te zoeken, heeft u opnieuw twee opties:
page_id
(int): Gebruik de pagina-ID.paginanaam
(draad): Gebruik paginaslug.Dus, om een query uit te voeren die slechts één specifieke pagina uit de database haalt, zou u een van deze gebruiken:
$ args = array ('page_id' => '20');
of:
$ args = array ('paginanaam' => 'page_slug');
Als u een query wilt uitvoeren voor een bericht van een ander berichttype, inclusief een aangepast berichttype, gebruikt u ook het post_type
parameter. Ik zal dit later in deze tutorial in meer detail bespreken, maar in het kort, om te zoeken naar een enkele post in de artikel
aangepast berichttype, zou je dit gebruiken:
$ args = array ('p' => '46', 'post_type' => 'product');
Of om te vragen naar een bijlage, zou je gebruiken:
$ args = array ('p' => '46', 'post_type' => 'bijlage');
Soms moet u mogelijk alle pagina's ophalen die kinderen van een bepaalde pagina zijn, bijvoorbeeld als uw site een hiërarchische paginastructuur heeft en u een lijst wilt weergeven op elke pagina van de kinderen van die pagina.
Opmerking: u zou dit niet doen met berichten omdat ze niet hiërarchisch zijn, maar u kunt wel met een aangepast berichttype als het hiërarchisch is.
U hebt drie argumenten die u kunt gebruiken om dit te doen:
post_parent
(int): Gebruik pagina-ID om alleen onderliggende pagina's te retourneren. Stel in op 0 om alleen invoer op het hoogste niveau te retourneren.post_parent__in
(rangschikking): Gebruik een reeks post-ID's.post_parent__not_in
(rangschikking): Gebruik een reeks post-ID's.Laten we ze eens bekijken.
De eerste, post_parent
, laat je zoeken naar pagina's die kinderen zijn van een specifieke pagina.
Dus om alle pagina's te vinden die kinderen van een bepaalde pagina zijn, zou je dit gebruiken:
$ args = array ('post_type' => 'page', 'post_parent' => '2');
Merk op dat u de post_type
argument als het standaard berichttype dat WP_Query
zoekt naar is post
.
Dit verder te nemen, dit is hoe je het zou gebruiken om kinderen van de huidige pagina te vinden:
$ current_page_id = get_the_ID (); $ args = array ('post_type' => 'page', 'post_parent' => $ current_page_id);
U kunt deze parameter ook gebruiken om pagina's op het hoogste niveau te identificeren, dat wil zeggen die zonder een bovenliggende:
$ args = array ('post_type' => 'page', 'post_parent' => '0');
Maar wat als u kinderen van meerdere pagina's wilt identificeren? Je kunt dit ook doen met de post_parent__in
parameter. Dit vereist een reeks post-ID's.
Dus om te zoeken naar de kinderen van twee van uw pagina's, zou u dit gebruiken:
$ args = array ('post_type' => 'page', 'post_parent__in' => array ('2', '4'));
U kunt ook onderliggende pagina's van uw query uitsluiten, met behulp van de post_parent__not_in
parameter:
$ args = array ('post_type' => 'page', 'post_parent__not_in' => array ('2', '4'));
Het is ook gebruikelijk om een query uit te voeren om meerdere berichten op te nemen of uit te sluiten. Je hebt twee argumenten die je hiervoor kunt gebruiken:
posten in
(rangschikking): Post-id's gebruiken.post__not_in
(rangschikking): Post-id's gebruiken.De posten in
argument kan voor alle berichttypen worden gebruikt en neemt een reeks ID's in beslag. Dus om een lijst met specifieke berichten uit te voeren, zou je dit gebruiken:
$ args = array ('post__in' => array ('36', '52', '246', '354'));
Opmerking: als u dit argument gebruikt om berichten te halen, zal WordPress nog steeds sticky posts ophalen, ook als ze niet in uw lijst staan. Om ze weg te laten, gebruik je de ignore_sticky_posts
argument:
$ args = array ('post__in' => array ('36', '52', '246', '354'), 'ignore_sticky_posts' => 'true');
De post__not_in
argument werkt op een vergelijkbare manier, opnieuw een reeks van post-ID's, maar het zal al het andere uitvoeren behalve de geplaatste berichten. Normaal gesproken zou je dit combineren met andere argumenten om te voorkomen dat een enorme lijst met berichten wordt weergegeven.
Dus om te zoeken naar alle berichten van de artikel
berichttype maar sluit een paar uit:
$ args = array ('post_type' => 'product', 'post__not_in' => array ('36', '52', '246', '354'));
Dus om dit te combineren met een van onze eerdere voorbeelden, hier is hoe u een vraag zou stellen voor alle pagina's op het hoogste niveau, behalve de huidige pagina's:
$ current_page_ids = array (get_the_ID ()); $ args = array ('post_parent' => '0', 'post__not_in' => $ current_page_ids);
Merk op dat als u ook een hiërarchisch berichttype hebt geregistreerd, u de post_type
parameter in deze code om alleen naar pagina's te zoeken.
In sommige van de bovenstaande voorbeelden heb ik de post_type
parameter om berichten van een bepaald type te identificeren. Laten we de argumenten bekijken die u met die parameter kunt gebruiken:
post
: Een post.pagina
: Een pagina.herziening
: Een herziening.gehechtheid
: Een bijlage.nav_menu_item
: Een item in het navigatiemenu.ieder
: Haalt elk type behalve revisies en typen op 'Exclude_from_search'
ingesteld op waar
toen ze waren geregistreerd.artikel
).Zoals we hierboven hebben gezien, kunt u deze parameter met andere argumenten gebruiken om uw zoekopdracht specifieker te maken.
Dus om een eenvoudig voorbeeld te geven, hier is hoe u een vraag zou stellen voor alle pagina's van uw site:
$ args = array ('post_type' => 'pagina');
Het opvragen van een aangepast berichttype is eenvoudig: gebruik de naam die u het berichttype hebt gegeven toen u het registreerde, niet de titel die wordt gebruikt in de beheerdersmenu's. Dus laten we zeggen dat u uw productberichttypen hebt geregistreerd met register_post_type ()
als volgt:
function register_product () $ args = array ('name' => __ ('Products', 'tutsplus'), 'singular_name' => __ ('Product', 'tutsplus')); register_post_type ('product', $ args);
De waarde die u gebruikt voor de post_type
argument bij het zoeken naar producten is dat niet 'Artikel'
of 'Producten'
maar 'artikel'
:
$ args = array ('post_type' => 'product');
Als u een query voor bijlagen probeert uit te voeren, werkt deze standaard niet, omdat WordPress de post_status
van bijlagen bij erven
en WP_Query
standaard ingesteld op 'post_status' => 'publiceren'
tenzij je anders aangeeft. Dus als u wilt vragen naar bijlagen u moet omvatten de post_status
argument:
$ args = array ('post_type' => 'bijlage', 'post_status' => 'overnemen');
Merk op dat je ook zou kunnen gebruiken ieder
in plaats van erven
.
Gebruik makend van WP_Query
om aangepaste queries voor posts en berichttypes te maken, doe ik veel. Zoals je hebt gezien aan de hand van de voorbeelden, zijn er tal van mogelijkheden:
Er zijn veel meer mogelijkheden met behulp van de argumenten die hier worden behandeld, maar dit zou u een voorproefje moeten geven.