Consultar todas las publicaciones donde no existe una clave de metadatos

44

Estoy intentando obtener una consulta para recuperar todas las publicaciones donde no existe un meta_key específico y luego crearlo.

Tengo problemas para encontrar esas publicaciones porque la consulta que estoy probando no parece funcionar.

Aquí está el código que estoy usando para intentar obtener esas publicaciones:

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

query_posts($args);

Esto no devuelve nada si no hay publicaciones con la clave colors , pero las devuelve ids de las publicaciones con la clave colors siempre que esa clave esté presente (lo contrario de lo que necesito). Intenté con EXIST en su lugar, pero no tuve suerte.

Si alguien me puede recomendar la forma correcta de crear una consulta como la que necesito, se lo agradeceré.

¡Gracias!

    
pregunta JordanBel 12.01.2013 - 17:48

2 respuestas

66

Hice algunas pruebas más con esto, y honestamente no puedo encontrar una razón por la que no funcionaría (a menos que el código de arriba sea solo un fragmento y el código real encaje en mis ejemplos a continuación). Sin embargo, descubrí un par de cosas que podrían llevarte en la dirección correcta.

1) Por sí misma, esta consulta meta es el equivalente de "colores IS NULL", es decir, devolverá las publicaciones que no tienen esa clave establecida en la tabla postmeta. Este es el caso que se muestra arriba y debería haber funcionado.

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

2) El establecimiento del índice de "relación" en "O", sin embargo, cambia esta condición. Devuelve lo contrario. No me preguntes por qué. Esto es especialmente importante cuando se hacen múltiples consultas meta. Eso significa que inicialmente no es posible realizar una consulta para publicaciones que tienen la clave de "colores" establecida en "azul" (o lo que sea) o no está configurada en absoluto. La siguiente consulta ignorará la primera condición y devolverá solo las que coincidan con la segunda condición.

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

3) Sin embargo, podemos engañar a WordPress para que use la primera condición si establecemos el 'valor'. No necesita un valor relevante (se ignora, que yo sepa), pero debe configurarse para que la condición NOT EXISTS tenga algún efecto.

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

Esto es cierto a partir de WordPress 3.5. Tal vez no sea intencional y lo arreglarán en futuras versiones, pero podría haber una razón por la que esto se comporte de esta manera, y esta es una solución viable.

    
respondido por el Tomas Buteler 16.01.2013 - 16:05
10

Usando una consulta personalizada, esto funcionó para mí:

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
            ) 
    
respondido por el i_a 09.01.2015 - 22:50

Lea otras preguntas en las etiquetas