Am avut de curand de rezolvat o cerinta pentru sectiunea Intreaba veterinarul de pe site-ul AnimalZoo.ro (sectiunea nu mai este activa, nota din 12 octombrie 2016):
Obtinerea setului de articole din categoria “Intreaba veterinarul” filtrate dupa specie: caini, pisici, pasari, pesti, etc…
Specia este implementata ca si camp personalizat (custom field) corespunzator fiecarui articol in tabelul wp_postmeta. Este administrabil din pagina de editare articol – din sectiunea de administrare. Tot sistemul este realizat cu ajutorul plugin-ului Meta box al lui Rilwis.
Actionarea filtrului se face in frontend cu ajutorul meniului de specii. Link-ul pe fiecare specie este de forma:
http://www.animalzoo.ro/intreaba-veterinarul-azoo/?specie=caini
Pentru filtra setul de articole dupa specie, am nevoie sa modific obiectul $wp_query:
function tcp_intreaba_veterinarul_specie($query){
if (is_admin() && !$query->is_main_query()) return;
if (is_category('intreaba-veterinarul-azoo')){
if(isset($query->query_vars['specie'])){
$specia = urldecode($query->query_vars['specie']);
$meta_query = array(
array(
'key' => 'tcp_camp_personalizat_specie',
'value' => $specia,
'compare' => '='
)
);
$query->set('meta_query', $meta_query);
}
}
}
Acest script se ruleaza in hook-ul pre_get_posts, adica inainte de obtinerea setului de articole:
add_action('pre_get_posts', 'tcp_intreaba_veterinarul_specie');
Aceasta rezolva simplu ceea ce aveam de facut.
E important de observat ca scriptul care realizeaza paginatia pentru categoria Intreaba veterinarul – ca si pentru orice categorie din site-ul luat ca exemplu – functioneaza si cu acest filtru.
Url-urile obtinute astfel sunt de genul urmator:
http://www.animalzoo.ro/intreaba-veterinarul-azoo/page/2/?specie=caini
Asadar, avem un sablon al interogarii MySQl dupa articole cand conditia este ca un anumit camp personalizat sa aiba o valoare prestabilita.
Codex-ul este foarte bine documentat iar pagina despre WP_Query am vizitat-o de zeci de ori pentru construirea vectorului argumente pentru interogari dn cele mai diverse si complexe! Am folosit-o si in acest caz si sfatuiesc orice programator care lucreaza cu wordpress sa exploateze Codex-ul din plin … si cu folos!
Concluzie:
Este recomandabil ca intotdeauna sa se aplice pe hook-ul pre_get_posts modificarea interogarii principale si sa se evite folosirea lui query_posts care efectiv dubleaza obiectul $wp_query si consuma resurse importante pe server. Luati in calcul volumul de trafic atunci cand proiectati solutia la o anumita problema! Ar putea hotarator pentru alegerea variantei optime.
Programare vesela … ca a venit sfarsitul saptamanii!
Traian, 🙂
Află detalii privind realizarea site-urilor pe WordPress
Creare site WordPress
Sau ia legatura cu noi aici