この実装、面倒なら代行します
※ 今回はアドバンストカスタムフィールドの「繰り返しフィールド: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文で回して、条件合致するコース名を取得しています。
いかがでしょうか。
できる限り、不特定のキーを条件にするのは避けたいですが、運用上どうしても繰り返しフィールドの値を条件に投稿を絞り込まなければならない時などに、今回の事例が役立ちます。
活用してください。
WordPressカスタマイズ事例やウェブ制作ノウハウの新着情報、お役立ち情報を
リアルタイムにメルマガ配信!
100ウェブで手がけた制作・開発案件を一部、ご紹介。
クライアントからご相談いただいた内容とその実装におけるポイント、工期、予算について確認いただけます。
【テレワーク実施中 につきお電話転送中】
コール中1秒程度無音状態になりますがそのままお待ちください。
受付時間
平日 10:00~18:00
メールでのお問い合わせでも
1営業日以内にご連絡いたします。