meta_query 'compare' => 'IN' no funciona

3 abr 2015, 22:43:26
Vistas: 77.9K
Votos: 21

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 el value.
  • 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.
3
Comentarios

¿system_power_supply está serializado?

Howdy_McGee Howdy_McGee
3 abr 2015 22:52:46

sí, lo está. Aquí está el valor en la tabla postmeta

a:1:{i:0;s:6:"single";}

Rizwan Rizwan
3 abr 2015 23:20:01

ese es tu problema, las consultas meta no funcionan con datos serializados. si buscas en este sitio sobre consultar datos serializados encontrarás algunas respuestas, pero ningún método será ideal.

Milo Milo
3 abr 2015 23:30:36
Todas las respuestas a la pregunta 2
7
22

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',
    );
}
3 abr 2015 23:31:58
Comentarios

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

Rizwan Rizwan
3 abr 2015 23:52:29

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

Rizwan Rizwan
3 abr 2015 23:53:27

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.

Jen Jen
6 abr 2015 18:38:30

Por cierto, ¿qué solución te funcionó?

Jen Jen
6 abr 2015 18:40:18

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

Rizwan Rizwan
6 abr 2015 19:14:18

Es inusual ver a una programadora mujer que no muerde para nada :D

Rizwan Rizwan
6 abr 2015 19:22:58

puedes eliminar el primero, no funciona

Toskan Toskan
13 mar 2016 00:13:29
Mostrar los 2 comentarios restantes
1

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;
21 dic 2017 13:39:19
Comentarios

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.

Bananaapple Bananaapple
3 may 2019 12:43:04