Usando get_terms() con parámetros meta_query
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?

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

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.

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
