WordPress
カスタマイズ事例

WORDPRESS CUSTOMIZATION

アドバンストカスタムフィールドの「繰り返しフィールド:repeater field」の値を条件に投稿を取得する

※ 今回はアドバンストカスタムフィールドの「繰り返しフィールド:repeater field」に関連する事例です。興味のない方は読み飛ばしてください。
 
こんな事例を想定してください。
====================
カスタム投稿タイプ「セミナー」 : seminar
繰り返しフィールド : seminar_master
  コース名 : seminar_master_name
  オプション : seminar_master_option
  費用 : seminar_master_cost

※ カスタムフィールドはアドバンストカスタムフィールド(Advanced Custom Fields)を利用
====================
要はひとつの「セミナー」という大項目に複数の「コース」が存在するような事例ですね。
で、それぞれの「コース」に個別に「オプション」や「費用」が設定されている。
 
さて、このような事例において、オプションが「shake_hand」(握手会あり)、あるいは費用が「free」(無料)になっているコースを取得したい場合どうするか?
というのが今回のテーマで、その解がタイトルにある通り、
アドバンストカスタムフィールドの「繰り返しフィールド:repeater field」の値を条件に投稿を取得することです。
それでは、その手順について説明していきます。
 
まず最初に、アドバンストカスタムフィールドの繰り返しフィールド “repeater field” におけるキーの命名ルールを確認しましょう。

[繰り返しフィールド名]_[行番号]_[繰り返しフィールド内のサブフィールド名]

ふむふむ。この”行番号”にあたるところに何がくるか分からないので、逆に何が来てもいいようにすればいいってことですね。
以上の考察に則り、WP_Queryでの投稿検索に対してフィルターを用意します。
 
functions.php に以下を追記。

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

 
こんな感じでフィルターができたので、WP_Queryの中でこれを使って該当する投稿を取得します。

//まずはrepeater field内の変数 "seminar_master_option"の値=="shake_hand" か、
//"seminar_master_cost"の値=="free"になっている投稿を取得します
$the_query = new WP_Query(array(
  'post_type' => 'seminar',
  'posts_per_page' => 1,
  'meta_query' => array(
    'relation' => 'OR',
    array(
      'key' => 'seminar_master_$_seminar_master_option',
      'compare' => '=',
      'value' => 'shake_hand',
    ),
    array(
      'key' => 'seminar_master_$_seminar_master_cost',
      'compare' => '=',
      'value' => 'free',
    ),
  )
));

//次に取得した投稿の中でrepeater fieldを回し、
//"seminar_master_option"の値=="shake_hand" か、"seminar_master_cost"の値=="free"になっているコース名を表示します
if ($the_query->have_posts()) {
  while ($the_query->have_posts()) {
    $the_query->the_post();
    while (have_rows('seminar_master', $post->ID)) {
      the_row();
      $optionseminar_master_option = get_sub_field('optionseminar_master_option');
      $seminar_master_cost = get_sub_field('seminar_master_cost');
      $seminar_master_name = get_sub_field('seminar_master_name');
      if ($optionseminar_master_option == 'shake_hand' || $seminar_master_cost == 'free') {
        echo $seminar_master_name;
      }
    }
  }
}

該当するセミナーを探し出せたとしても、その中の複数のコースのうちの一つが該当するコースになるわけですから、repeater field 内をwhile文で回して、条件合致するコース名を取得しています。
 
いかがでしょうか。
できる限り、不特定のキーを条件にするのは避けたいですが、運用上どうしても繰り返しフィールドの値を条件に投稿を絞り込まなければならない時などに、今回の事例が役立ちます。
活用してください。

【100ウェブ新着情報メルマガ】

WordPressカスタマイズ事例やウェブ制作ノウハウの新着情報、お役立ち情報を
リアルタイムにメルマガ配信!