WP_Query-argumenten berichten, pagina's en berichttypen

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.

Een samenvatting van hoe argumenten werken in WP_Query

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:

  • de argumenten voor de query, met behulp van parameters die in deze zelfstudie worden behandeld
  • de vraag zelf
  • de lus
  • afwerken: het sluiten van en wanneer tags en het resetten van berichtgegevens

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.

Codering van uw argumenten

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.

Querying voor enkele berichten of pagina's

Laten we beginnen met het eenvoudigste scenario: een query uitvoeren om een ​​specifieke post of pagina te vinden.

Querying for One Post

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.

Querying for One Page

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

Querying for One Post of Another Type

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

Query's voor onderliggende pagina's

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

Querying voor meerdere berichten

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.

Zoeken naar berichttypen

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.
  • Aangepaste berichttypen (bijv. 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');

Aangepaste berichttypes

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

Bijlagen

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.

Samenvatting

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:

  • Gebruik het om te zoeken naar pagina's op het hoogste niveau van uw site.
  • Gebruik het om naar berichten van een specifiek berichttype te zoeken.
  • Gebruik het om te zoeken naar alle berichten, behalve degene die u opgeeft.
  • Gebruik het om naar alle kinderen van de huidige pagina te zoeken.

Er zijn veel meer mogelijkheden met behulp van de argumenten die hier worden behandeld, maar dit zou u een voorproefje moeten geven.