WP_Query-argumenten status, volgorde en paginering

In dit deel van de serie over Mastering WP_Query, u zult enkele van de argumenten leren kennen die u met de kunt gebruiken WP_Query klasse, namelijk die voor:

  • staat
  • bestellen
  • paginering

U kunt deze argumenten gebruiken om geplande berichten uit de database op te halen, bijlagen op te vragen, de manier waarop berichten worden geordend en waarvoor ze zijn geordend aan te passen, om te specificeren hoeveel berichten worden weergegeven en nog veel meer

Maar voordat je dit kunt doen, moet je begrijpen hoe argumenten werken WP_Query.

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.

Statusparameters

Zoals je zult weten als je de status van een bericht ooit hebt geconverteerd van Concept naar Gepubliceerd of misschien in de prullenbak hebt geplaatst, wijst WordPress een status toe aan elk bericht. U kunt de post_status parameter om te zoeken naar berichten met een of meer statussen.

De beschikbare argumenten zijn:

  • publiceren: Een gepubliceerd bericht of pagina.
  • in afwachting: Bericht wacht op beoordeling.
  • droogte: Een bericht in de conceptstatus.
  • auto-ontwerp: Een nieuw bericht zonder inhoud.
  • toekomst: Een bericht om in de toekomst te publiceren.
  • privaat: Niet zichtbaar voor gebruikers die niet zijn aangemeld.
  • erven: Een herziening.
  • uitschot: Bericht staat in prullenbak.
  • ieder: Haalt elke status op, behalve die van poststatussen met 'Exclude_from_search' ingesteld op true (d.w.z.. uitschot en auto-ontwerp).

Als u geen status opgeeft in uw queryargumenten, wordt WordPress standaard ingesteld op publiceren; als de huidige gebruiker is aangemeld, bevat deze ook berichten met de status privaat. Als u een query uitvoert op de beheerpagina's, bevat WordPress ook de beschermde statussen toekomstdroogte en in afwachting standaard.

Stel dat u een evenementenwebsite uitvoert en dat u een aangepast berichttype gebruikt, waarbij de publicatiedatum wordt gebruikt als de datum waarop het evenement plaatsvindt. WordPress geeft standaard geen gebeurtenissen weer die nog niet zijn gebeurd: hoewel je ze hebt gepland, is hun geplande datum in de toekomst dus hun berichtstatus is toekomstig.

Om dit te omzeilen gebruikt u eenvoudig deze argumenten:

$ args = array ('post_type' => 'event', 'post_status' => 'toekomst');

Hiermee worden alleen die gebeurtenissen weergegeven die nog niet zijn gebeurd, omdat deze de publiceren -status. Maar als u ook gebeurtenissen wilt weergeven die zijn gebeurd, kunt u een reeks poststatussen gebruiken om er meer dan één te maken:

$ args = array ('post_type' => 'event', 'post_status' => array ('toekomst', 'publiceren'));

De post_status parameter is essentieel wanneer u naar bijlagen vraagt. Dit komt omdat ze de status hebben van erven, niet publiceren. Dus om op alle bijlagen te zoeken, zou je dit gebruiken:

$ args = array ('post_type' => 'bijlage', 'post_status' => 'overnemen');

Als alternatief zou je kunnen vervangen erven met ieder wat hetzelfde effect zou hebben.

Parameters bestellen

Er zijn twee parameters die u gebruikt om berichten te bestellen die zijn opgehaald door WP_Query: bestellen en orderby. Zoals je zou verwachten, bestellen definieert de volgorde waarin berichten in de lus worden uitgevoerd, en orderby definieert welk veld in de database ze worden gesorteerd.

Laten we beginnen door naar de argumenten voor te kijken bestellen.

De volgorde Parameter

Er zijn slechts twee argumenten die u hiervoor kunt gebruiken:

  • ASC: oplopende volgorde van laagste tot hoogste waarden (1, 2, 3; a, b, c).
  • DESC: aflopende volgorde van hoogste naar laagste waarden (3, 2, 1; c, b, a).

Deze zijn redelijk vanzelfsprekend. Als u geen argument opneemt voor bestellen, WordPress zal standaard naar DESC.

De volgorde door Parameter

U kunt uw berichten sorteren op een reeks velden:

  • geen: Geen bestelling (beschikbaar met versie 2.8).
  • ID kaart: Bestel per post-ID. Let op het hoofdlettergebruik.
  • schrijver: Bestelling door auteur.
  • titel: Bestel op titel.
  • naam: Bestel per postslak.
  • type: Bestel per posttype.
  • datum: Volgorde op datum.
  • gemodificeerde: Sorteer op laatste wijzigingsdatum.
  • ouder: Order per post / pagina bovenliggende id.
  • rand: Willekeurige volgorde.
  • COMMENT_COUNT: Volgorde op aantal opmerkingen.
  • menu_order: Volgorde op paginavolgorde. Meestal gebruikt voor Pages (met behulp van de waarde die u aan de metabox toevoegt in het scherm Pagina bewerken) en voor bijlagen (met behulp van de velden voor geheel getal in het dialoogvenster Media-album invoegen / uploaden), maar die kan worden gebruikt voor elk berichttype met menu_order ingeschakeld.
  • meta_value: Sorteer op de waarde voor een metatoets (of aangepast veld). Dit werkt alleen als u ook een meta_key parameter in uw argumenten. Metawaarden worden alfabetisch en niet numeriek gesorteerd (dus 34 komen bijvoorbeeld vóór 4). 
  • meta_value_num: Order op numerieke metawaarde. Zoals met meta_value, je moet ook een meta_key argument in uw vraag.
  • posten in: Bewaar de post ID-volgorde in de posten in rangschikking.

De standaard is datum, dat wil zeggen de datum waarop een bericht is gepubliceerd.

Dus als u bijvoorbeeld uw berichten wilt sorteren op titel in oplopende volgorde, gebruikt u deze argumenten:

$ args = array ('orderby' => 'title', 'order' => 'ASC');

Bestellen op meerdere velden

U hoeft niet bij slechts één veld te blijven om uw berichten te sorteren. Als u op meerdere velden wilt sorteren, gebruikt u een array met de orderby parameter en (optioneel) met de bestellen parameter als u elk veld in een andere volgorde wilt sorteren.

Stel dat u een veld voor beoordelingen op maat heeft dat u wilt gebruiken om te sorteren op een e-commercesite. U kunt sorteren op rating en vervolgens op titel, beide in oplopende volgorde, op deze manier:

$ args = array ('orderby' => array ('meta_value_num', 'title'), 'order' => 'ASC', 'meta_key' => 'rating');

Merk op dat ik de meta_key argument om WordPress te laten weten welk aangepast veld ik gebruik. U doet dit vanwege de manier waarop WordPress-winkels metadata plaatsen: niet in de wp_posts tafel, maar in de wp_postmeta tafel.

Maar wat als je wilde bestellen door te beoordelen in aflopende volgorde en vervolgens de titel in oplopende volgorde? U gebruikt gewoon een andere array:

$ args = array ('orderby' => array ('meta_value_num', 'title'), 'order' => array ('DESC', 'ASC'), 'meta_key' => 'rating');

U kunt ook op meerdere velden sorteren als u geen metagegevens voor berichten gebruikt, bijvoorbeeld om te sorteren op berichttype en vervolgens op datum:

$ args = array ('orderby' => array ('type', 'date'), 'order' => array ('ASC', 'DESC'));

Dit zou sorteren op posttype in oplopende volgorde en vervolgens binnen elk berichttype op datum in aflopende volgorde.

Parameters voor paginering

De volgende reeks parameters waar we naar toe gaan, is voor paginering. Hiermee kunt u bepalen hoeveel berichten worden opgevraagd en hoe paginering werkt wanneer ze worden uitgevoerd.

De beschikbare parameters zijn:

  • nopaging (boolean): Alle berichten weergeven of paginering gebruiken. De standaard is 'False', d.w.z. gebruik paginering.
  • posts_per_page (int): Aantal berichten dat per pagina wordt weergegeven.
  • posts_per_archive_page (int): Aantal berichten dat alleen per pagina-op archiefpagina's wordt weergegeven.
  • compenseren (int): Aantal berichten aan verplaatsen of passeren.
  • wisselbare (int): De pagina in het archief waaruit berichten worden getoond.
  • pagina (int): Aantal pagina's voor een statische voorpagina. Toon de berichten die normaal alleen op pagina X van een statische voorpagina worden weergegeven.
  • ignore_sticky_posts (boolean): Negeer post stickiness-default op vals.

Laten we een paar voorbeelden bekijken. 

Aantal berichten en compenserende berichten

Om bijvoorbeeld de vijf meest recente berichten weer te geven:

$ args = array ('posts_per_page' => '5');

Of om vijf recente berichten weer te geven, met uitzondering van de meest recente:

$ args = array ('posts_per_page' => '5', 'offset' => '1');

Merk op dat hoewel je berichten van de meest recente zes berichten in de database ophaalt, je nog steeds gebruikt 'posts_per_page' => '5' omdat dat het aantal berichten is dat wordt uitgevoerd.

Als u dit een beetje verder neemt, kunt u twee query's schrijven: een om de meest recente post weer te geven en een seconde om nog tien berichten weer te geven met uitzondering van die post:

$ args = array ('posts_per_page' => '1'); // Query en loop gaan hier en bepalen ook berichten. $ args = array ('posts_per_page' => '10', 'offset' => '1'); // Tweede query, lus en opnieuw instellen, ga hier naartoe.

Je kan ook gebruiken posts_per_page weergeven allemaal berichten:

$ args = array ('posts_per_page' => '-1');

Sticky Posts

Normaal gesproken verschijnen uw zelfklevende berichten als eerste in een zoekopdracht: als u dit wilt overschrijven, gebruikt u ignore_sticky_posts:

$ args = array ('posts_per_page' => '5', 'ignore_sticky_posts' => true);

De bovenstaande argumenten retourneren de meest recente vijf berichten, ongeacht of ze kleverig zijn of niet.

Merk op dat als u alleen maar plaknotities wilt weergeven, u de get_option () functie en de posten in argument als volgt:

$ sticky = get_option ('sticky_posts'); $ args = array ('posts_per_page' => '5', 'post__in' => $ sticky);

Het bovenstaande zou de laatste vijf plaknotities weergeven: als er minder dan vijf (bijvoorbeeld drie) plakkerige berichten zijn, worden er geen niet-plakkerige berichten weergegeven, maar alleen de meest recente drie plaknotities.

Paginering in archieven

Naast het definiëren van hoeveel berichten worden opgehaald uit de database, kunt u ook paginatieparameters gebruiken om te definiëren hoe de resulterende berichten worden gepagineerd op archief- en zoekpagina's..

Dus bijvoorbeeld op een archiefpagina zou je deze code kunnen gebruiken om 20 berichten per pagina in het archief weer te geven:

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

Merk op posts_per_archive_page argument zal overschrijven posts_per_page.

U kunt er ook voor kiezen alleen de pagina's uit te voeren die op een bepaalde pagina op pagina's met pagina's zouden verschijnen. Als u bijvoorbeeld de 20 berichten wilt weergeven die op de derde pagina in het bovenstaande voorbeeld zouden verschijnen, zou u dit gebruiken:

$ args = array ('posts_per_archive_page' => '20', 'paged' => '3');

Een alternatieve manier om dezelfde berichten te doorzoeken zou zijn om de compenseren argument:

$ args = array ('posts_per_page' => '20', 'offset' => '40');

Hiermee worden de eerste 40 berichten overgeslagen (die zich op de eerste twee archiefpagina's bevinden) en worden de volgende 20 berichten opgehaald (die zich op de derde archiefpagina bevinden.) Een van de dingen die ik zo leuk vind aan WordPress, is hoe vaak je meer dan een manier om iets te bereiken!

U kunt de paginering ook helemaal uitschakelen om ervoor te zorgen dat alle berichten op dezelfde pagina worden weergegeven:

$ args = array ('nopaging' => true);

Samenvatting

De WP_Query klas geeft je voldoende flexibiliteit als het gaat om het bepalen van het aantal berichten dat je wilt bevragen, in welke volgorde je ze wilt weergeven en naar welke status je wilt posten.

Sommige van deze argumenten zijn essentieel voor het bevragen van bepaalde soorten berichten (bijvoorbeeld 'post_status' => 'geërfd' voor bijlagen), terwijl anderen u eenvoudig meer controle geven over de manier waarop uw zoekopdrachten worden uitgevoerd.

Met behulp van deze parameters kunt u aangepaste query's maken die veel meer doen dan alleen de meest recent gepubliceerde berichten uitvoeren.