ti-enxame.com

Consulta todas as postagens em que uma meta-chave não existe

Eu estou tentando obter uma consulta para recuperar todos os posts onde um meta_key específico não existe e, em seguida, criá-lo.

Estou tendo problemas para encontrar essas postagens, pois a consulta que estou testando parece não funcionar.

Aqui está o código que estou usando para tentar obter essas postagens:

$args = array(
   'posts_per_page' => 18,
   'cat'=>1955,
   'post_status'=>'publish',
   'meta_query' => array(
                  array(
                     'key' => 'colors',
                     'compare' => 'NOT EXISTS'
                  ),
   ));      

query_posts($args);

Isso não retorna nada se não houver posts com a chave colors, mas retorna ids dos posts com a chave colors sempre que a chave estiver presente (o oposto do que eu preciso). Eu tentei com EXIST vez, mas sem sorte.

Se alguém puder me avisar sobre a maneira correta de criar uma consulta como a que eu preciso, eu apreciarei.

Obrigado!

45
JordanBel

Eu fiz mais alguns testes com isso, e honestamente não consigo encontrar uma razão para que isso não funcione (a menos que o código acima seja apenas um trecho e o código real se encaixe nos meus exemplos abaixo). No entanto, descobri algumas coisas que podem levá-lo à direção certa.

1) Por si só, esta meta-consulta é o equivalente de "colors ISNULL", isto é, retornará os posts que não possuem aquela chave definida na tabela postmeta. Este é o caso mostrado acima, e deveria ter funcionado.

'meta_query' => array(
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // this should work...
    ),
)

2) Estabelecer o índice de 'relação' para 'OR', entretanto, altera essa condição. Isso retorna o oposto. Não me pergunte por quê. Isso é especialmente importante ao fazer várias metatrálises. Isso significa que inicialmente não é possível fazer uma consulta por postagens que tenham a chave 'colors' definida como 'blue' (ou qualquer outra) ou não configuradas. A consulta abaixo irá ignorar a primeira condição e retornar apenas aqueles que correspondem à segunda condição.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // doesn't work
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

3) No entanto, podemos enganar o WordPress para usar a primeira condição se definirmos o 'valor'. Ele não precisa de um valor relevante (é ignorado, até onde eu sei), mas ele precisa ser definido para que a condição NOT EXISTS tenha algum efeito.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS', // works!
     'value' => '' // This is ignored, but is necessary...
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

Isso é verdade no WordPress 3.5. Talvez não seja intencional e eles consertarão isso em versões futuras, mas pode haver uma razão pela qual isso se comporta dessa maneira, e essa é uma solução viável.

69
Tomas Buteler

Usando uma consulta personalizada, isso funcionou para mim:

SELECT * FROM wp_posts as posts
            WHERE   posts.post_type     = 'post'
            AND NOT EXISTS (
              SELECT * FROM `wp_postmeta`
               WHERE `wp_postmeta`.`meta_key` = "your_meta_key"
                AND `wp_postmeta`.`post_id`=posts.ID
            ) 
10
i_a