meta_query 'compare' => 'IN' não está funcionando

13

Primeiro de tudo, eu sei que é uma duplicata, mas nenhuma das respostas mais antigas foi útil.

Estou pesquisando nas postagens post_meta. Aqui está o meu código, que atualmente não retorna 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;

Se eu removê- meta_querylo, funciona. Eu tenho certeza destas coisas:

  • Não há erro ortográfico no keyou no value.
  • o tipo de postagem é post
  • Não é um post com o valor 'single' em 'system_power_supply'. No entanto, os campos de postagem são gerados pelos campos personalizados avançados .
Rizwan
fonte
é system_power_supplyserializado?
Howdy_McGee
Sim, ele é. Aqui está o valor na tabela postmeta a:1:{i:0;s:6:"single";}
Rizwan
2
bem, esse é seu problema, a meta consulta não funcionará em dados serializados. se você pesquisar neste site para consultar dados serializados, encontrará algumas respostas, mas nenhum método será o ideal.
Milo

Respostas:

13

Não há uma maneira fácil de pesquisar valores serializados em uma meta consulta. Se a lista de valores não for muito longa, é possível que você possa configurar várias meta consultas:

'meta_query'    => array(
    'relation' => 'OR',
    array(
        'key'       => 'system_power_supply',
        'value'     => 'single',
        'compare'   => 'LIKE',
    ),
    array(
        'key'       => 'system_power_supply',
        'value'     => 'redundant',
        'compare'   => 'LIKE',
    )
)

Ou, se você quiser ser super sofisticado, poderá configurá-lo dinamicamente:

$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
fonte
Muito obrigado, mano. Não posso te dizer qual a grande dor de cabeça que você resolveu da minha.
Rizwan
btw, por que o meta_value que contém dados serializados se não conseguimos consultar através de meta_query? É o bug deste wordpress?
Rizwan
11
Eu sou uma mulher, não um "irmão", mas não há problema. O meta_value contém dados serializados devido à maneira como os campos personalizados avançados salvam os dados. Não é o ideal, com certeza.
21415 Jen
11
haha, peço desculpas a minha senhora. O segundo e o terceiro funcionaram bem, não experimentaram o primeiro.
Rizwan
2
você pode remover o primeiro, ele não funciona
Toskan
4

Sei que já faz muito tempo, mas no caso de alguém ter o mesmo problema. Bem, eu tenho puxado meu cabelo por horas antes de encontrar o problema: 'meta_query' com o operador de comparação 'IN' parece não aceitar a matriz usual. em vez disso, você precisa associá-lo primeiro a ','.

Portanto, no seu caso, algo assim deve 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
fonte
No WP 5, você pode simplesmente passar a matriz diretamente para a chave de valor. Se você a implodir em uma sequência, poderá obter resultados inesperados em relação à forma como o wp divide a sequência em segmentos para a IN()peça. Por exemplo, 'this that', 'and', 'that'torna 'this','that','and','that'- se - então parece ser melhor fornecer apenas a matriz.
Bananaapple