Slik kodes du flere løkker mens du bare spørrer databasen

Jeg er en stor fan av WP_Query klasse: Jeg bruker den på mange av kundens nettsteder til å søke og utføre innhold på tilpassede måter.

Hvis du vil kjøre flere løkker på en side, er den enkleste måten å gjøre det, å løpe WP_Query hver gang du trenger å kjøre en løkke. Men det er en ulempe: hver gang WordPress kjører et spørsmål, sender det forespørsler til databasen, noe som tar tid og kan sakte ned på nettstedet ditt. Og hvis du bruker WP_Query i stedet for hovedspørsmålet om å skrive ut innhold, gjør det det viktigste spørsmålet overflødig, noe som er sløsing med ressurser.

Så her skal jeg vise deg hvordan du bruker ett søk for å kjøre mer enn en sløyfe. Du kan enten gjøre dette med hovedspørsmålet (som jeg vil gjøre som det er mer effektivt) eller du kan bruke samme teknikk med WP_Query.

Det er tre deler til dette:

  • Lag et barnemne og en malfil.
  • Opprett en maldel for loopinnholdet.
  • Lag våre looper.

Så la oss komme i gang!

Hva du trenger

Å følge med, du trenger:

  • En utviklingsinstallasjon av WordPress.
  • En kodeditor.
  • Innlegg på nettstedet ditt med flere kategorier tildelt-jeg bruker testdataene til WordPress-temanheten.
  • Tjueseksten temaet installert på nettstedet ditt.
  • Et barn tema på tjue seksten installert og aktivert-Jeg vil kort dekke å sette opp barnet temaet her.

Du trenger ikke å bruke tjue seksten med et barn tema - du kan tilpasse denne teknikken til ditt eget tema. Men jeg skal bruke et barn på tjue seksten.

Opprette barnetemaet

Først la oss lage barnetemaet på tjue seksten. Jeg gjør dette fordi jeg ikke vil redigere det tjuefemte temaet selv.

I din wp-content / themes katalog, opprett en ny tom mappe. Jeg ringer til min tutsplus-en-spørrings-to-sløyfer.

I den mappen, opprett en fil som heter style.css og legg til dette:

/ * Tema navn: Tutsplus One Query Multiple Loops Tema URI: http: //.tutsplus.com/tutorials/how-to-code-multiple-loops-while-only-querying-the-database-once--cms-25703 Beskrivelse: Tema for å støtte opplæringen om å kjøre flere løkker mens du spørre databasen bare en gang. Barn tema for Twenty Sixteen tema. Forfatter: Rachel McCollin Forfatter URI: http://rachelmccollin.co.uk/ Mal: ​​twentysixteen Versjon: 1.0 * / @import url ("... /twentysixteen/style.css");

Lagre den filen nå og aktiver ditt nye tema.

Det neste trinnet er å lage en malfil for kategorier, noe som vi skal jobbe med.

Lag en kopi av archive.php fil fra tjueen seksten i ditt nye tema. Ikke flytt det, men kopier det. Gi nytt navn til det category.php. Dette er nå malfilen for kategorier på nettstedet ditt.

Opprette en ny mall del fil

Det første trinnet er å sette opp en ny malpartefil i vårt tema som vil inneholde en redigert versjon av løkken fra tjue seksten.

I temamappen din lager du en undermappe som heter inkluderer. Inne i det, opprett en ny fil som heter sløyfe-category.php.

Åpne nå mal-deler / content.php fil fra den tjue seksten filen og finn denne koden (som er mesteparten av filen):

> ', esc_url (get_permalink ()))''); ?>
"% S"',' twentysixteen '), get_the_title ())); wp_link_pages (array ('before' => '
'. __ ('Sider:', 'twentysixteen'). '',' after '=>'
',' link_before '=>'',' link_after '=>'',' pagelink '=>''. __ ('Side', 'twentysixteen'). ' % ',' separator '=>', ',)); ?>
"% S"',' twentysixteen '), get_the_title ()),'',''); ?>

Kopier det til din nye fil.

Redigerer maldelen

Sløyfen fra tjue seksten viser mer enn jeg trenger den til for dette arkivet, så jeg skal redigere den. Jeg vil bare vise utsnittet og ikke innholdet, så vi fjerner det.

I din nye sløyfe-category.php fil, finn denne koden og slett den:

"% S"',' twentysixteen '), get_the_title ())); wp_link_pages (array ('before' => '
'. __ ('Sider:', 'twentysixteen'). '',' after '=>'
',' link_before '=>'',' link_after '=>'',' pagelink '=>''. __ ('Side', 'twentysixteen'). ' % ',' separator '=>', ',)); ?>

Det andre trinnet er å erstatte twenty_sixteen_excerpt () fungere med standarden the_excerpt () funksjon, da den tjue seksten versjonen ikke inneholder en lenke til hele innlegget.

Finn denne linjen:

Erstatt det med dette:

Vi må også gjøre noen tweaks til overskriftene.

I maldelen, rediger linjen:

', esc_url (get_permalink ()))''); ?>

Endre h2 tags til h3:

', esc_url (get_permalink ()))''); ?>

Lagre mappens delfil. Gå nå tilbake til din category.php fil og fortsett å jobbe i det. 

Opprette våre looper

Først, la oss fjerne samtalen til den tjuefemte maldelen fra vår category.php-fil, da vi må bruke den nye filen i stedet.

I din category.php fil finner du denne koden:

get_template_part ('mal-deler / innhold', get_post_format ());

Slett det.

Nå lager vi løkkene.

I dette eksemplet skal jeg liste alle innlegg med «innhold» -taggen først ved hjelp av has_tag () betinget kode.

Dette betyr at jeg må løbe tre løkker:

  • Den første sjekker om spørringen har returnert innlegg med denne taggen.
  • I så fall sender de andre utgangene med denne taggen.
  • En tredje utganger innlegg uten denne taggen.

Mellom hver av disse vil jeg bruke rewind_posts () å spole innleggene uten å tilbakestille spørringen: Vi jobber fortsatt med hovedspørsmålet hver gang.

The First Loop: Kontrollerer innlegg

I din category.php fil, finn starten på løkken:

mens (has_posts ()): the_post ();

Over den linjen, definer en ny variabel som heter $ count:

$ telle = 0;

Nå i denne kretsen, legg til denne koden:

// Sjekk om det er noen innlegg med «tag $ tag = 'content', hvis (has_tag ($ tag)) $ count + = 1;

Dette kontrollerer om innleggene har "innhold" -taggen og deretter legger til 1 til tellingen hvis så.

Sløyfen din vil nå se slik ut:

// Sjekk etter innlegg i den første sløyfen. $ telle = 0; mens (has_posts ()): the_post (); // Sjekk om det er noen innlegg med «tag $ tag = 'content'; hvis (has_tag ($ tag)) $ count + = 1; endwhile;

Second Loop: Outputting innlegg med taggen

Det neste trinnet er å kjøre en loop for å sende innlegg med den taggen, men bare hvis det er noen, det vil si hvis verdien av $ count er større enn 0.

Legg til dette under din første sløyfe:

hvis ($ count> 0) rewind_posts (); ekko '

Innlegg merket med '. $ tag. '

'; mens (has_posts ()): the_post (); hvis (has_tag ($ tag)) get_template_part ('includes / loop', 'category'); // Avslutt sløyfen. EndWhile;

Dette kontrollerer det $ count er større enn null og i så fall spoler tilbake innlegg og kjører sløyfen igjen. For hvert innlegg kontrollerer det om posten har vår kode, og i så fall kaller den maldelen vi nettopp har opprettet.

The Third Loop: Utlevering av resten av innleggene våre

Den endelige sløyfen vil sende de resterende innleggene. Hvis denne kategorien ikke hadde noen innlegg med «innhold» -taggen, vil den sende ut alle innlegg i kategorien.

Under din andre sløyfe legger du til dette:

rewind_posts (); // Second Loop - Innlegg ikke med 'innhold' taggen mens (har_posts ()): the_post (); hvis (! has_tag ($ tag)) get_template_part ('includes / loop', 'category');  // Avslutt sløyfen. EndWhile; ?>

Dette rewinds innlegg (som du skal gjøre for første gang hvis det ikke var noen innlegg med taggen eller andre gangen hvis det var), og kjører deretter løkken igjen. Denne gangen sjekker det om et innlegg ikke ha "innhold" -taggen og deretter utdata den ved hjelp av vår maldel.

Det ferdige arkivet

Test nå kategoriarkivsiden på nettstedet ditt.

Hvis du bruker WordPress-testenhetens data som meg, vil du oppdage at kategorien "Markup" har innlegg med «innhold» -taggen. Her er kategoriarkivsiden for kategorien 'Markup' på nettstedet mitt:

Sammendrag

Å kjøre flere løkker fra ett søk er ikke komplisert. I stedet for å tilbakestille spørringen og opprette en ny, bruker du rewind_posts () funksjon for å spole tilbake spørringen og kjøre den igjen. Og i stedet for å definere nye søkeparametere, bruker du betingede koder for å spesifisere hvilke innlegg som sendes ut.

Viktig merknad: Ikke bli fristet til å bruke query_posts () for å endre hovedspørsmålet når du gjør dette. Dette vil senke nettstedet ditt ned mer enn hvis du hadde brukt flere spørringer.

I dette eksemplet har vi kjørt to looper basert på hovednavnet, som lagrer bruk WP_Query å kjøre to ytterligere spørringer og redusere serverbelastningen. Du kan bruke denne teknikken med et spørsmål du definerer ved hjelp av WP_Query eller med hovednavnet på andre arkivsider, ved å redigere den aktuelle malfilen.