meta_query 'compare' => 'IN' funktioniert nicht

13

Zunächst weiß ich, dass es sich um ein Duplikat handelt, aber keine der älteren Antworten war hilfreich.

Ich suche in Beiträgen durch post_meta. Hier ist mein Code, der derzeit nichts zurückgibt.

$args   =   array(
    'numberposts'   => -1,
    'post_type'     => 'post',
    'meta_query'    => array(
        array(
            'key'       => 'system_power_supply',
            'value'     => array('single', 'redundant'),
            'compare'   => 'IN',
        )
    )

);

$query = new WP_Query($args);
echo $query->found_posts;

Wenn ich es entferne meta_query, funktioniert es. Ich bin mir dieser Dinge sicher:

  • Es gibt keinen Rechtschreibfehler in der keyoder der value.
  • Beitragstyp ist post
  • Es gibt einen Beitrag mit dem Wert 'single' in 'system_power_supply'. Post-Felder werden jedoch von erweiterten benutzerdefinierten Feldern generiert .
Rizwan
quelle
ist system_power_supplyserialisiert?
Howdy_McGee
ja ist es. Hier ist der Wert in der Postmeta-Tabelle a:1:{i:0;s:6:"single";}
Rizwan
2
Nun, das ist Ihr Problem. Meta-Abfragen funktionieren nicht mit serialisierten Daten. Wenn Sie auf dieser Website nach abgefragten serialisierten Daten suchen, finden Sie einige Antworten, aber keine Methode ist ideal.
Milo

Antworten:

13

Es gibt keine einfache Möglichkeit, serialisierte Werte in einer Metaabfrage zu suchen. Wenn die Werteliste nicht verrückt ist, können Sie möglicherweise mehrere Metaabfragen einrichten:

'meta_query'    => array(
    'relation' => 'OR',
    array(
        'key'       => 'system_power_supply',
        'value'     => 'single',
        'compare'   => 'LIKE',
    ),
    array(
        'key'       => 'system_power_supply',
        'value'     => 'redundant',
        'compare'   => 'LIKE',
    )
)

Oder wenn Sie super schick werden möchten, können Sie es dynamisch einrichten:

$values_to_search = array('single', 'redundant');
$meta_query = array('relation' => 'OR');
foreach ($values_to_search as $value) {
    $meta_query[] = array(
        'key'       => 'system_power_supply',
        'value'     => $value,
        'compare'   => 'LIKE',
    );
}
Jen
quelle
Vielen Dank, Bruder. Ich kann dir nicht sagen, wie große Kopfschmerzen du von mir gelöst hast.
Rizwan
Übrigens, warum der meta_value, der serialisierte Daten enthält, wenn wir nicht in der Lage sind, meta_query abzufragen? Ist das WordPress Bug?
Rizwan
1
Ich bin eine Frau, kein "Bruder", aber kein Problem. Der meta_value enthält serialisierte Daten, da Advanced Custom Fields die Daten speichert. Es ist sicher nicht ideal.
Jen
1
haha, ich entschuldige mich bei meiner Dame. Zweiter und dritter funktionierten gut, habe den ersten nicht ausprobiert.
Rizwan
2
Sie können die erste entfernen, es funktioniert nicht
Toskan
3

Ich weiß, es ist lange her, aber nur für den Fall, dass jemand das gleiche Problem hat. Nun, ich habe stundenlang an meinen Haaren gezogen, bevor ich das Problem gefunden habe: 'meta_query' mit dem Vergleichsoperator 'IN' scheint das übliche Array nicht zu akzeptieren. Stattdessen müssen Sie zuerst ',' hinzufügen.

In Ihrem Fall sollte also so etwas funktionieren:

$args   =   array(
'posts_per_page'   => -1,
'post_type'     => 'post',
'meta_query'    => array(
    array(
        'key'       => 'system_power_supply',
        'value'     => join(', ', array('single', 'redundant')),
        'compare'   => 'IN',
    )
)
);
$query = new WP_Query($args);
echo $query->found_posts;
Badr
quelle
In WP 5 können Sie das Array einfach direkt an den Werteschlüssel übergeben. Wenn Sie es in eine Zeichenfolge implodieren, erhalten Sie möglicherweise unerwartete Ergebnisse hinsichtlich der Aufteilung der Zeichenfolge durch wp in Segmente für das IN()Teil. ZB 'this that', 'and', 'that'wird 'this','that','and','that'- also scheint es besser zu sein, ihm nur das Array zu geben.
Bananaapple