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:
Så la oss komme i gang!
Å følge med, du trenger:
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.
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.
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 '=>', ',)); ?>
Kopier det til din nye fil.
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.
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:
Mellom hver av disse vil jeg bruke rewind_posts ()
å spole innleggene uten å tilbakestille spørringen: Vi jobber fortsatt med hovedspørsmålet hver gang.
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;
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.
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.
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:
Å 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.