WP: Custom Select Query


După cum promiteam, continui cu câteva articole mai tehnice despre WordPress. Astăzi mă opresc la problema cunoscută sub numele Custom Select Query. Ea este amplu dar incomplet tratată pe situl WordPress.org (vezi linkul anterior). Dar să vedem despre ce este vorba. Autorii de situri WordPress pot în anumite contexte să dorească să afişeze nişte articole după nişte criterii mai complicate. WordPress pune la dispoziţie funcţia query_posts() care se poate dovedi foarte utilă dacă dorim o filtrare după categorie, autor, articol/pagină sau timp. În principiu toate aceste filtrări sunt deja oferite prin arhive: după categorie, după autor, respectiv a articolelor după timp (lună, an). Şi totuşi, un sit cu 5 categorii ar putea să dorească în mod special ca o categorie să aibă o altă afişare, după un alt template. Implementarea nu este complicată dar nici foarte simplă. În primul rând trebuie. Presupunând că id-ul categoriilor sunt (fictiv) 10, 21, 32, 43 şi 54 atunci în pagina implicită pentru categorii trebuie înainte de linia cu:

if (have_posts())

să se indice (tot între taguri PHP) următoarea comandă:

query_posts(’cat=10,21,32,43&showposts=10’);

Cu acest apel filtrăm ca respectiva pagină de template să afişeze doar din primele patru categorii. Puteam desigur să folosim şi cat=-54 pentru a elimina ultima categorie. Mai rămâne să creem o nouă pagină de template pentru categoria 5 (cu id-ul 54), după cum dorim să arate, şi să folosim:

query_posts(’cat=54&showposts=10’);

Atât! Lucrurile merg foarte bine: WordPress va pune şi sistemul de paginare dacă sunt articole peste limita de posts per page. Dar problema devine mult mai dificilă dacă dorim o filtrare mai complexă, la care parametrii de la query_posts() nu ne ajung. Cazuri: avem articole şi asociate lor nişte valori cu custom fields. Nu există parametri în query_posts() pentru aşa ceva, dar noi dorim să afişăm doar articolele care au un anumit câmp cu o anumită valoare. Sau poate avem o bază de date în afara celor WordPress, în conjuncţie cu care dorim să selectăm anumite articole. Sau orice altă situaţie… Ce facem? WordPress oferă, am spus deja de la început, soluţia cu custom select query, care poate fi o interogare 100% liberă de constrângeri (adică poate fructifica orice tabelă din baza de date). Pagina de pe WordPress.org oferă codul pentru interogare, chiar şi o pagină completă de template ca sursă de inspiraţie. Există însă o mare problemă: paginarea…

Exemplul din documentaţie afişează toate articolele (fie ele 10 sau 1000) care corespund criteriilor din interogare. Ori, normal, noi dorim să fie afişate doar n (5, 10… cât am stabilit în back-end-ul WP) şi cu posibilitatea de navigarea la pagina următoare, cu următoarele n articole. WordPress.org nu oferă soluţia, iar o discuţie pe secţiunea Support lasă subiectul în aer deşi figurează ca [rezolved]. Iată în continuare soluţia. Chiar dacă nu vă interesează problema, soluţia vă oferă un contact cu nişte aspecte interne ale WordPress care vă pot fi de folos cândva. Înainte de interogare punem următorul cod:

$ppp = get_option(’posts_per_page’)-0;
$paged = get_query_var(’paged’)-0;
if($paged == 0)
  $paged = 1;

Să traduc. Prima linie ia din opţiunile WordPress valoarea posts_per_page. În back-end fiecare administrator poate stabili câte articole să fie afişate într-o pagină (când nu este afişat exclusiv unul). Vom folosi acea valoare pe care am extras-o cu get_option(). Urmaţi linkul dat pentru a vedea ce alte valori setate în WordPress pot fi aflate cu această utilă funcţie. În a doua linie de cod am extras parametrul paged curent al paginii (din url, invizibil dacă folosim permalink). Dacă este zero înseamnă că suntem pe prima pagină şi punem forţat $paged pe 1. Acum desigur va trebui să modificăm interogarea, respectiv ea să se termine în:

... LIMIT ".($paged-1)*$ppp.",".$ppp;

Mai rămâne doar ca la finalul template-ului (după endif) să includem linkurile pentru navigare. Testăm dacă este cazul să afişăm link spre pagina anterioară sau spre cea următoare.

if($paged>1)
  echo "<a href=".get_pagenum_link(($paged-1)).">Pagina anterioara</a> ";
if($paged*$ppp<$numposts)
  echo "<a href=".get_pagenum_link(($paged+1)).">Pagina urmatoare</a>";

Gata! Acum şi această pagină are sistemul de navigare implicit la WordPress. Poate WordPress va creşte în versiunile următoare complexitatea funcţiei query_posts() pentru a evita complicaţiile (de doar câteva linii de cod) de mai sus. Poate nu. Dacă nu, există un work-around pe care tocmai l-am descris. Succes!


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (Neevaluat încă)
Loading...Loading...

0 comentarii


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *