Come utilizzare l'operatore LIKE nelle query di tassonomia in WordPress
Ho una tassonomia chiamata "color" associata a un custom post type. Sto elencando tutti i post meta e la tassonomia in una tabella. Ho un'opzione nella tabella per cercare i post che corrispondono al valore di ricerca.
Quando viene inserita una chiave di ricerca, viene effettuata una chiamata AJAX per ottenere i post.
Questa è la query per ottenere tutti i post che corrispondono alla stringa di ricerca:
function get_query_posts_custom($post_id,$start,$length) {
// argomenti per 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
);
// ottiene la tassonomia del custom post
$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;
}
Come posso ottenere i post che corrispondono alla stringa di ricerca di una tassonomia?
Ho cercato nella documentazione di WordPress e dice che gli unici operatori consentiti per tax_query sono 'IN, NOT IN, OR e AND'. Posso usare l'operatore LIKE?

L'unica opzione che hai è scrivere il tuo SQL personalizzato nel filtro posts_clauses
, dove riceverai un array delle clausole JOIN
, WHERE
, ORDER
, ecc. che puoi modificare, aggiungere, rimuovere, ecc.
Una NOTA IMPORTANTISSIMA su questo è di USARE SEMPRE la funzione prepare
della variabile globale $wpdb
, che sanificherà tutti i tuoi dati. Non vuoi permettere alcun tipo di iniezione attraverso le tue query personalizzate di ricerca. :)

Come indicato in altre risposte, non puoi semplicemente fare una ricerca di tipo LIKE
utilizzando tax_query
.
Quello che puoi fare è modificare la dichiarazione SQL
utilizzando i filtri come suggerito da @Eric Holmes, che è una tecnica avanzata. Devi sapere cosa stai facendo.
Oppure puoi semplicemente fare una query separata caricando prima i termini della tassonomia (usando LIKE
) e poi caricare i post effettivi.
Ecco un semplice esempio per caricare i post che sono in relazione con qualsiasi termine che corrisponda a un confronto LIKE
con la variabile $search
.
// carica i termini usando LIKE
$termIds = get_terms([
'name__like' => $search,
'fields' => 'ids'
]);
// carica i post utilizzando gli ID dei termini trovati
$posts = get_posts([
'tax_query' => [
'relation' => 'OR',
[
'taxonomy' => 'yourtaxonomy',
'field' => 'id',
'terms' => $termIds,
],
[
'taxonomy' => 'othertaxonomy',
'field' => 'id',
'terms' => $termIds,
],
],
]);

WP_Tax_Query o rispettivamente il Parametro di Tassonomia di WP_Query
o get_posts()
accetta solo i seguenti valori per l'argomento operator
:
'operator' string (opzionale)
Valori possibili: 'AND', 'IN' o 'NOT IN'.
Default: 'IN'
Quindi non puoi utilizzare LIKE
come operator
.

In realtà non è necessario utilizzare operatori di confronto negli argomenti delle query tassonomiche (ma nelle query sui metadati, sì).
Quindi, questa parte modificata dovrebbe comportarsi come se utilizzasse 'LIKE' per impostazione predefinita:
foreach($taxonomies as $taxonomy) {
$tax_query = array(
'taxonomy' => $taxonomy;
'field' => 'slug';
'terms' => $search;
);
}
