Interogări personalizate WordPress – Folosind clasa WP_Query

Publicat: 2021-02-06

WordPress oferă o gamă largă de funcții gata de utilizare care în majoritatea cazurilor pot prelua informațiile necesare din baza de date. Dar atunci când dezvoltați un site web WordPress există numeroase scenarii în care un filtru sau o acțiune nu este suficientă pentru a obține rezultatul dorit. În aceste cazuri. WordPress oferă o soluție de soluție sub forma clasei WP_Query .

Să aruncăm o privire la cum poate fi utilizată clasa WP_Query !

Cazuri de interogare personalizate

NOTĂ: Acest articol presupune că aveți cunoștințe despre PHP și MySQL/MariaDB și sunteți familiarizat cu WordPress.

Indiferent de pagina pe care o vizitați, WordPress rulează ceea ce se numește „interogare principală” pentru a afișa conținutul. Deci, atunci când vizitați o pagină, cum ar fi o vizualizare de categorie, de exemplu, un obiect WP_Query este creat în culise și preia toate datele necesare din baza de date pentru a afișa pagina.

În principiu, WP_Query vă oferă posibilitatea de a prelua conținut din baza de date a site-ului dvs. web fără a fi nevoie să utilizați interogări SQL.

Pentru a face acest lucru, tot ce trebuie să facem este să definim argumentele corespunzătoare nevoilor noastre și un nou obiect WP_Query va fi creat și tradus într-o interogare SQL.

Un exemplu folosind WP_Query

Dacă dorim să afișăm postări dintr-o anumită categorie, în cadrul unui alt șablon de categorie, atunci este necesară crearea unui nou obiect de interogare.

În scopul acestui exemplu, am activat tema Twenty Twenty și am creat 2 postări într-o categorie numită „Categoria 1” și 2 postări într-o categorie numită „Servicii”.

În plus, am creat un șablon personalizat de vizualizare a categoriilor pentru postările din „Categoria 1”. Slug-ul acestei categorii este „categoria-1”, prin urmare fișierul din folderul temei ar trebui să fie category-CATEGORYSLUG.php care în cazul nostru este category-category-1.php .

Vă rugăm să lipiți următoarele în fișierul category-category-1.php .

 <?php /*** Custom Category 1 Template */ get_header(); ?> <main role="main"> <section class="site-content"> <div role="main"> <?php if ( have_posts() ) : ?> <header class="archive-header"> <h3 class="archive-title">Category: <?php single_cat_title( '', true ); ?></h3> </header> <?php while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; endif; ?> </div> </section> </main> <?php get_sidebar(); ?> <?php get_footer(); ?>

Înainte de buclă, folosim metoda have_posts pentru a determina dacă există mai multe postări disponibile în buclă.

the_post() este necesar pentru ca bucla să repete postările și să îi spună WordPress să treacă la următoarea postare a matricei de postări.

În acest moment, vizualizarea noastră frontală a categoriei ( https://mycompanyname.com/category/category-1/ ) va fi cam așa:

Știu că, folosind această bucată de cod, am neglijat să includem o mulțime de informații despre postări, dar de dragul acestui exemplu, este mai bine să fie simplu și să afișăm doar titlurile postărilor.

Pentru a vedea proprietățile obiectului de interogare pe care WordPress le-a creat pentru această vizualizare, putem adăuga pur și simplu această linie în codul nostru după endif; afirmație.

 var_dump ( $wp_query->query_vars );

Acum, dacă vă reîmprospătați pagina, veți găsi aceste informații în lista de postări:

 array(63) { ["category_name"]=> string(10) "category-1" ["error"]=> string(0) "" ["m"]=> string(0) "" ["p"]=> int(0) ["post_parent"]=> string(0) "" ["subpost"]=> string(0) "" ["subpost_id"]=> string(0) "" ["attachment"]=> string(0) "" ["attachment_id"]=> int(0) ["name"]=> string(0) "" ["pagename"]=> string(0) "" ["page_id"]=> int(0) ["second"]=> string(0) "" ["minute"]=> string(0) "" ["hour"]=> string(0) "" ["day"]=> int(0) ["monthnum"]=> int(0) ["year"]=> int(0) ["w"]=> int(0) ["tag"]=> string(0) "" ["cat"]=> int(16) ["tag_id"]=> string(0) "" ["author"]=> string(0) "" ["author_name"]=> string(0) "" ["feed"]=> string(0) "" ["tb"]=> string(0) "" ["paged"]=> int(0) ["meta_key"]=> string(0) "" ["meta_value"]=> string(0) "" ["preview"]=> string(0) "" ["s"]=> string(0) "" ["sentence"]=> string(0) "" ["title"]=> string(0) "" ["fields"]=> string(0) "" ["menu_order"]=> string(0) "" ["embed"]=> string(0) "" ["category__in"]=> array(0) { } ["category__not_in"]=> array(0) { } ["category__and"]=> array(0) { } ["post__in"]=> array(0) { } ["post__not_in"]=> array(0) { } ["post_name__in"]=> array(0) { } ["tag__in"]=> array(0) { } ["tag__not_in"]=> array(0) { } ["tag__and"]=> array(0) { } ["tag_slug__in"]=> array(0) { } ["tag_slug__and"]=> array(0) { } ["post_parent__in"]=> array(0) { } ["post_parent__not_in"]=> array(0) { } ["author__in"]=> array(0) { } ["author__not_in"]=> array(0) { } ["ignore_sticky_posts"]=> bool(false) ["suppress_filters"]=> bool(false) ["cache_results"]=> bool(true) ["update_post_term_cache"]=> bool(true) ["lazy_load_term_meta"]=> bool(true) ["update_post_meta_cache"]=> bool(true) ["post_type"]=> string(0) "" ["posts_per_page"]=> int(10) ["nopaging"]=> bool(false) ["comments_per_page"]=> string(2) "50" ["no_found_rows"]=> bool(false) ["order"]=> string(4) "DESC" }

Să presupunem că vrem să afișăm lista de postări care aparțin categoriei „Servicii” sub postările descrise mai sus. Deoarece pagina a creat deja un obiect de interogare pentru categoria curentă, va trebui să rezolvăm acest lucru prin manipularea argumentelor principale ale interogării existente.

Să aruncăm o privire asupra modalităților în care WordPress ne permite să realizăm acest lucru.

Funcția query_posts

Funcția query_posts() este o modalitate de a modifica interogarea principală pe care WordPress o folosește pentru a afișa postările. Face acest lucru punând interogarea principală deoparte și înlocuind-o cu o nouă interogare. Puteți vedea acest lucru pentru dvs. în fișierul wp-includes/query.php unde este introdus.

 function &query_posts($query) { unset($GLOBALS['wp_query']); $GLOBALS['wp_query'] =& new WP_Query(); return $GLOBALS['wp_query']->query($query); }

Vom încerca să adăugăm o altă buclă pentru a afișa postările „Servicii” adăugând următoarele linii sub endwhile; a buclei standard curente.

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

Și iată:

Există totuși un dezavantaj al acestei metode. Dacă încercăm să tipărim categoria inclusă în obiectul de interogare vom observa că este modificată.

Încercați să inserați var_dump ( $wp_query->query_vars["category_name"] ); după interogarea Servicii și reîmprospătați pagina. Ar trebui să vedeți acest rezultat:

 string(8) "services"

Acest lucru s-a întâmplat deoarece interogarea a fost modificată, dar nu a revenit niciodată. Această abordare poate cauza o mulțime de probleme cu conținutul care urmează interogărilor noastre.

Pentru a evita aceste conflicte și a curăța după un apel la query_posts , efectuați un apel la wp_reset_query() , iar interogarea principală inițială va fi restaurată. Deci codul dvs. ar trebui să arate astfel:

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

După reîmprospătarea paginii, vedeți acum că categoria inițială a paginii este din nou în interogare.

 string(10) "category-1"

În cele din urmă, ar trebui să menționăm că query_posts ar trebui evitată, deoarece adaugă supraîncărcare interogării dvs., deoarece de fapt determină rularea din nou a interogării principale.

Funcția get_posts().

Același rezultat poate fi obținut prin utilizarea funcției get_posts() pentru a prelua o serie de postări care corespund criteriilor date.

Înlocuiți bucla de servicii afișată mai jos...

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

…Cu acesta:

 $my_query = get_posts( array ( 'category' => 17 ) ); foreach($my_query as $post) : setup_postdata($post); the_title( '<h4 class="example"></h4>' ); endforeach; var_dump ( $wp_query->query_vars["category_name"] );

După cum puteți vedea de data aceasta, a trebuit să lucrăm cu id-ul categoriei în loc de numele categoriei, conform argumentelor get_posts() definite de WordPress.

Un alt lucru important de remarcat aici este că, deși nu am resetat interogarea, rezultatul var_dump a categoriei de interogare a fost încă intactă și nu a fost schimbată în „servicii”. Asta pentru că get_posts() în sine nu modifică interogarea principală. Tocmai am folosit o nouă variabilă „ $my_query ” pentru a crea o nouă instanță a obiectului de interogare fără a o înlocui.

Funcția get_posts() folosește aceiași parametri ca query_posts() și este sugerată pentru utilizare atunci când doriți să adăugați bucle personalizate statice oriunde în șablon, deoarece este sigură și ușor de utilizat.

Creați un nou obiect WP_Query

$wp_query este un obiect al clasei WP_Query și preia conținutul necesar bazei de date pentru pagina curentă. Înlocuirea acestei clase este modalitatea noastră de a personaliza rezultatele și de a afișa conținut diferit.

Acesta este fragmentul de cod pe care îl vom folosi:

 $services_query = new WP_Query( 'category_name=services' ); if ( $services_query->have_posts() ) { while ( $services_query->have_posts() ) : $services_query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; } wp_reset_postdata(); var_dump ( $wp_query->query_vars["category_name"] );

Am folosit argumentul „category_name” pentru a defini slug-ul categoriei în care dorim ca postările sale să fie afișate.

Am salvat noul obiect new WP_Query( 'category_name=services' ); în variabila $services_query .

Apoi am folosit o buclă while pentru a afișa conținutul și după aceasta am resetat bucla cu wp_reset_postdata(); pentru a restabili datele originale ale interogării principale.

Dacă doriți să experimentați cu alte argumente ale clasei WordPress WP_Query, puteți găsi lista completă pe pagina sa WordPress Codex.