Es scheint eine Menge Informationen darüber zu geben, wie man einen meta_key
mit einem Array von meta_values
vergleicht, aber ich möchte das Gegenteil tun.
Ich habe eine Website mit Projekten und Pressestimmen. Wenn der Kunde eine Überprüfung hinzufügt, verfügt er über ein benutzerdefiniertes Feld (ACF), um das Projekt, auf das er sich bezieht, aus einer Liste auszuwählen.
Ich versuche jetzt, alle Pressestimmen, die sich auf ein bestimmtes Projekt beziehen, zusammen auf einer Seite anzuzeigen. Ich habe die Projekt-ID und benutze eine Abfrage mit $ args, um die gewünschten Pressestimmen auszuwählen.
Mein aktueller $args
:
$args = array(
'post_type' => 'pressreview',
'order' => DESC,
'meta_query' => array(
array(
'key' => 'belongs_to_project',
'value' => $projectID,
'compare' => 'LIKE'
)
)
);
Das Problem ist, dass das benutzerdefinierte Feld 'belongs_to_project
' ein Array mit IDs zurückgibt. Eine Presseschau kann sich auf mehrere Projekte beziehen, sodass der Kunde mehrere Projekte aus der Liste in diesem Feld auswählen kann. Ein typisches Array sieht folgendermaßen aus:
Array ( [0] => 210 [1] => 202 ).
Was ich tun möchte, ist zu überprüfen, ob der $projectID
in diesem Array ist.
Im aktuellen Setup funktioniert das so: Wenn der Client 202 und 210 aus der Liste ausgewählt hat und der $projectID
210
ist, wird die Presseschau angezeigt. Wenn der $projectID = 20
jedoch vorhanden ist, erhalten wir Presseschau für Projekte 201
, 202
, 203
usw. (da diese Zahlen '20
' enthalten, funktioniert LIKE
).
Kann ich dieser Abfrage mitteilen, dass nur nach "ganzen" Zahlen gesucht werden soll? Damit "2" nur Überprüfungen für das Projekt 2
und nicht für 201
, 202
oder andere Zahlen mit einer 2 anzeigt?
Ich habe gesehen, dass anstelle von REGEXP
eine LIKE
-Option verwendet werden kann, aber ich kann nicht herausfinden, wie sie so verwendet wird, dass nur nach "ganzen Zahlen" gesucht wird.
Ich habe auch 'IN
' ausprobiert, aber das funktioniert hier überhaupt nicht.
Eine Sache, an die ich gedacht habe, aber nicht weiß, ob es überhaupt möglich ist, ist, etwas zu verwenden wie:
'key' => 'belongs_to_project[$i]'
mit einer Art Schleife durch die Schlüsselwerte, sodass $projectID
mit '='
anstelle von LIKE
mit jedem der Werte im Array des benutzerdefinierten Felds verglichen werden kann. Ich habe keine Ahnung, ob es eine solche Option gibt und wie sie geschrieben werden sollte.
Hoffe, meine Erklärung ist klar genug, bitte lassen Sie mich wissen, wenn ich es besser erklären muss.
Die Lösung war, dass ich den Literalwert von $projectID
vergleichen musste, damit LIKE
eine exakte Zeichenfolge statt nur Zahlen vergleicht. Um $projectID
zu einem Literal zu machen, muss es in Anführungszeichen gesetzt werden.
Also habe ich diese Zeile geändert:
'value' => $projectID,
zu:
'value' => '"'.$projectID.'"',
Welches löst das Problem.
Ich glaube, dass Sie IN
bei compare
verwenden sollten, aber Sie sagten, dass dies nicht funktioniert. und mir fällt etwas auf (bitte verzeihen Sie mir, wenn dies ein Fehler ist): Sie schreiben ein Beispiel für ein Array
Array ( [0] => 210 [1] => 202 ).
dies bedeutet, dass der Wert im Array NUMERIC
ist und der Standardtyp 'CHAR' ist. also kannst du es versuchen
$args = array(
'post_type' => 'pressreview',
'order' => DESC,
'meta_query' => array(
array(
'key' => 'belongs_to_project',
'value' => $projectID,
'compare' => 'IN',
'type' => 'NUMERIC'
)
)
);