it-swarm.com.de

Fragen Sie alle Beiträge ab, bei denen kein Metaschlüssel vorhanden ist

Ich versuche, eine Abfrage zu erhalten, um alle Posts abzurufen, bei denen ein bestimmter meta_key nicht vorhanden ist, und ihn 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 Beiträge 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 dem Schlüssel colors gibt, sondern sie ids der Posts mit dem Schlüssel colors, wenn dieser Schlüssel vorhanden ist (das Gegenteil von dem, was ich brauche). Ich habe es stattdessen mit EXIST versucht, aber kein Glück.

Wenn mir jemand einen Tipp geben kann, wie eine Abfrage wie die von mir benötigte richtig erstellt werden kann, bin ich dankbar dafür.

Vielen Dank!

45
JordanBel

Ich habe noch einige Tests damit durchgeführt 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 das Äquivalent von "colors IS NULL", d. H. Sie gibt die Posts zurück, für die dieser Schlüssel nicht in der Postmeta-Tabelle festgelegt ist. 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) Indem Sie den 'Relations'-Index auf' OR 'setzen, ändern Sie 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, nach Posts zu suchen, bei denen der Schlüssel 'colors' auf 'blue' (oder was auch immer) oder überhaupt nicht gesetzt ist. 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) Wir können WordPress jedoch dazu bringen, die erste Bedingung zu verwenden, wenn wir den 'Wert' setzen. Es benötigt keinen relevanten Wert (er wird meines Wissens ignoriert), aber es muss gesetzt werden , damit die NOT EXISTS-Bedingung eine Wirkung 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 dies so verhält, und dies ist eine praktikable Problemumgehung.

69
Tomas Buteler

Mit einer benutzerdefinierten Abfrage funktionierte dies 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
            ) 
10
i_a