OHTA412

ACFのチェックボックスの値に応じて記事を絞り込む方法

ACF(Advanced Custom Fields)というプラグインで記事にチェックボックスの選択肢を追加したとき、チェックされている記事のみを取得する方法です。

チェックボックスが選択されている記事を取得

ACFの管理画面でチェックボックスのフィールドを追加するときnameを指定しますが、そのnameが絞り込みを行うときのkeyになります。

チェックボックスの各選択肢はvalueとlabelのセットで設定できますが、絞り込みに使うのはvalueの方です。「works_area」というチェックボックスフィールドの「hiroshima」というチェックボックスが選択されている記事を取得するクエリは、下記コードのようになります。

$args = [
    'posts_per_page' => 3,
    'post_type' => 'works',
    'meta_query' => [
        [
            'key' => 'works_area',
            'value' => 'hiroshima',
            'compare' => 'LIKE',
        ],
    ],
];

$posts = new WP_Query($args);
if( $posts->have_posts() ){
    while( $posts->have_posts() ){
        $posts->the_post();

        the_title();
    }
}

2行目のposts_per_pageは1ページに表示する記事数で、3行目のpost_typeは投稿タイプ名です。適宜変更してください。

ACFで追加したフィールドはmeta情報としてデータベースに保存されるので、4行目のようにクエリの中の「meta_query」という値を設定することで絞り込みができます。

meta_queryの値は配列になっていて、その配列の中にさらに配列が入っています。これは複数のチェックボックスの条件を設定できる仕組みを持っているためです。

複数のチェックボックスの値から記事を絞り込む

上記コードの例は「hiroshima」というチェックボックスが選択されている記事というクエリでしたが、「hiroshimaとosaka」が選択されている記事というクエリの場合は下記コードのようになります。

$args = [
    'posts_per_page' => 3,
    'post_type' => 'works',
    'meta_query' => [
        // ここから追加
        'relation' => 'AND',
        [
            'key' => 'works_area',
            'value' => 'osaka',
            'compare' => 'LIKE',
        ],
        // ここまで追加
        [
            'key' => 'works_area',
            'value' => 'hiroshima',
            'compare' => 'LIKE',
        ],
    ],
];

// …略…

最初の例ではmeta_queryの配列の中に1つの配列しか入っていなかったのですが、今回は「hiroshimaとosaka」の2つの配列が入っています。さらに6行目にrelationという項目も追加されています。relationの値はANDとORから選択でき、ANDの場合は「hiroshimaかつosaka」となりORの場合は「hiroshimaあるいはosaka」となります。

このようにmeta_queryは条件を複数設定できるので、配列の中に配列が入る形式になっています。条件を複数設定する場合は、relationが必須となるので忘れないように注意が必要です。