Meta_query Vergleichsoperator Erklärung

37

Mir ist aufgefallen, dass es eine Reihe von Operatoren gibt, die zum Vergleichen in meta_query verwendet werden können. Ich bin mir jedoch nicht ganz sicher, welchen Operator ich verwenden soll, es ist irgendwie verwirrend wie =und LIKEOperator.

Ich möchte wissen, was genau jeder Operator bedeutet und in welchem ​​Zustand ich sie verwenden sollte.

=
!=
>
>=
<
<=
LIKE
NOT LIKE
IN
NOT IN
BETWEEN
NOT BETWEEN
NOT EXISTS

Vielen Dank.

Dev-Jim
quelle

Antworten:

50

Die ersten paar Arbeiten ungefähr so, wie Sie es erwarten würden:

=   equals
!=  does not equal
>   greater than
>=  greater than or equal to
<   less than
<=  less than or equal to

LIKEund NOT LIKEsind SQL-Operatoren, mit denen Sie Platzhaltersymbole hinzufügen können, sodass Sie möglicherweise eine Metaabfrage erhalten, die folgendermaßen aussieht:

array( 
    'key' => 'name', 
    'value' => 'Pat', 
    'compare' => 'LIKE'
)

Dies würde alle Posts zurückgeben, bei denen der Meta-Wert "name" die Zeichenfolge "Pat" enthält. In diesem Fall würden "Pat", "Patricia" und "Patrick" an Sie zurückgegeben. Es gibt eine nicht-Wordpress Tutorial Erklärung hier .

Das Hinzufügen des Platzhalterzeichens %ist nicht erforderlich, da es standardmäßig hinzugefügt wird, wie @Herb in seiner nachstehenden Antwort sagte . So: $meta_value = '%' . like_escape( $meta_value ) . '%';- siehe Quelle .

INund NOT INwählen Sie alle Übereinstimmungen aus, die im angegebenen Array enthalten sind (oder nicht). Sie könnten also so etwas tun:

array(
    'key'     => 'color', 
    'value'   => array('red', 'green', 'blue') 
    'compare' => 'IN'
)

und es würde alle Beiträge erhalten, deren Farbe entweder auf Rot, Grün oder Blau eingestellt ist. Wenn Sie 'NOT IN' verwenden, werden alle Posts umgekehrt, für die ein anderer Wert als der im Array angegebene festgelegt wurde.

Die generierte SQL dafür würde ungefähr so ​​aussehen:

SELECT * FROM posts_meta WHERE value IN ("red", "green", "blue") 

BETWEENund NOT BETWEENermöglichen es Ihnen, einen Wertebereich zu definieren, der korrekt sein kann, und erfordern, dass Sie in Ihrer meta_query zwei Werte in einem Array angeben:

array( 
    'key' => 'price', 
    'value' => array(20,30) 
    'compare' => 'BETWEEN'
)

Dadurch erhalten Sie alle Posts, bei denen der Preis zwischen 20 und 30 liegt. Diese Person führt ein Beispiel mit Datumsangaben an.

NOT EXISTSist genau so, wie es sich anhört - der Meta-Wert ist nicht festgelegt oder auf einen Null-Wert festgelegt. Alles, was Sie für diese Abfrage benötigen, ist der Schlüssel- und Vergleichsoperator:

array( 
    'key' => 'price', 
    'compare' => 'NOT EXISTS'
)

Diese Person musste nicht vorhandene Meta-Werte abfragen und sie brauchte, um nett mit anderen zu spielen.

Hoffe das hilft!

Jen
quelle
Hinweis: Wenn Sie ein meta_queryArray verwenden, sollte Ihren Schlüsseln kein Präfix vorangestellt werden meta_. Wenn Sie usw. verwenden $query->meta_key, $query->meta_valuesollten diese weiterhin das Präfix beibehalten.
Sean
Ich kann anscheinend keine Erklärung dafür finden, was die Vergleichsoption "IN" bewirkt. Irgendeine Idee, wie das funktioniert?
Joe
1
@ Joe, ich weiß nicht, warum ich nichts über "IN" und "NOT IN" hinzugefügt habe. Ich habe die Antwort mit diesen Vergleichen bearbeitet und aktualisiert.
Jen
7

Beachten Sie, dass WordPress bei Verwendung eines meta_compare-Werts von 'LIKE' automatisch das Platzhalterzeichen (%) um die meta_value-Zeichenfolge umschließt. Das Beispiel 'Pat%' kann also keine Ergebnisse zurückgeben.

bobbingwide
quelle
gibt es in den docs irgendwo infos dazu Herb? Sollte sich das Beispiel ändern, um das zu entfernen %?
Jen
Sollte es, das habe ich eigentlich gerade gemacht, die Quelle sehen , dann wird sehr deutlich, dass Herb Recht hat. @guiniveretoo
Nicolai