Usando get_terms() con parámetros meta_query

2 jul 2016, 13:35:56
Vistas: 34.8K
Votos: 2

Estoy tratando de construir una consulta de taxonomía para mostrar solo los términos que tienen asignado un determinado valor de campo personalizado. El campo personalizado contiene un valor booleano, así que intenté:

$args = array(
        'taxonomy' => 'product_cat',
        'hide_empty' => false,
        'meta_key' => 'featured',
        'meta_value' => true
    );

También:

$args = array(
        'taxonomy' => 'product_cat',
        'hide_empty' => false,
        'meta_query' => array(
             array(
                'key'       => 'featured',
                'value'     => true,
                'compare'   => '='
             )
        )
    );

Ninguna de estas opciones devolvió los resultados esperados. ¿Qué me estoy perdiendo?

0
Todas las respuestas a la pregunta 1
5
12

Insertando valores booleanos en meta términos

Cuando añadimos un meta término que no existe con, por ejemplo:

add_term_meta( 123, 'test', true );

en realidad estamos ejecutando el siguiente insert:

$wpdb->insert( 'wp_termmeta', array(
   'term_id' => 123,
   'meta_key' => 'test',
   'meta_value' => true
) );

dentro de la función general add_metadata().

Ahora, wpdb::insert() es realmente un envoltorio para wpdb::_insert_replace_helper() que prepara la consulta SQL de inserción y mapea los valores de inserción a:

INSERT INTO `wp_termmeta` (`term_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)

o en nuestro caso de prueba:

INSERT INTO `wp_termmeta` (`term_id`, `meta_key`, `meta_value`) VALUES (123, 'test', '1')

También ten en cuenta que la columna meta_value es de tipo longtext en la tabla wp_termmeta.

Por lo tanto, el booleano true se almacena como la cadena '1'.

Obteniendo valores booleanos de meta términos

Cuando get_terms() se ejecuta con este tipo de consulta meta:

$args = array(
    'taxonomy'   => 'product_cat',
    'hide_empty' => false,
    'meta_query' => array(
         array(
            'key'       => 'featured',
            'value'     => true,
            'compare'   => '='
         )
    )
);

entonces la consulta SQL generada contiene:

wp_termmeta.meta_key = 'featured' AND wp_termmeta.meta_value = '1' 

donde el true (booleano) se convierte a '1' (cadena).

2 jul 2016 18:35:41
Comentarios

Todavía no logro que la consulta devuelva ningún resultado, usando una cadena "1" como valor pasado al meta_query pero seguiré investigando. Muchas gracias por la explicación detallada de todos modos.

Luis Martins Luis Martins
4 jul 2016 22:07:12

El valor meta true en la consulta get_terms() también se cambió a '1', así que creo que debes estar guardando los valores meta de los términos de manera diferente. ¿Cómo lo almacenas? ¿Qué tipo de código? ¿Quizás lo estás almacenando como el bool-string 'true'? @LuisMartins

birgire birgire
5 jul 2016 12:17:44

¿Algún avance con el problema? @LuisMartins

birgire birgire
23 jul 2016 16:11:46

Lo siento, me perdí por completo las notificaciones de SO.

Luis Martins Luis Martins
13 ago 2016 16:04:54

No hay problema, solo tenía curiosidad por eso ;-) @LuisMartins

birgire birgire
13 ago 2016 16:07:24