Consulta de taxonomías en WordPress usando el operador LIKE

7 feb 2014, 07:23:40
Vistas: 19.4K
Votos: 4

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?

3
Comentarios

¿Has probado la solución en este hilo: http://wordpress.stackexchange.com/questions/123298/term-begins-with-a-letter?

1fixdotio 1fixdotio
7 feb 2014 09:50:12

Intenté obtener el ID del término que coincide con la búsqueda usando la función get_terms con el argumento name_like y generar el tax_query con el operador IN.

B L Praveen B L Praveen
7 feb 2014 12:07:30

¿get_posts soporta el argumento operator en el tax_query? La Referencia de Funciones no menciona nada sobre tax_query con operator. Solo se explica en WP_Query.

B L Praveen B L Praveen
7 feb 2014 12:11:39
Todas las respuestas a la pregunta 4
1

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. :)

7 feb 2014 17:38:51
Comentarios

:) Agregué una nota para mantener tu base de datos segura también.

Eric Holmes Eric Holmes
7 feb 2014 18:12:22
2

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,
        ],
    ],
]);
23 feb 2018 14:54:52
Comentarios

esto es inteligente y más limpio, gracias.

gdaniel gdaniel
30 abr 2020 17:45:27

En el tax_query necesitarías usar term_id para el valor del campo.

adamalexanderw adamalexanderw
20 feb 2023 11:41:53
0

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.

7 feb 2014 12:21:08
0

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
            );
        }
28 mar 2020 12:56:51