meta_query 'compare' => 'IN' no funciona
En primer lugar, sé que es un duplicado, pero ninguna de las respuestas anteriores fue de ayuda.
Estoy buscando en las entradas a través de post_meta
. Aquí está mi código, que actualmente no devuelve nada.
$args = array(
'numberposts' => -1,
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'system_power_supply',
'value' => array('single', 'redundant'),
'compare' => 'IN',
)
)
);
$query = new WP_Query($args);
echo $query->found_posts;
Si elimino meta_query
funciona. Estoy seguro de estas cosas:
- No hay errores de escritura en la
key
o elvalue
. - El tipo de entrada es
post
- Hay una entrada con el valor 'single' en 'system_power_supply'. Sin embargo, los campos de la entrada son generados por Advanced Custom Fields.

No hay una manera sencilla de buscar valores serializados en una meta query. Si la lista de valores no es extremadamente larga, potencialmente podrías configurar múltiples meta queries:
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'system_power_supply',
'value' => 'single',
'compare' => 'LIKE',
),
array(
'key' => 'system_power_supply',
'value' => 'redundant',
'compare' => 'LIKE',
)
)
O si quieres ser más sofisticado, podrías configurarlo dinámicamente:
$values_to_search = array('single', 'redundant');
$meta_query = array('relation' => 'OR');
foreach ($values_to_search as $value) {
$meta_query[] = array(
'key' => 'system_power_supply',
'value' => $value,
'compare' => 'LIKE',
);
}

Muchas gracias, hermano. No puedo decirte el gran dolor de cabeza que me has quitado.

Por cierto, ¿por qué el meta_value contiene datos serializados si no podemos consultarlos mediante meta_query? ¿Es esto un error de WordPress?

Soy mujer, no un "hermano", pero no hay problema. El meta_value contiene datos serializados por la forma en que Advanced Custom Fields guarda la información. No es lo ideal, definitivamente.

jaja, me disculpo mi señorita. La segunda y tercera funcionaron bien, no probé la primera.

Sé que ha pasado mucho tiempo, pero por si alguien tiene el mismo problema. Estuve desesperándome durante horas antes de encontrar el problema: 'meta_query' con el operador de comparación 'IN' no parece aceptar el array habitual. En su lugar, necesitas unirlo primero con ', '.
Entonces, en tu caso, algo así debería funcionar:
$args = array(
'posts_per_page' => -1,
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'system_power_supply',
'value' => join(', ', array('single', 'redundant')),
'compare' => 'IN',
)
)
);
$query = new WP_Query($args);
echo $query->found_posts;

En WP 5 puedes pasar el array directamente a la clave 'value'. Si lo conviertes a string con implode, podrías obtener resultados inesperados en cuanto a cómo WP divide la cadena en segmentos para la parte IN()
. Por ejemplo, 'this that', 'and', 'that'
se convierte en 'this','that','and','that'
- por lo que parece mejor simplemente darle el array.
