meta_query 'compare' => 'IN' no funciona

13

En primer lugar, sé que es un duplicado, pero ninguna de las respuestas anteriores fue útil.

Estoy buscando en las publicaciones a través 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 lo elimino meta_queryfunciona. Estoy seguro de estas cosas:

  • No hay error de ortografía en el keyo el value.
  • tipo de publicación es post
  • No es un puesto con el valor 'single' en 'system_power_supply'. Sin embargo, los campos de publicación se generan mediante campos personalizados avanzados .
Rizwan
fuente
está system_power_supplyserializado?
Howdy_McGee
sí lo es. Aquí está el valor en la tabla postmeta a:1:{i:0;s:6:"single";}
Rizwan
2
bueno, ese es tu problema, la meta consulta no funcionará en datos serializados. si busca en este sitio para consultar datos serializados, encontrará algunas respuestas, pero ningún método será ideal.
Milo

Respuestas:

13

No hay una manera fácil de buscar valores serializados en una meta consulta. Si la lista de valores no es larga, posiblemente podría configurar múltiples metaconsultas:

'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 quisiera ser súper elegante, podría 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',
    );
}
Jen
fuente
Muchas gracias hermano. No puedo decirte qué gran dolor de cabeza me has resuelto.
Rizwan
por cierto, ¿por qué el meta_valor contiene datos serializados si no podemos realizar consultas a través de meta_query? ¿Es este error de WordPress?
Rizwan
1
Soy una mujer, no un "hermano", pero no hay problema. El meta_valor contiene datos serializados debido a la forma en que Advanced Custom Fields guarda los datos. No es ideal, seguro.
Jen
1
jaja, me disculpo con mi señora. El segundo y el tercero funcionaron bien, no probé el primero.
Rizwan
2
puedes quitar el primero, no funciona
Toskan
3

Sé que ha pasado mucho tiempo, pero por si acaso alguien tiene el mismo problema. Bueno, he estado tirando de mi cabello durante horas antes de encontrar el problema: 'meta_query' con el operador de comparación 'IN' no parece aceptar la matriz habitual. en su lugar, debe unirlo primero con ','.

Entonces, en su caso, algo como esto 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;
Badr
fuente
En WP 5 puede pasar la matriz directamente a la clave de valor. Si lo implosiona en una cadena, puede obtener resultados inesperados con respecto a cómo wp divide la cadena en segmentos para la IN()parte. Por ejemplo, se 'this that', 'and', 'that'convierte 'this','that','and','that', por lo que parece ser mejor simplemente darle la matriz.
Bananaapple