Fragen Sie alle Posts ab, bei denen kein Metaschlüssel vorhanden ist

50

Ich versuche, eine Abfrage zu erhalten, um alle Posts abzurufen, bei denen eine bestimmte meta_keynicht vorhanden ist, und sie dann zu erstellen.

Ich habe Probleme beim Finden dieser Beiträge, da die von mir getestete Abfrage 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 gibt colors, sondern sie idsder Posts mit dem Schlüssel, colorswenn dieser Schlüssel vorhanden ist (das Gegenteil von dem, was ich brauche). Ich habe es EXISTstattdessen 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!

JordanBel
quelle
Welche Version von WordPress verwenden Sie?
s_ha_dum
Hallo, entschuldige die Auslassung. Ich benutze v3.5
JordanBel
Es scheint, als ob diese Art von Abfrage (mit Compare auf NOT EXISTS gesetzt) ​​in 3.5 hinzugefügt wurde, also sollte es so funktionieren, wie es ist, soweit ich das sehe. Es wäre jedoch einfach, dies über eine benutzerdefinierte SELECT-Abfrage zu tun ...
Tomas Buteler
Danke, ich versuche es mit select. Ich muss vorher lernen, welche Tabellen abzufragen sind und wie die Abfrage
JordanBel
Sehr eigenartig. Ich kann kein Problem mit diesem Code erkennen und Sie verwenden 3.5+, weshalb ich gefragt habe. Haben Sie sich die Datenbank tatsächlich angesehen, um zu bestätigen, dass Ihre Daten so eingegeben werden, wie Sie es glauben?
s_ha_dum

Antworten:

73

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 an sich gleichbedeutend mit "colors IS NULL", dh 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) Vor WordPress 3.9 wird diese Bedingung geändert, wenn der 'Relations'-Index auf' OR 'gesetzt wird. 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 ist kein relevanter Wert erforderlich (er wird meines Wissens ignoriert), er muss jedoch festgelegt werden, damit die NOT EXISTSBedingung wirksam wird.

'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 galt bis WordPress 3.9. Wenn Sie noch eine ältere Version verwenden, ist dies eine praktikable Problemumgehung.

Tomas Buteler
quelle
Vielen Dank! Und entschuldige die Verspätung. Es kam zu einer Abfrage, aber ich werde Ihre Lösung in den nächsten Stunden testen, damit ich zurückwechseln kann und vielleicht, wenn dies funktioniert, wir anderen helfen können. Ich werde Sie informieren, sobald ich es überprüfen kann.
Nochmals vielen
Gut geschrieben und bestätigt, dass das Hinzufügen eines leeren Werts zu erwartenden Ergebnissen führt. Ich würde sagen, es ist unbeabsichtigt. Vielleicht lohnt sich ein Blick auf trac.wordpress.org, um zu sehen, ob es bereits ein Ticket gibt. Wenn nicht, ist dies reproduzierbar.
Taylor Dewey
Vielen Dank für die großartige Erklärung und Lösung für den Trick von WP :) Ich habe einige Zeit gebraucht, um hierher zu kommen - aber jetzt möchte ich mindestens zehn Mal auf "upvote" klicken (wenn ich nur könnte;))
Lorem-Affe
Wenn ich compare EXISTS verwende, wird der Wert in neueren Versionen von WP (getestet in 4.2.2) leider nicht ignoriert
Igor Jerosimić
10
Das EXISTSund NOT EXISTS„Fehler“ , die Sie benötigt einen Wert angeben, wurde in WP 3.9 fixiert
trex005
11

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
            ) 
i_a
quelle