Mastering WP_Query gebruik van de Loop

Zoals ik in de inleiding van deze serie heb geschetst, de WP_Query klas heeft vier hoofdelementen:

  • de argumenten voor de query, met behulp van parameters die in deze reeks gedetailleerd worden behandeld
  • de vraag zelf
  • de lus, die post-inhoud, titels of wat dan ook die u wilt weergeven, uitvoert
  • afwerken: het sluiten van en wanneer tags en het resetten van berichtgegevens

In deze tutorial laat ik je zien hoe je de loop gebruikt WP_Query, inclusief de twee belangrijkste manieren om uw lus te structureren en hoe u meerdere lussen kunt gebruiken.

Waar de lus past

Zonder een lus wordt er niets op uw pagina weergegeven. Nadat WordPress de query heeft uitgevoerd, met behulp van de argumenten die u hebt gedefinieerd, moet vervolgens worden verteld wat moet worden uitgevoerd uit de gegevens die worden opgehaald. Dit is waar de lus binnenkomt.

Dus de lus komt na uw vraag, en het gebruikt drie tags:

  • if ($ query-> have_posts ()) controleert of er berichten zijn.
  • while ($ query-> have_posts ()) herhaalt de lus voor elk bericht zolang er berichten zijn die kunnen worden opgehaald.
  • $ Query-> the_post () toegang tot die specifieke post.

Dus dit is waar de lus in past WP_Query klasse:

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 (); ?>

Na het uitvoeren van de lus, is het enige dat overblijft om te doen het opruimen met behulp van wp_reset_postdata ().

Structuur van de lus

De manier waarop uw lus is gestructureerd, is afhankelijk van welke gegevens u uit uw bericht wilt weergeven. Hier is een voorbeeld-lus die de berichttitel, de afgebeelde afbeelding en een uittreksel uitvoert. Je zou een lus als deze op een archiefpagina gebruiken.

have_posts ()) // Start het doorlopen van de queryresultaten. while ($ query-> have_posts ()) $ query-> the_post (); ?> 
> "title =""> "title ="">

Deze lus geeft precies weer wat ik hierboven heb beschreven: de afgebeelde afbeelding, titel en uittreksel.

Taking the Loop Further: Content zoeken

Maar soms wilt u misschien een kop toevoegen voor uw lijst met berichten, of wilt u ze allemaal in een element opnemen. Als u dit eenvoudig voor uw lus hebt toegevoegd, wordt het uitgevoerd ongeacht of de query daadwerkelijk gegevens heeft geretourneerd, wat betekent dat u een kop met niets eronder zou kunnen hebben, of een aantal onnodige markeringen.

Dit is heel gemakkelijk om rond te komen door het insluitende element of de kop in je te plaatsen als label:

have_posts ()) echo '
'; echo '

'. __ ('Heading', 'tutsplus'). '

'; // Start een lus over de queryresultaten. while ($ query-> have_posts ()) $ query-> the_post (); ?>
> "title =""> "title ="">
'; // Oorspronkelijke berichtgegevens herstellen. wp_reset_postdata (); ?>

Hier kunt u zien dat ik heb gecontroleerd of er berichten zijn opgehaald door mijn query en of er een element met een element is geopend en een kop is toegevoegd. 

Dit is ook handig als u de resultaten van uw query als een lijst wilt weergeven. Stel dat ik een lijst met alle berichten in een bepaalde categorie wil maken. De ul element zit niet in mijn lus omdat het geen betrekking heeft op een specifiek bericht, maar ik wil het alleen uitvoeren als er berichten zijn. Dus ik gebruik dit:

 'category-slug', 'post_type' => 'post'); // Aangepaste zoekopdracht. $ query = new WP_Query ($ args); // Controleer of we queryresultaten hebben. if ($ query-> have_posts ()) echo '
    '; // Start een lus over de queryresultaten. while ($ query-> have_posts ()) $ query-> the_post (); ?>
  • > "title ="">
  • '; // Oorspronkelijke berichtgegevens herstellen. wp_reset_postdata (); ?>

Hiermee wordt gecontroleerd of de query berichten heeft opgehaald en zo ja, wordt de ul element en voert dan de lus uit.

Extra loops uitvoeren

Het is belangrijk om je ervan bewust te zijn dat terwijl je kunt gebruiken WP_Query om meer dan één lus uit te voeren, moet u de berichtgegevens opnieuw instellen en een tweede exemplaar van WP_Query om dit te doen. Dit komt omdat elk van uw lussen gegevens uitvoert op basis van verschillende argumenten.

In dit voorbeeld worden het fragment en de afgebeelde afbeelding voor het eerste bericht weergegeven en vervolgens alleen de titel van elk volgend bericht:

 'post', 'posts_per_page' => '1'); // Eerste aangepaste zoekopdracht. $ query1 = nieuwe WP_Query ($ args1); // Controleer of we queryresultaten hebben. if ($ query1-> have_posts ()) // Start het doorlopen van de queryresultaten. while ($ query1-> have_posts ()) $ query1-> the_post (); ?> 
> "title =""> "title ="">
'1', 'post_type' => 'post'); // Tweede aangepaste zoekopdracht. $ query2 = nieuwe WP_Query ($ args2); // Controleer of we queryresultaten hebben. if ($ query2-> have_posts ()) echo '
    '; // Start een lus over de queryresultaten. while ($ query2-> have_posts ()) $ query2-> the_post (); ?>
  • > "title ="">
  • '; // Oorspronkelijke berichtgegevens herstellen. wp_reset_postdata (); ?>

Ik heb hier twee belangrijke argumenten gebruikt:

  • 'posts_per_page' => '1', gebruikt bij de eerste query, geeft alleen het meest recente bericht weer.
  • 'offset' = '1', gebruikt bij de tweede query, slaat het eerste bericht over en zorgt ervoor dat het niet wordt herhaald in de onderstaande lijst.
  • Zoals u kunt zien in de bovenstaande code, is de lus voor elke query enigszins anders. De eerste geeft de afgebeelde afbeelding, titel en uittreksel uit, terwijl de tweede controleert of de query berichten bevat en opent dan een ul element en omsluit elke titel van het bericht in a li element en een link naar zijn pagina.

Je zult ook merken dat ik het gebruikte wp_reset_postdata () na beide lussen. Als ik dit niet had gedaan, zou de tweede lus nog altijd gegevens van de eerste uitvoeren.

Samenvatting

Zonder een lus, WP_Query doet niet echt veel. De lus is de code die u gebruikt om de gegevens weer te geven die WordPress uit de database heeft opgehaald op basis van uw queryargumenten.

Zoals ik heb aangetoond, zijn er een paar variaties op de lus. Een eenvoudige lus zal alleen alle berichten uitvoeren in de volgorde die u in uw queryargumenten hebt opgegeven (of standaard in aflopende volgorde op datum). Als je scheidt if ($ query-> have_posts ()) en while ($ query-> have_posts ()), u kunt buiten uw loop extra markeringen invoegen, maar alleen als uw query gegevens heeft geretourneerd. En tenslotte door alternatieve argumenten te specificeren en te gebruiken wp_reset_postdata () na elke lus kunt u gebruiken WP_Query meer dan eens om meerdere loops op uw pagina te maken.