Ik ben een grote fan van de WP_Query
class: ik gebruik het op veel van mijn client-sites om op aangepaste manieren query's uit te voeren en inhoud weer te geven.
Als u meerdere loops op een pagina wilt uitvoeren, is de eenvoudigste manier om het uit te voeren WP_Query
elke keer dat je een lus moet uitvoeren. Maar er is een nadeel: telkens wanneer WordPress een query uitvoert, verzendt het verzoeken naar de database, wat tijd kost en uw site kan vertragen. En als je gebruikt WP_Query
in plaats van de hoofdquery voor het uitvoeren van content, maakt het de hoofdquery overbodig, wat een verspilling van resources is.
Hier laat ik u zien hoe u één query gebruikt om meer dan één lus uit te voeren. U kunt dit doen met de hoofdquery (wat ik zal doen als het efficiënter is) of u kunt dezelfde techniek gebruiken met WP_Query
.
Dit bestaat uit drie delen:
Dus laten we beginnen!
Om mee te gaan, heb je nodig:
Je hoeft geen twintig zestien te gebruiken met een kindthema - je kunt deze techniek aanpassen aan je eigen thema. Maar ik gebruik een kind van twintig zestien.
Laten we eerst het kindthema van twintig zestien maken. Ik doe dit omdat ik het thema van twintig zestien zelf niet wil bewerken.
In uw wp-content / themes
map, maak een nieuwe lege map aan. Ik bel de mijne tutsplus-on-vraag-twee-lussen
.
Maak in die map een bestand met de naam style.css
en voeg dit toe:
/ * Theme Name: Tutsplus One Query Multiple Loops Theme URI: http: //.tutsplus.com/tutorials/how-to-code-multiple-loops-while-only-querying-the-database-once--cms-25703 Beschrijving: thema om zelfstudie te ondersteunen over het uitvoeren van meerdere loops tijdens het slechts eenmaal opvragen van de database. Kindthema voor het Twenty Sixteen-thema. Auteur: Rachel McCollin Auteur URI: http://rachelmccollin.co.uk/ Sjabloon: twentysixteen Versie: 1.0 * / @import url ("... /twentysixteen/style.css");
Bewaar nu dat bestand en activeer je nieuwe thema.
De volgende stap is het maken van een sjabloonbestand voor categorieën, en daar zullen we mee werken.
Maak een kopie van de archive.php
bestand van twintig zestien in je nieuwe thema. Verplaats het niet, maar kopieer het. Hernoem het category.php
. Dit is nu het sjabloonbestand voor categorieën op uw site.
De eerste stap is het opzetten van een nieuw sjabloondeelbestand in ons thema dat een bewerkte versie van de lus van twintig zestien zal bevatten.
Maak in uw themamap een submap met de naam omvat
. Maak daarbinnen een nieuw bestand met de naam lus-category.php
.
Open nu de template-onderdelen / content.php
bestand uit het twintig-en zestien-bestand en zoek deze code (die het grootste deel van het bestand is):
> ', esc_url (get_permalink ())),''); ?> "% S"',' twentysixteen '), get_the_title ())); wp_link_pages (array ('before' => ')'. __ ('Pages:', 'twentysixteen'). '',' na '=>'',' link_before '=>'',' link_after '=>'',' pagelink '=>''. __ ('Pagina', 'twintigentwintig'). ' % ',' separator '=>', ',)); ?>
Kopieer dat naar je nieuwe bestand.
De loop van twintig zestien geeft meer weer dan ik nodig heb voor dit archief, dus ik ga het bewerken. Ik wil alleen het fragment en niet de inhoud weergeven, dus we zullen dat verwijderen.
In je nieuwe lus-category.php
bestand, zoek deze code en verwijder deze:
"% S"',' twentysixteen '), get_the_title ())); wp_link_pages (array ('before' => ')'. __ ('Pages:', 'twentysixteen'). '',' na '=>'',' link_before '=>'',' link_after '=>'',' pagelink '=>''. __ ('Pagina', 'twintigentwintig'). ' % ',' separator '=>', ',)); ?>
De andere stap is het vervangen van de twenty_sixteen_excerpt ()
functie met de standaard the_excerpt ()
functie, omdat de twintig-zestien versie geen link naar de volledige post bevat.
Zoek deze regel:
Vervang het hiermee:
We moeten ook een paar aanpassingen aanbrengen aan de heading-tags.
Bewerk de regel in het sjabloongedeelte:
', esc_url (get_permalink ())),''); ?>
Verander de h2
tags voor h3
:
', esc_url (get_permalink ())),''); ?>
Bewaar uw sjabloondeelbestand. Ga nu terug naar jouw category.php
bestand en blijven daarin werken.
Laten we eerst de aanroep naar de twintig zestien sjabloononderdelen verwijderen uit ons category.php-bestand, omdat we in plaats daarvan het nieuwe bestand moeten gebruiken.
In uw category.php
bestand vind deze code:
get_template_part ('template-parts / content', get_post_format ());
Verwijder dat.
Nu zullen we de loops maken.
In dit voorbeeld ga ik eerst alle berichten met de tag 'content' weergeven, met behulp van de has_tag ()
voorwaardelijke tag.
Dit betekent dat ik drie loops moet uitvoeren:
Tussen elk van deze gebruik ik rewind_posts ()
om de berichten terug te spoelen zonder de zoekopdracht opnieuw in te stellen: we werken nog steeds elke keer met de hoofdquery.
In uw category.php
bestand, zoek het begin van de lus:
while (have_posts ()): the_post ();
Boven die lijn, definieer een nieuwe variabele genaamd $ count
:
$ count = 0;
Voeg deze code in die lus toe:
// controleer of er berichten zijn met de "tag $ tag = 'content'; if (has_tag ($ tag)) $ count + = 1;
Hiermee wordt gecontroleerd of berichten de tag 'content' bevatten en vervolgens worden toegevoegd 1
aan de graaf als dat zo is.
Je lus ziet er nu als volgt uit:
// Controleer op berichten in de eerste lus. $ count = 0; while (have_posts ()): the_post (); // controleer of er berichten zijn met de "tag $ tag = 'content'; if (has_tag ($ tag)) $ count + = 1; intussen;
De volgende stap is om een lus uit te voeren om berichten met die tag uit te voeren, maar alleen als die er zijn, dus als de waarde van $ count
is groter dan 0
.
Voeg dit toe onder je eerste lus:
if ($ count> 0) rewind_posts (); echo 'Posts getagd met '. $ tag. '
'; while (have_posts ()): the_post (); if (has_tag ($ tag)) get_template_part ('includes / loop', 'category'); // Beëindig de lus. endwhile;
Dit controleert dat $ count
is groter dan nul en zo ja, windt paden terug en voert de lus opnieuw uit. Voor elke post controleert het of het bericht onze tag heeft en, zo ja, het roept het sjabloongedeelte op dat we zojuist hebben gemaakt.
De laatste lus zal de resterende berichten uitvoeren. Als deze categorie geen berichten met de tag 'content' bevat, worden alle berichten in de categorie weergegeven.
Onder je tweede lus, voeg dit toe:
rewind_posts (); // Tweede lus - berichten niet met de tag 'content' while (have_posts ()): the_post (); if (! has_tag ($ tag)) get_template_part ('includes / loop', 'category'); // Beëindig de lus. endwhile; ?>
Dit spoelt berichten (die je voor de eerste keer doet als er geen berichten waren met de tag of de tweede keer als die er waren) opnieuw af en voert dan de lus opnieuw uit. Deze keer controleert het of een bericht niet de tag 'content' hebben en deze vervolgens uitvoeren met ons sjabloononderdeel.
Test nu de categoriearchiefpagina op uw site.
Als u de gegevens van de WordPress-testeenheid zoals ik gebruikt, ziet u dat de categorie 'Markup' berichten bevat met de tag 'content'. Dit is de categoriearchiefpagina voor de 'Markup'-categorie op mijn site:
Meerdere lussen uitvoeren vanuit één query is niet ingewikkeld. In plaats van de query opnieuw in te stellen en een nieuwe te maken, gebruikt u de rewind_posts ()
functie om de query terug te spoelen en opnieuw uit te voeren. En in plaats van nieuwe queryparameters te definiëren, gebruikt u voorwaardelijke tags om op te geven welke posts worden uitgevoerd.
Belangrijke opmerking: laat u niet verleiden om te gebruiken query_posts ()
om de hoofdvraag te wijzigen wanneer u dit doet. Hierdoor wordt uw site langzamer vertraagd dan wanneer u meerdere query's had gebruikt.
In dit voorbeeld hebben we twee loops uitgevoerd op basis van de hoofdquery, die opslaan gebruiken WP_Query
om twee extra query's uit te voeren en de serverbelasting te verminderen. U kunt deze techniek toepassen met een query die u definieert met WP_Query
of met de hoofdquery op andere archiefpagina's, door het juiste sjabloonbestand te bewerken.