WP_Query in WordPress

Daca va invartiti de o vreme in WordPress, probabil stiti cat de greu era sa obtineti o lista de articole bazata pe criterii complexe, fiind in acelasi timp in conformitate cu standardele WordPress. De lungul timpului platforma a evoluat foarte mult. Astazi, folosind puterea clasei WP_Query, putem lista posturi in ce mod dorim noi.

irish-hands

Ce este WP_Query?

Clasa WP_Query este una din cele mai importante parti ale codului WordPress. Impreuna cu alte lucruri, stabileste interogarea in orice pagina si extrage articole in acord cu aceasta. De asemenea salveaza multa extrainformatie despre interogarea facuta, ceea ce ajuta foarte mult la optimizarea paginilor (si la rezolvarea problemelor aparute)

Celalalt rol al lui WP_Query este de a ne permite sa realizam interogari complexe intr-o maniera sigura, simpla si modulara.

Siguranta

In interactiunea cu acest obiect, furnizam parametri si folosim functii pentru a ne indeplini scopul. Functiile interne ale clasei WP_Query ne apara ne multe necazuri cum ar fi sa extragem campuri din baza de date pe care nu le dorim sau sa ne asiguram ca sunt folosite tipuri de date corespunzatoare.

Simplitatea

Obiectul ne scapa de complexitatea interogarii pentru a nu ne bate capul cu structura detaliata a bazei de date. Deoarece utilizeaza un array pentru a defini criteriile interogarii, totul este auto-explicativ. Nu avem nevoie de nici un manual de baze de date sau de interogari suplimentare, doar creem un array cu argumentele dorite si initializam clasa WP_Query.

Modularitatea

Favorita mea este modularitatea. Cand facem interogari individuale, este greu sa gestionam acei des utilizati biti deoarece sunt fragmente de cod SQL. WP_Query ne scapa de toate acestea folosind array-uri asociative ca si argumente si ne trezim dintrodata cu un cos plin cu bunatati: putem imbina argumente din diferite locuri, putem rula functii direct si le putem manipula in mod inteligent.

Sa incepem

Obisnuitul wordpress loop

Sa arucam inainte o privire la loop-ul normal, iar apoi sa creem acelasi loop folosind WP_Query. Sa presupunem ca avem urmatorul cod in category.php

<?php
if(have_posts()):
while(have_posts()):
the_post();
?>

<h1><?phpthe_title()?></h1>
<divclass='post-content'><?phpthe_content()?></div>

<?php
endwhile;
else:
?>

Oops, there are no posts.

<?php
endif;
?>

Acelasi loop folosind WP_Query

<?php

$args=array('cat'=>4);
$category_posts=newWP_Query($args);

if($category_posts->have_posts()):
while($category_posts->have_posts()):
$category_posts->the_post();
?>

<h1><?phpthe_title()?></h1>
<divclass='post-content'><?phpthe_content()?></div>

<?php
endwhile;
else:
?>

Oops, there are no posts.

<?php
endif;
?>

Dupa cum se vede, diferenta nu e prea mare. Sa-l desfacem in bucati:

1. Realizarea interogarii

Intr-o pagina de categorie, wordpress deja stie ca doresti sa listezi posturi din acea categorie. Deoarece construim o innterogare “de la zero” folosind WP_Query, avem nevoie sa specificam cateva argumente. Vom intra in detaliu putin mai tarziu.

2. Initierea clasei si interogarea pentru posturi

Prin initirea unei clase cu multimi de argumente create, WP_Query va incerca sa extraga posturile specificate si sa incarce alte detalii utile.

3. Crearea buclei (loop-ului)

Putem folosi toate functiile uzuale; doar trebuie sa fim siguri ca le folosim ca si metode ale obiectului:

- In loc de have_posts(), folositi $category_posts->have_posts().

- In loc de the_post(), folositi $category_posts->the_post().

4. Am intrat in afaceri, ca de obicei

Odata ce am trecut prin pasii de mai sus, putem folosi toate acele tag-uri uzuale pe care le cunoastem si le iubim atat de mult.

Daca ne uitam mai in detaliu, o sa observam ca obiectul $post este de asemenea disponibil. Acest lucru inseamna ca daca folosim un loop custom ca acesta in interiorul altui loop, lucrurile pot sa ia o intorsatura proasta. Trebuie sa ne convingem ca stocam valoarea originala a lui $post si o restauram dupa loop.

<?php
$temp_post=$post;// Storing the object temporarily
$my_query=newWP_Query();
while($my_query->have_posts()){
// Loop in here
}
$post=$temp_post;// Restore the value of $post to the original
?>

Săpăm mai adanc

Puterea unui argument bun

Ușurința cu care creem loop-uri este evidenta, dar ce ziceti despre interogarea posturilor in sine? Iată o tehnica utila pe care o folosesc la crearea sliderelor pentru teme comerciale.

In majoritatea cazurilor, beneficiarii temelor doresc un slider arătos, dar sunt cam lenesi la crearea conținutului acestuia. Multi clienti ar vrea sa arate ceva continut important. Sa facem o interogare pentru posturi viitoare, ce au atasat o imagine principală.

<?php
$args=array(
'post_status'=>'future',
'meta_query'=>array(
array(
'key'=>'_thumbnail_id',
'value'=>'',
'compare'=>'!='
)
)
);
$slider_posts=newWP_Query($args);
?>

<?phpif($slider_posts->have_posts()):?>

<divclass='slider'>
<?phpwhile($slider_posts->have_posts()):$slider_posts->the_post()?>
<divclass='slide'>
<?phpthe_post_thumbnail()?>
</div>
<?phpendwhile?>
</div>

<?phpendif?>

Scurt, usor si la obiect, intr-un cuvant: MINUNAT.

Invatati argumentele implicite

Probabil ati observat ca nu am specificat prea multe lucruri in interogarea mea. Dar ce ziceti de cate posturi sa listam? Sau ce spuneti de statutul postului din prima interogare?

Valori implicite sunt stabilite pentru multe din argumentele comune. Iata mai jos cateva pe care nu suntem nevoiti sa le specificam decat in cazul in care dorim sa le schimbam.

- posts_per_page

Are valoarea implicita stabilita in setarile de citire in panoul de administrare wordpress

- post_type

Implicit post.

- post_status

Implicit publish.

Poti gasi lista completa in Codexul WordPress, bineinteles.

Multimile sunt nemaipomenite

In multe cazuri o va doriti sa specificati o serie de valori pe care le poate avea un argument. WP_Query ne lasa de obicei sa folosim arrays pentru a ne face viata mai usoara. Iata cateva exemple:

- Poti folosi un array pentru post_status, pentru a lista posturi dintr-un numar diferite de status-uri. Poti folosi stringul any pentru a lista posturi din toate statusurile.

- Daca folosesti custom post types, vei fi fericit sa auzi ca poti folosi un array pentru setarea valorii parametrului post_type.

- Pentru taxonomy, poti folosi parametri ca si category_in, tag_in, sau poti folosi un array care poate lua o multitudine de valori.

Manipularea taxonomiei (taxonomy)

WP_Query este destul de dragut pentru a oferi o metoda simpla pentru a face interogari avansate pentru taxonomy. Acest lucru este folositor mai ales in cadrul siteurilor cu complexitate mare si pentru teme comerciale cu multe seturi de optiuni. Mecanismul utilizat se numeste tax_query. Sa vedem un exemplu.

Sa zicem ca avem un site despre filme. Incadram filmele intr-un custom post type; custom taxonomy pentru genul filmului, pentru actori, si folosim order list pentru a indica cat de bun este filmul. Sa gasim toate filmele de “actiune” care il au pe “Bruce Willis” in rol principal si care nu sunt filme proaste:

<?php
$args=array(
'post_type'=>'film',
'tax_query'=>array(
'relation'=>'AND',
array(
'taxonomy'=>'category',
'field'=>'slug',
'terms'=>array('prost')
'operator'=>'NOT IN'
),
array(
'taxonomy'=>'gen',
'field'=>'slug',
'terms'=>array('actiune')
),
array(
'taxonomy'=>'actor',
'field'=>'slug',
'terms'=>array('Bruce Willis'),
)
)
);
?>

In timp ce acest exemplu este bun doar pentru cei care sunt innebuniti dupa “Die Hard”, nu este greu de observat cum poate fi construit un filtru avansat care poate interoga continutul nostru in ce fel dorim noi.

Invata mai mult despre multe alte lucruri minunate pe care le poti face cu parametrii taxonomy in wordpress codex.

Sa ne distram cu meta data

Am vazut deja ca WP_Query este tare la manipularea meta datelor – am folosit un meta_query in al doilea exemplu pentru a construi un slider din posturi care au imagine principala. Ca si in cazul interogarilor in taxonomy, si aici avem o mare flexibilitate.

Sa zicem ca acum realizam o tema de wordpress care va fi folosita pentru a crea un site web cu apartamente de inchiriat. Inmagazinam apartamentele ca si custom post type si folosim meta data pentru a inregistra detaliile. Cu ajutorul meta query, putem extrage cu usurinta apartamentele care pot gazdui 4 sau mai mule persoane, au balcon si sunt pentru nefumatori.

<?php
$args=array(
'post_type'=>'apartament',
'meta_query'=>array(
'relation'=>'AND',
array(
'key'=>'persoane',
'value'=>'4',
'compare'=>'>=',
'type'=>'NUMERIC'
),
array(
'key'=>'balcon',
'value'=>'1',
'type'=>'BINARY',
'compare'=>'='
),
array(
'key'=>'fumator',
'value'=>'0',
'type'=>'BINARY',
'compare'=>'='
)
)
);
?>

Din nou avem o interogare foarte modulara si foarte usor de inteles. Pentru a invata despre toti parametrii pe care ii poti folosi, studiaza sectiunea Custom Field Parameters din documentatia WP_Query.

Metode si proprietati

Odata ce ai facut o interogare, poti scoate multa informatie din obiectul tau. Poti gasi o lista completa despre Metode si Proprietati in Codex. Mai jos gasiti o lista cu cele pe care le folosesc mai des:

- $query

Iti arata sirul pe care l-ai transferat obiectului $wp_query. Poate fi foarte folositor in rezolvarea unor probleme mai avansate.

- $query_vars

Iti arata un associative array cu argumentele pe care le-ai transmis. Daca faci o multime de combinatii inainte de a transmite argumentele, acest instrument poate fi folositor daca vrei sa verifici ca totul este in regula.

- $posts

Tine posturile pe care le-ai solicitat in baza de date. O folosesc mai rar, dar e bine de stiut de unde vin posturile tale.

- $found_posts

Un mic instrument care iti arata cate obiecte a gasit (fara limita impusa de argumentul posts_per_page)

Putere mare, responsabilitate mare

In timp ce WP_Query iti da o gramada de instrumente cu care sa te joci, acesta are si dezavantaje. Multe persoane (inclusiv eu) sunt in culmea fericirii cand isi dau seama cat e de usor sa faci interogari peste tot in continut.

Totusi tineti minte ca mai multe interogari inseamna o incarcare suplimentara a serverului. Iar pe serverele tip “shared”, interogarile complexe pot fi daunatoare deoarece iti manaca RAM-ul, care este probabil cea mai deficitara resursa.

Asigurati-va ca verificati mai intai ce interogari sunt facute in pagina in mod automat (default). Ce sens are sa facem o noua interogare pentru ultimele articole in Front Page, atunci cand aceasta este facuta automat? Foloseste rezultatul unei interogari de cate ori poti, fara a mai genera o noua interogare.

Sursa: Smashing Magazine