Acasă » Blog » Interogare MySQL dupa campuri personalizate

Interogare MySQL dupa campuri personalizate

Share this post on social!

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

Lasă un răspuns

Traian Constantin Predan

Traian Constantin Predan

Inginer absolvent al Politehnicii București proiectează și construiește sisteme online. Lucrează proiecte extrem de diverse, îi plac viziunile noi care provoacă la dezvoltarea unor soluții tehnice eficiente și stabile.