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 .

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',
    );
}

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;

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.