ACF Repeater Field内をmeta_queryする

【2018年9月追記】Advanced Custom Fieldsのアップデートに伴い、この記事に書かれた内容は、現在では正常に動かない場合があります。posts_requestフィルターフックの記事を参考にしてクエリを調整することをおすすめします。

WordPressでイベント情報などを管理したいとき、たとえばカスタム投稿タイプ「event」、カスタムフィールドで開催日「date」を作成し、meta_queryで条件指定して表示、といった感じになると思います。

一つのイベントに一つの開催日を入力する場合には何も問題はありませんが、間隔をあけて繰返し開催するイベントの場合には、ちょっと問題となります。Advanced Custom Fields (ACF) の Repeater Field を利用し、一つのイベントに複数の日付を入力する場合、通常の方法では検索することができません。

今回の記事では「これから開催予定のイベントのみ表示」し、「開催日が古い順にソート」したイベント一覧を想定し、カスタマイズする方法をご紹介します。

まず初めに、管理画面より下記のようなカスタムフィールドを定義します。繰り返しフィールドの名前を「date_repeater」、サブフィールドの名前を「date」としてみます。

次に、イベント一覧を表示したいテンプレートに、下記のPHPコードを記述します。注目してほしいのは posts_where フィルターです。発行されるSQL文の演算子を「=」から「LIKE」に変更し、Repeater Field内のサブフィールドを検索対象としています。このフィルターについて詳しくは Codex カスタムクエリ を参照してください。

ACFで日付フィールドを作成すると、MySQLには「Ymd」の数値型としてデータが入ります。そのためmeta_queryでは数値の大小を比べることにより、日付の新旧を比べることになります。

以上でカスタマイズは完了です。上手く行けばイベント一覧が表示され、開催済みのイベントは非表示となり、開催が近い順にイベントが並んでいるものと思います。

この記事を書きながらCodexを読んでいたところ posts_join や posts_groupby といったフィルターの存在を知り、WordPressのカスタムクエリは凄いのだな……! と改めて感心しました。もっと使いこなせるように頑張りたいものです。

株式会社トンボロは「WordPress専門」のウェブ制作会社です。

WordPressサイトの制作や、カスタマイズを承ります。
お見積りは無料です。お気軽にお問い合わせください。