meta_query 'compare' => 'IN'が機能しない


13

まず第一に、それが重複していることを知っていますが、古い回答はどれも役に立ちませんでした。

から投稿を検索していpost_metaます。これが私のコードで、現在は何も返しません。

$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;

削除すればmeta_query動作します。私はこれらのことを確信しています:

  • keyまたはにスペルミスはありませんvalue
  • ポストタイプは post
  • そこ「system_power_supply」内の「一」の値を持つポストが。ただし、投稿フィールドは高度なカスタムフィールドによって生成されます。

system_power_supplyシリアライズ?
Howdy_McGee

はい、そうです。これがpostmetaテーブルの値です a:1:{i:0;s:6:"single";}
Rizwan

2
まあそれはあなたの問題です、メタクエリはシリアル化されたデータでは機能しません。このサイトでシリアル化されたデータのクエリを検索すると、いくつかの答えが見つかりますが、理想的な方法はありません。
ミロ

回答:


13

メタクエリでシリアル化された値を検索する簡単な方法はありません。値のリストが長すぎない場合は、複数のメタクエリを設定できる可能性があります。

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

または、超豪華なものにしたい場合は、動的に設定できます。

$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',
    );
}

本当にありがとう、仲間。私があなたがどれほど大きな頭痛の種を解決したのかは言えません。
リズワン2015

ところで、meta_queryでクエリを実行できないのに、なぜmeta_valueにシリアル化されたデータが含まれているのですか?これはワードプレスのバグですか?
リズワン2015

1
私は女性です。「仲間」ではありませんが、問題ありません。Advanced Custom Fieldsがデータを保存する方法のため、meta_valueにはシリアル化されたデータが含まれています。確かに、それは理想的ではありません。
Jen

1
母さん、お詫び申し上げます。2番目と3番目はうまくいき、最初のものは試しませんでした。
リズワン2015

2
最初のものは削除できますが、機能しません
Toskan

4

久しぶりですが、誰かに同じ問題が発生した場合のために。さて、問題が見つかるまで何時間も髪を引っ張っていました。「IN」比較演算子を使用した「meta_query」は、通常の配列を受け入れないようです。代わりに、まず '、'で結合する必要があります。

したがって、あなたの場合、このようなものがうまくいくはずです:

$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;

WP 5では、配列を値のキーに直接渡すことができます。文字列に分解すると、wpが文字列をIN()パーツのセグメントに分割する方法に関して予期しない結果が生じる可能性があります。例えば、'this that', 'and', 'that'なり'this','that','and','that'-これだけそれに配列を与えた方がよいようです。
バナナアップル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.