サポート » 使い方全般 » meta_queryの絞込みで、'relation' => 'OR' が効かない

  • 解決済 momokichi

    (@momokichi)


    Advanced Custom Fieldsのでチェックボックス(複数選択可)のカスタムフィールドを作成しました。

    フィールド名:week
    選択肢:
     w0 : 日曜
     w1 : 月曜
     ・
     ・
     w6 : 土曜

    ある投稿のweekフィールドにおいて、月・火・水にチェックを入れていると仮定し、
    関連記事として月・火・水の全てにチェックが入っている投稿だけを抽出する場合、

    $week_meta_arr;
    for($i=0;$i<=6;$i++) {
     $str = 'w'.$i;
     if( false !== array_search($str, get_field('week')) ) {
      $week_meta_arr[] = array(
       'key' => 'week',
       'value' => $str,
       'compare' => 'LIKE',
      );
     }
    }
    
    $args = array(
     'post_type' => 'posttype',
     'posts_per_page' => -1,
     'meta_query' => array(
     'relation' => 'AND',
     $week_meta_arr,
    );
    $the_query = new WP_Query($args);

    とすることで、絞り込みができたのですが、

    「月・火・水のいずれかにチェックが入っている記事」

    を抽出しようと思ってもうまくできません。
    meta_queryの’relation’ を ‘OR’にすれば行けると考えたのですが、
    ‘OR’にしても’AND’の挙動と変わらず、月・火・水の全てにチェックが入っていないと
    抽出されません。

    どのようにすれば、ORでの絞込が動くようになるのでしょうか?
    よろしくお願いします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • x743

    (@x743)

    print_r($the_query);
    

    ご掲示されたコードですと、$the_query->requestにmeta_queryの記述が見当たらないのではないかと思います(なぜANDで絞り込みができているのかは謎です…)。
    ということでネット上にあるサンプルなどと$the_query->queryを見比べてみると、meta_queryの形式が違っているのがわかります。

    どういった修正がいいのかはわかりませんが、

    $week_meta_arr = array( 'relation' => 'OR' );
    

    で初期化したうえで、ご掲示のコードで曜日を追加し、

    $args = array(
    	'post_type' => 'posttype',
    	'posts_per_page' => -1,
    	'meta_query' => $week_meta_arr,
    );
    

    という感じでWP_Queryに渡すパラメータをつくるのがいいのではないかと思います。

    あと、そのままでも大丈夫だとは思うのですが、ACFのサンプルにあるように曜日を追加するときは、

    'value' => '"'.$str.'"',
    

    と記述したほうが確実かもしれません…。

    yousan

    (@hogetan)

    手元で試してみました。

    下記のコードでうまく、「月、水、金」のいずれかにチェックが入っている記事を抜き出せました。

    $args = array(
        'post_type' => 'post',
        'posts_per_page' => -1,
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => 'week',
                'value' => 'w0', // 月
                'compare' => 'LIKE',
            ),
            array(
                'key' => 'week',
                'value' => 'w2', // 水
                'compare' => 'LIKE',
            ),
            array(
                'key' => 'week',
                'value' => 'w4', // 金
                'compare' => 'LIKE',
            ),
        )
    );
    //$the_query = new WP_Query($args);
    var_dump(get_posts($args));

    記述のところで生まれてしまったバグですね。
    meta_queryの中身が二重の配列になっているせいで認識できないんだと思います。

    下記のコードは質問者さんのコードに合わせた書き方です。

    for($i=0; $i<=6; $i++) {
        $str = 'w'.$i;
        $week_meta_arr[] = array(
            'key' => 'week',
            'value' => $str,
            'compare' => 'LIKE',
        );
    }
    $week_meta_arr['relation'] = 'OR';
    
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => -1,
        'meta_query' => $week_meta_arr,
    );
    var_dump(get_posts($args));

    トピック投稿者 momokichi

    (@momokichi)

    ありがとうございます。
    $week_meta_arrが2重配列になっていることに気付いておりませんでした。

    ご指摘のように、meta_queryに直接$week_meta_arrに渡すことで
    期待どおりの動きをするようになりました。

    また、お恥ずかしながら
    $the_query->query で中身をチェックできることを存じておりませんでした。

    一人だと延々と気付かないままハマっていたと思います。
    お二方には感謝申し上げます。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「meta_queryの絞込みで、'relation' => 'OR' が効かない」には新たに返信することはできません。