Advanced Custom Fields Pro(ACF PRO)を導入している際に、繰り返しフィールドの値で記事を絞り込みたいこともあると思います。
繰り返しフィールドの値で絞り込みたい時は少々クセがあるので、絞り込み方法をご紹介したいと思います。
ACF PROの繰り返しフィールドの値で絞り込んだ記事一覧を取得する方法
前提として、WP_Queryで記事一覧を取得するものとします。また、繰り返しフィールドのフィールド名は「author」、サブフィールド名を「subauthor」としています。
2パターンの方法がありますので、それぞれご紹介します。
パターン1. 複数の繰り返しフィールドに対応した方法
※この方法はフォーラムの「Advanced Custom FieldsのRepeater Fieldの値で絞り込みを簡素に書く方法」で回答されていた方法を参考にしたものです。
meta_keyの絞り込みにワイルドカードを使えるようにして、繰り返しフィールドの値で記事一覧を絞り込む方法です。
まずは適用しているテーマのfunctions.phpに以下を追記します。
function my_posts_where_wildcard($where, $query) {
if ($query->get('wildcard_meta_key')) {
$where = str_replace('meta_key =', 'meta_key LIKE', $where);
}
return $where;
}
add_filter('posts_where', 'my_posts_where_wildcard', 10, 2);
WP_Queryで記事一覧を取得する際に、パラメータに「’wildcard_meta_key’ => true,」を追加し、meta_queryのkeyで「author_%_subauthor(繰り返しフィールドのフィールド名_%_サブフィールド名)」を指定して絞り込みます。
$args = array(
'paged' => $paged,
'posts_per_page' => 10,
'post_type' => 'book',
'post_status' => 'publish',
'wildcard_meta_key' => true,
'meta_query' => array(
array(
'key' => 'author_%_subauthor',
'compare' => 'LIKE',
'value' => 'tanaka',
)
)
);
$wp_query = new WP_Query($args);
keyを変えることで色んな繰り返しフィールドに対応できます。
パターン2. 特定の繰り返しフィールドのみに対応した方法
※この方法は100ウェブさんの「アドバンストカスタムフィールドの「繰り返しフィールド:repeater field」の値を条件に投稿を取得する」を参考にさせていただきました。
パターン1ではwildcard_meta_keyを使うことで他の繰り返しフィールドでも絞り込みが可能ですが、パターン2は特定の繰り返しフィールドのみに対応したやり方です。
まずは適用しているテーマのfunctions.phpに以下を追加します。パターン1と原理は同じですが、meta_keyを指定することで特定の繰り返しフィールドのみがワイルドカード利用の対象になり、WP_Queryで絞り込む時にwildcard_meta_keyのようなパラメータを追加する必要がありません。
function my_author_posts_where($where) {
$where = str_replace("meta_key = 'author_$", "meta_key LIKE 'author_%", $where);
return $where;
}
add_filter('posts_where', 'my_author_posts_where');
WP_Queryのパラメータ指定は以下のようにします。meta_queryのkeyに「繰り返しフィールドのフィールド名_$_サブフィールド名」を指定することで、繰り返しフィールドの値によって記事を絞り込めます。
$args = array(
'paged' => $paged,
'posts_per_page' => 10,
'post_type' => 'book',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'author_$_subauthor',
'compare' => 'LIKE',
'value' => 'tanaka',
)
)
);
$wp_query = new WP_Query($args);
あとがき
あえて1つのフィールドのみに固定することもないと思いますので、パターン1の方が柔軟性があって良さそうですね。
ACF PROを使っていて、繰り返しフィールドの値で記事一覧を絞り込みたい時はぜひお試しください。