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

44

Estou tentando obter uma consulta para recuperar todas as postagens em que 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 eles ids dos posts com a chave colors sempre que essa chave estiver presente (o oposto do que eu preciso). Eu tentei com EXIST , mas sem sorte.

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

Obrigado!

    
por JordanBel 12.01.2013 / 17:48
fonte

2 respostas

66

Eu fiz mais alguns testes com isso e honestamente não consigo encontrar um motivo para não funcionar (a menos que o código acima seja apenas um trecho e o código real se encaixa 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 "cores IS NULL", isto é, ela retornará as postagens que não possuem essa chave configurada 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ê. Isto é especialmente importante ao fazer múltiplas consultas meta. 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 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 vale para o 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.

    
por Tomas Buteler 16.01.2013 / 16:05
fonte
10

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
            ) 
    
por i_a 09.01.2015 / 22:50
fonte