Interogare MySQL dupa campuri personalizate

By

Traian

Optimizare, Wordpress

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, 🙂

 

Leave a Reply

Adresa ta de email nu va fi publicată.