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.
Luis Martins
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