Meerdere lussen coderen terwijl u de database eenmaal bestuurt

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:

  • Maak een kindthema en een sjabloonbestand.
  • Maak een sjabloononderdeel voor de inhoud van de lus.
  • Maak onze loops.

Dus laten we beginnen!

Wat je nodig hebt

Om mee te gaan, heb je nodig:

  • Een ontwikkelingsinstallatie van WordPress.
  • Een code-editor.
  • Posts op uw site met meerdere toegewezen categorieën-Ik gebruik de testgegevens van de WordPress-themafunctie.
  • Het thema van twintig zestien geïnstalleerd op uw site.
  • Een kindthema van twintig zestien geïnstalleerd en geactiveerd - Ik zal hier kort het opzetten van het kindthema bespreken.

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.

Het kindthema creëren

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.

Een nieuw sjabloonbestand maken

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 '=>', ',)); ?>
"% S"',' twentysixteen '), get_the_title ()),'',''); ?>

Kopieer dat naar je nieuwe bestand.

Het sjabloondeel bewerken

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. 

Onze loops maken

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:

  • De eerste controleert of de query berichten met deze tag heeft geretourneerd.
  • Als dit het geval is, geeft de tweede berichten met dit label door.
  • Een derde geeft berichten af ​​zonder deze tag.

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.

The First Loop: Zoeken naar berichten

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 tweede lus: berichten uitvoeren met de tag

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 derde lus: de rest van onze berichten uitvoeren

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.

Het voltooide archief

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:

Samenvatting

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.