Consulta de taxonomías en WordPress usando el operador LIKE
Tengo una taxonomía llamada "color" que está asociada a un tipo de post personalizado. Estoy listando todos los meta datos del post y la taxonomía en una tabla. Tengo una opción en la tabla para buscar los posts que coincidan con el valor de búsqueda.
Cuando se ingresa una clave de búsqueda, se realiza una llamada AJAX para obtener los posts.
Esta es la consulta para obtener todos los posts que coincidan con la cadena de búsqueda:
function get_query_posts_custom($post_id,$start,$length) {
// Argumentos para 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
);
// Obtener taxonomías del post personalizado
$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;
}
¿Cómo obtener los posts que coincidan con la cadena de búsqueda de una taxonomía?
Busqué en la referencia de funciones de WordPress y dice que los únicos operadores permitidos para tax_query son 'IN, NOT IN, OR y AND'. ¿Puedo usar el operador LIKE?

La única opción que tienes es escribir tu propio SQL en el filtro posts_clauses
, donde obtienes un arreglo de las cláusulas JOIN
, WHERE
, ORDER
, etc. que puedes modificar, añadir, eliminar, etc.
Una NOTA MUY IMPORTANTE sobre esto es que SIEMPRE debes usar la función prepare
del global $wpdb
, que sanitizará todos tus preciosos datos. No querrás permitir ningún tipo de inyección a través de tus consultas personalizadas de términos de búsqueda. :)

Como se menciona en otras respuestas, no puedes simplemente hacer una búsqueda con LIKE
usando tax_query
.
Lo que puedes hacer es alterar la sentencia SQL
usando filtros como sugiere @Eric Holmes, lo cual es una técnica avanzada. Necesitas saber lo que estás haciendo.
O podrías hacer una consulta separada cargando primero los términos de la taxonomía (usando LIKE
) y luego cargar los posts reales.
Aquí hay un ejemplo simple para cargar posts que estén relacionados con cualquier término que coincida con una comparación LIKE
contra la variable $search
.
// cargar los términos usando LIKE
$termIds = get_terms([
'name__like' => $search,
'fields' => 'ids'
]);
// cargar los posts usando los IDs de términos encontrados
$posts = get_posts([
'tax_query' => [
'relation' => 'OR',
[
'taxonomy' => 'yourtaxonomy',
'field' => 'id',
'terms' => $termIds,
],
[
'taxonomy' => 'othertaxonomy',
'field' => 'id',
'terms' => $termIds,
],
],
]);

WP_Tax_Query o respectivamente el parámetro de Taxonomía de WP_Query
o get_posts()
solo acepta lo siguiente para el argumento operator
:
'operator' string (opcional)
Valores posibles: 'AND', 'IN' o 'NOT IN'.
Valor por defecto: 'IN'
Por lo tanto, no puedes usar LIKE
como operator
.

En realidad no necesitas usar argumentos/operadores de comparación en consultas de taxonomía (pero en consultas de metadatos, sí).
Por lo tanto, esta parte modificada debería comportarse como si usara 'LIKE' por defecto:
foreach($taxonomies as $taxonomy) {
$tax_query = array(
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $search
);
}
