Cum se codifică mai multe bucle în timp ce se interoghează doar baza de date odată

Sunt un mare fan al lui WP_Query clasa: îl folosesc în multe dintre site-urile clientului meu pentru a interoga și a scoate conținut în moduri personalizate.

Dacă doriți să executați mai multe bucle pe o pagină, cel mai simplu mod de a face acest lucru este de a rula WP_Query de fiecare dată când trebuie să rulați o buclă. Dar există un dezavantaj: de fiecare dată când WordPress execută o interogare, trimite cereri către baza de date, ceea ce necesită timp și poate încetini site-ul dvs. în jos. Și dacă utilizați WP_Query în loc de interogarea principală a conținutului de ieșire, atunci aceasta face ca interogarea principală să fie redundantă, ceea ce reprezintă o risipă de resurse.

Deci, aici vă voi arăta cum să utilizați o interogare pentru a rula mai mult de o buclă. Puteți face acest lucru cu interogarea principală (ceea ce voi face dacă este mai eficient) sau puteți utiliza aceeași tehnică cu WP_Query.

Există trei părți la aceasta:

  • Creați o temă pentru copii și un fișier șablon.
  • Creați o parte de șablon pentru conținutul bucla.
  • Creați buclele noastre.

Deci sa începem!

Ce ai nevoie

Pentru a urmări, veți avea nevoie de:

  • O instalare de dezvoltare a WordPress.
  • Un editor de cod.
  • Postările din site-ul dvs. cu mai multe categorii atribuite - utilizez datele testului pentru unitatea tematică WordPress.
  • Cele douăzeci și șaisprezece teme instalate pe site-ul dvs..
  • O temă a copilului de douăzeci și șasezeci instalată și activată - voi acoperi pe scurt tema copilului aici.

Nu trebuie să folosiți douăzeci și șasezeci cu tema copilului - puteți adapta această tehnică pentru propria temă. Dar voi folosi un copil de douăzeci și șasezeci.

Crearea temei copilului

Mai întâi să creăm tema copilului de douăzeci și șasezeci. Fac asta pentru că nu vreau să editez tema în sine douăzeci și șase.

În tine wp-content / teme , creați un nou dosar gol. Îi sun pe a mea tutsplus-one-interogare de două bucle.

În acest dosar, creați un fișier numit style.css și adăugați-le la aceasta:

/ * Tema Nume: Tutsplus One Query Multiple Loops Tema URI: http: //.tutsplus.com/tutorials/how-to-code-multiple-loops-while-only-querying-the-database-once--cms-25703 Descriere: Tema de a sprijini Tutorial în rularea mai multor bucle în timp ce interoghează baza de date o singură dată. Tema copilului pentru tema Twenty Sixteen. Autor: Rachel McCollin Autor URI: http://rachelmccollin.co.uk/ Format: twentysixteen Versiune: 1.0 * / @import url ("... /twentysixteen/style.css");

Acum salvați fișierul și activați noua temă.

Următorul pas este să creați un fișier șablon pentru categorii, cu care vom lucra.

Faceți o copie a textului archive.php fișier de la douăzeci și șaisprezece în noua ta temă. Nu o mutați, ci copiați-o. Redenumiți-o category.php. Acesta este acum fișierul șablon pentru categoriile de pe site-ul dvs..

Crearea unui nou fișier de șablon

Primul pas este să configurați un nou fișier de șablon în tema noastră, care să conțină o versiune editată a bucla de la douăzeci și șaisprezece.

În dosarul tematic, creați un subfolder numit include. În interiorul acestuia, creați un nou fișier numit loop-category.php.

Deschide acum matriță piese / content.php fișier din cele douăzeci și șaisprezece dosar și pentru a găsi acest cod (care este cea mai mare parte a fișierului):

> ', esc_url (get_permalink ())),''); ?>
"% S"',' twentysixteen '), get_the_title ())); wp_link_pages (array ('înainte' => '
". __ ("Pagini:", "douăsprezecezeci"). '',' după '=>'
',' link_before '=>'',' link_after '=>'',' pagelink '=>'". __ ("Pagina", "douăsprezecezeci"). ' % ',' separator '=>', ',)); ?>
"% S""," douăsprezecezeci "), get_the_title ()),"","'); ?>

Copiați-l în fișierul dvs. nou.

Editarea părții de șablon

Buclele de la douăzeci și șasezeci afișează mai mult decât am nevoie de această arhivă, așa că o să o editez. Vreau doar să afișez extrasul și nu conținutul, așa că vom elimina asta.

În noul tău loop-category.php fișier, găsiți acest cod și ștergeți-l:

"% S"',' twentysixteen '), get_the_title ())); wp_link_pages (array ('înainte' => '
". __ ("Pagini:", "douăsprezecezeci"). '',' după '=>'
',' link_before '=>'',' link_after '=>'',' pagelink '=>'". __ ("Pagina", "douăsprezecezeci"). ' % ',' separator '=>', ',)); ?>

Cealaltă etapă este înlocuirea twenty_sixteen_excerpt () funcția cu standardul the_excerpt () funcția, deoarece versiunea douăzeci și șaisprezece nu include o legătură cu postul complet.

Găsiți această linie:

Înlocuiți-l cu acesta:

De asemenea, trebuie să facem câteva modificări la etichetele de titlu.

În partea șablon, editați linia:

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

Schimba h2 etichete pentru a h3:

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

Salvați fișierul de șablon. Acum du-te la tine category.php fișier și continuați să lucrați în acest scop. 

Crearea buclelor noastre

Mai întâi, să eliminăm apelul la secțiunea de șaisprezece șabloane din fișierul nostru category.php, deoarece va trebui să folosim noul fișier.

În tine category.php fișierul găsește acest cod:

get_template_part ('template-parts / content', get_post_format ());

Ștergeți asta.

Acum vom crea buclele.

În acest exemplu, voi lista toate postările cu eticheta "conținut" mai întâi, folosind has_tag () eticheta condiționată.

Aceasta înseamnă că va trebui să rulez trei bucle:

  • Prima verifică dacă interogarea a returnat orice postări cu această etichetă.
  • Dacă da, al doilea mesaj de postări cu această etichetă.
  • Un al treilea post de posturi fără această etichetă.

Între fiecare dintre acestea, o să folosesc rewind_posts () pentru a derula mesajele fără a reseta interogarea: încă lucrăm la interogarea principală de fiecare dată.

Prima buclă: verificarea postărilor

În tine category.php fișier, găsiți începutul buclă:

în timp ce (have_posts ()): the_post ();

Deasupra acelei linii, definiți o nouă variabilă numită $ count:

$ count = 0;

Acum, în interiorul acelei bucle, adăugați acest cod:

// verificați dacă există mesaje cu tagul $ tag = 'content'; dacă (has_tag ($ tag)) $ count + = 1;

Acest lucru verifică dacă postările au eticheta "conținut" și apoi adaugă 1 la număr, dacă este așa.

Buclele dvs. vor arăta astfel:

// Verificați postările din prima buclă. $ count = 0; în timp ce (have_posts ()): the_post (); // verificați dacă există mesaje cu "tag $ tag = 'content'; dacă (has_tag ($ tag)) $ count + = 1; în cele din urmă;

Cea de-a doua buclă: ieșirea posturilor cu eticheta

Următorul pas este să rulați o buclă pentru a ieși mesaje cu acea etichetă, dar numai dacă există, de exemplu, dacă valoarea $ count este mai mare decât 0.

Adăugați mai jos această primă buclă:

dacă ($ count> 0) rewind_posts (); echo "

Mesaje etichetate cu '. $ tag. '

„; în timp ce (have_posts ()): the_post (); dacă (has_tag ($ tag)) get_template_part ('include / loop', 'category'); // Închideți bucla. endwhile;

Acest lucru verifică asta $ count este mai mare decât zero și dacă este așa, întoarce posturile și rulează buclă din nou. Pentru fiecare post, verifică dacă mesajul are eticheta noastră și, dacă da, cheamă partea de șablon pe care tocmai l-am creat.

Cea de-a treia buclă: realizarea restului mesajelor noastre

Bucla finală va scoate posturile rămase. Dacă această categorie nu a avut nicio postare cu eticheta "conținut", atunci se va afișa toate postările din categorie.

Sub cea de-a doua buclă, adăugați aceasta:

rewind_posts (); // Second Loop - postări care nu conțin tagul "conținut" în timp ce (have_posts ()): the_post (); dacă (! has_tag ($ tag)) get_template_part ('include / loop', 'category');  // Închideți bucla. endwhile; ?>

Aceasta derulează mesajele înapoi (pe care le vei face pentru prima dată dacă nu ar exista mesaje cu eticheta sau a doua oară, dacă ar exista) și apoi rulează buclă din nou. De data aceasta verifică dacă un post nu să aibă tag-ul "conținut" și apoi să-l exporte folosind partea noastră de șablon.

Arhiva finalizată

Acum, testați pagina de arhivă a categoriilor de pe site-ul dvs..

Dacă utilizați datele din unitatea de testare WordPress ca mine, veți găsi că categoria "Marcare" are postări cu eticheta "conținut". Iată pagina de arhivă a categoriei pentru categoria "Marcare" de pe site-ul meu:

rezumat

Rularea mai multor bucle dintr-o interogare nu este complicată. În loc să resetați interogarea și să creați una nouă, utilizați rewind_posts () funcția de derulare a interogării și rularea acesteia din nou. În loc să definiți noi parametri de interogare, utilizați etichete condiționate pentru a specifica ce posturi sunt afișate.

Notă importantă: Nu vă lăsați tentați să utilizați query_posts () pentru a modifica interogarea principală atunci când faceți acest lucru. Acest lucru va încetini mai puțin site-ul dvs. decât dacă ați fi utilizat mai multe interogări.

În acest exemplu, am executat două bucle bazate pe interogarea principală, pe care o salvați utilizând WP_Query pentru a rula două întrebări suplimentare și va reduce încărcarea serverului. Ați putea aplica această tehnică cu o interogare pe care o definiți utilizând WP_Query sau cu interogarea principală pe alte pagini de arhivă, editând fișierul șablon corespunzător.

Cod