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:
Deci sa începem!
Pentru a urmări, veți avea nevoie de:
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.
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..
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 '=>', ',)); ?>
Copiați-l în fișierul dvs. nou.
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.
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:
Î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ă.
Î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ă;
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.
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.
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:
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.