wake-up-neo.com

Wie prüfe ich einen einzelnen Zahlenwert gegen ein Array von meta_key-Werten?

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 $projectID210 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.

3
Els

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.

6
Els

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'
         )
     )
);
0
Kika