Cum să utilizezi operatorul LIKE în interogări de taxonomie WordPress
Am o taxonomie numită "culoare" asociată cu un tip de postare personalizat. Afișez toate metadatele postărilor și taxonomia într-un tabel. Am o opțiune în tabel pentru a căuta postările care se potrivesc cu valoarea introdusă.
Când se introduce o cheie de căutare, se face un apel AJAX pentru a obține postările.
Iată interogarea pentru a obține toate postările care se potrivesc cu șirul de căutare:
function get_query_posts_custom($post_id,$start,$length) {
// Argumente pentru get_posts
$args = array(
'post_type' => 'custom_post',
'post_status' => array('publish'),
'numberposts' => $length,
'offset' => $start,
'orderby' => 'menu_order',
'order' => 'asc',
'post_parent' => $_product->id
);
// Obține taxonomia postării personalizate
$taxonomies = (array) maybe_unserialize(get_post_meta( $post_id, 'post_taxonomy', true));
if(empty($attributes)) {
$taxonomies = array();
}
$meta_keys = array('type','code','key');
if(!empty($search)) {
foreach($meta_keys as $meta_key) {
$meta_query[] = array(
'key' => $meta_key,
'value' => $search,
'compare' => 'LIKE'
);
}
$args['meta_query'] = $meta_query;
$tax_query = array();
foreach($taxonomies as $taxonomy) {
$tax_query = array(
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $search,
'operator' => 'LIKE'
);
}
if(count($tax_query)) {
$args['tax_query'] = $tax_query;
}
}
$results = get_posts($args);
return $results;
}
Cum pot obține postările care se potrivesc cu șirul de căutare pentru o taxonomie?
Am căutat în documentația WordPress și am văzut că singurii operatori permisi pentru tax_query sunt 'IN', 'NOT IN', 'OR' și 'AND'. Pot folosi operatorul LIKE?

Singura opțiune pe care o ai este să scrii propriul tău SQL în filtrul posts_clauses
, unde primești un array cu clauzele JOIN
, WHERE
, ORDER
, etc. pe care le poți modifica, adăuga, elimina și așa mai departe.
O NOTĂ FOARTE IMPORTANTĂ legată de acest lucru este să folosești ÎNTOTDEAUNA funcția prepare
din globalul $wpdb
, care va sanitiza toate datele tale. Nu vrei să permiți niciun fel de injecție prin interogările personalizate ale termenilor de căutare. :)

După cum s-a menționat în alte răspunsuri, nu poți efectua o căutare de tip LIKE
folosind tax_query
.
Ceea ce poți face este fie să modifici instrucțiunea SQL
utilizând filtre, așa cum a sugerat @Eric Holmes, care este o tehnică avansată. Trebuie să știi exact ce faci.
Alternativ, poți face o interogare separată pentru a încărca mai întâi termenii de taxonomie (folosind LIKE
) și apoi să încarci postările efective.
Iată un exemplu simplu pentru încărcarea postărilor care sunt în relație cu orice termeni care se potrivesc cu o comparație LIKE
împotriva variabilei $search
.
// încarcă termenii folosind LIKE
$termIds = get_terms([
'name__like' => $search,
'fields' => 'ids'
]);
// încarcă postările folosind ID-urile termenilor găsite
$posts = get_posts([
'tax_query' => [
'relation' => 'OR',
[
'taxonomy' => 'yourtaxonomy',
'field' => 'id',
'terms' => $termIds,
],
[
'taxonomy' => 'othertaxonomy',
'field' => 'id',
'terms' => $termIds,
],
],
]);

WP_Tax_Query sau parametrul de Taxonomie al WP_Query
sau get_posts()
acceptă doar următoarele valori pentru argumentul operator
:
'operator' string (opțional)
Valori posibile: 'AND', 'IN' sau 'NOT IN'.
Implicit: 'IN'
Deci nu poți folosi LIKE
ca operator
.

De fapt, nu este nevoie să folosești operatori de comparație în interogările de taxonomie (dar în interogările meta, da).
Deci, această parte modificată ar trebui să se comporte ca și cum ar folosi implicit 'LIKE':
foreach($taxonomies as $taxonomy) {
$tax_query = array(
'taxonomy' => $taxonomy;
'field' => 'slug';
'terms' => $search;
);
}
