Interroger toutes les publications où une clé méta n'existe pas

44

J'essaie d'obtenir une requête pour récupérer tous les messages pour lesquels un meta_key spécifique n'existe pas, puis le créer.

J'ai des problèmes pour trouver ces publications, car la requête que je teste ne semble pas fonctionner.

Voici le code que j'utilise pour essayer de récupérer ces posts:

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

query_posts($args);

Ceci ne renvoie rien s'il n'y a pas de messages avec la clé colors , mais les renvoie ids des messages avec la clé colors chaque fois que cette clé est présente (l'inverse de ce dont j'ai besoin). J'ai essayé avec EXIST à la place mais pas de chance.

Si j'arrive à me laisser savoir comment créer une requête semblable à celle dont j'ai besoin, je l'apprécierai.

Merci!

    
posée JordanBel 12.01.2013 - 17:48
la source

2 réponses

66

J'ai fait d'autres tests avec cela, et honnêtement, je ne trouve pas de raison pour laquelle cela ne fonctionnerait pas (à moins que le code ci-dessus ne soit qu'un extrait et que le code réel corresponde à mes exemples ci-dessous). J'ai toutefois découvert quelques éléments qui pourraient vous guider dans la bonne direction.

1) En elle-même, cette méta-requête est l’équivalent de "colors IS NULL", c’est-à-dire qu’elle renverra les publications qui n’ont pas cette clé définie dans la table postmeta. C’est le cas présenté ci-dessus, et cela aurait dû marcher.

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

2) L'établissement de l'index 'relation' sur 'OU' modifie toutefois cette condition. Il retourne le contraire. Ne me demande pas pourquoi. Ceci est particulièrement important lorsque vous effectuez plusieurs méta-requêtes. Cela signifie qu’à l’origine, il n’est pas possible de faire une requête pour les publications pour lesquelles la clé «couleurs» est définie sur «bleu» (ou autre) ou n’est pas définie du tout. La requête ci-dessous ignorera la première condition et renverra uniquement celles qui correspondent à la deuxième condition.

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

3) Cependant, nous pouvons tromper WordPress en utilisant la première condition si nous définissons la "valeur". Elle n'a pas besoin d'une valeur pertinente (elle est ignorée, autant que je sache), mais elle doit être définie pour que la condition NOT EXISTS ait un effet quelconque.

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

Cela est vrai à partir de WordPress 3.5. C’est peut-être involontaire et ils le corrigeront dans les versions futures, mais il pourrait y avoir une raison pour que cela se comporte de cette façon, et c’est une solution de contournement viable.

    
réponse donnée Tomas Buteler 16.01.2013 - 16:05
la source
10

L'utilisation d'une requête personnalisée a fonctionné pour moi:

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
            ) 
    
réponse donnée i_a 09.01.2015 - 22:50
la source

Lire d'autres questions sur les étiquettes