Abfrage aller Posts, bei denen kein Metaschlüssel existiert

Ich versuche, eine Abfrage zu erhalten, um alle Beiträge abzurufen, wo ein bestimmter meta_key nicht vorhanden ist, und es dann zu erstellen.

Ich habe Probleme, diese Beiträge zu finden, da die Abfrage, die ich teste, nicht zu funktionieren scheint.

Hier ist der Code, mit dem ich versuche, diese Posts zu bekommen:

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

Dies gibt nichts zurück, wenn es keine Posts mit den Schlüsselfarben gibt, aber gibt die ids der Posts mit den Schlüsselfarben zurück, wenn dieser Schlüssel vorhanden ist (das Gegenteil von dem, was ich brauche). Ich habe stattdessen mit EXIST versucht, aber kein Glück.

Wenn mir jemand auf die richtige Art antworten kann, eine Anfrage wie die, die ich brauche, zu erstellen, werde ich es zu schätzen wissen.

Vielen Dank!

Solutions Collecting From Web of "Abfrage aller Posts, bei denen kein Metaschlüssel existiert"

Ich habe damit mehr Tests gemacht und kann ehrlich gesagt keinen Grund finden, warum es nicht funktionieren würde (es sei denn, der obige Code ist nur ein Ausschnitt und der echte Code passt zu meinen Beispielen unten). Ich habe jedoch ein paar Dinge entdeckt, die Sie in die richtige Richtung führen könnten.

1) Diese Meta-Abfrage ist für sich genommen gleichbedeutend mit “colors IS NULL”, dh sie gibt die Posts zurück, die diesen Schlüssel nicht in der Postmeta-Tabelle haben. Dies ist der oben gezeigte Fall, und es hätte funktionieren sollen.

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

2) Wenn Sie den ‘relation’ Index auf ‘OR’ setzen, ändert sich diese Bedingung. Es kehrt das Gegenteil zurück. Frag mich nicht warum. Dies ist besonders wichtig, wenn Sie mehrere Meta-Abfragen durchführen. Das bedeutet, dass es zunächst nicht möglich ist, eine Abfrage nach Beiträgen durchzuführen, bei denen der Schlüssel “colors” auf “blau” (oder was auch immer) gesetzt oder überhaupt nicht gesetzt wurde. Die folgende Abfrage ignoriert die erste Bedingung und gibt nur diejenigen zurück, die der zweiten Bedingung entsprechen.

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

3) Allerdings können wir WordPress dazu bringen, die erste Bedingung zu verwenden, wenn wir den ‘Wert’ setzen. Es benötigt keinen relevanten Wert (es wird ignoriert, soweit ich weiß), aber es muss so eingestellt werden, dass die Bedingung NOT EXISTS keine Auswirkung hat.

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

Dies gilt ab WordPress 3.5. Vielleicht ist es unbeabsichtigt und sie werden es in zukünftigen Versionen beheben, aber es könnte einen Grund geben, warum sich das so verhält, und das ist eine praktikable Lösung.

Mit einer benutzerdefinierten Abfrage funktionierte das für mich:

 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 )