BLOGスタッフブログ

【Advanced Custom Fields Pro】繰り返しフィールドの中のGroupフィールドの中のフィールドで絞り込みがしたい

こんにちは。
最近諸事情があり一生分のココスに行って体重が増えたWebクリエイターです。

先日、WordPressプラグイン「Advanced Custom Fields Pro」の
「繰り返しフィールドの中のGroupフィールドの中のフィールド」
で絞り込みをしたい!という場面がありました。

※繰り返しフィールドは「Advanced Custom Fields Pro」でのみ利用可能


文字だけだとイメージが付きづらいと思うので図説します

ということで、今回はこちらの実装方法について紹介したいと思います。

ソースコード

忙しい人のためにまずはコードをお見せします。

コード内は、

繰り返しフィールド名:repeater
Groupフィールド名 :group
テキストフィールド名:text

としていますので、ご自身で設定しているものに変換してお使いください。

呼び出し側

<?php
$args = array(
  'post_type' => 'posttype', //投稿タイプ
  'posts_per_page' => -1, //表示件数

  //カスタムフィールドで絞りこみ
  'meta_query' => array(
    array(
      'key' => 'repeater_$_group_text', //絞り込むフィールド名
      'value' => 'りんご', //絞り込む値
      'type' => 'CHAR', //文字列で検索
      'compare' => 'LIKE'
    ),
  ),
);
$the_query = new WP_Query($args);
if($the_query->have_posts()){
?>
  <ul>
  <?php
  while($the_query->have_posts()){
    $the_query->the_post();
  ?>
    <li><?php the_title(); ?></li>
  <?php } ?>
  </ul>
<?php
}
wp_reset_postdata();
? >

functions.php

function replace_acf( $where ) {
	$where = str_replace( "meta_key = 'repeater_$", "meta_key LIKE 'repeater_%", $where );
	return $where;
}
add_filter( 'posts_where', 'replace_acf' );

解説

WordPress管理画面

管理画面は以下のような形を想定しています。

カスタムフィールド設定画面
記事編集画面

上記のテキストフィールドで「りんご」の値を持つ投稿を絞り込んでいきます。

WP_Queryで絞り込み

絞り込みにはWP_Queryを利用します。
ここでポイントとなるのがmeta_query内で指定するフィールドキーです。

'key' => 'repeater_$_group_text', //絞り込むフィールド名

フィールドキーは「[繰り返しフィールド名]_$_[Groupフィールド名]_[Groupフィールド内フィールド名]」という構造で指定します。

1つずつ見ていきましょう。

Groupフィールドの取得は、シンプルにアンダースコア同士で繋げます。

これはいくつ入れ子になっても同様なので、
「Groupフィールド01>Groupフィールド02>子フィールド」という二重入れ子構造の場合は
「[Groupフィールド01]_[Groupフィールド02]_[子フィールド]」といった形で記載します。

繰り返しフィールドのキーは、「repeater_0」「repeater_1」のように、フィールド名の後に行番号が付与されます。

行数は投稿によって異なるため、固定数値での指定はできません。
このため、繰り返しフィールドすべてを検索対象にするには、「repeater_$」のように行番号にあたる部分を正規表現(ワイルドカード)で指定する必要があります。

posts_whereで繰り返しフィールドの検索

functions.php内でposts_whereフックを利用して、細かい検索条件を指定することができます。

WP_Queryで呼び出しているSQL文に対し、正規表現を用いて「repeater_%」で全文検索をするようにします。
(SQLのワイルドカード文字は「%」)

$where = str_replace( "meta_key = 'repeater_$", "meta_key LIKE 'repeater_%", $where );

これはカスタムクエリと呼ばれ、今回のように複雑なものや細かい検索条件を指定することができる優れものです。
今回詳しく解説はしませんが、気になる方は調べてみてください。

あとは、お好きなように表示の調整をしてもらえば完璧です。

絞り込み前
絞り込み後

いかがでしたでしょうか。
利用する機会としてはさほど多くないかと思いますが、何かの参考になれば幸いです。

多機能なサイトを作りたい!という方はぜひお問い合わせください。

それでは。

関連ページ

矢口 奈果が書いた他の記事

見積もり・ご依頼など、
お気軽にご相談ください

本サイトはユーザーエクスペリエンスの向上などを目的に、Cookieを使用しています。
右記のバナーで「同意する」をクリックする、または本サイトを利用することにより、
お客様は弊社のCookieポリシーに同意したことになります。

同意します