イベント申し込みフォームなどで、「開催が近いイベントだけをフォームのセレクトボックスに出したい」というケースがあります。手動で選択肢を更新するのは大変なので、記事の日付をもとに自動で出し分けたいところです。
結論から言うと、ACF(Advanced Custom Fields)のデイトピッカーと、MW WP Formのmwform_choicesフックを組み合わせることで、「今日から3ヶ月以内」の記事タイトルだけを、フォームのセレクトボックスに自動で挿入できます。この記事では、その手順を解説します。
目次
まず、対象の投稿タイプにACFのデイトピッカーフィールドを追加します。
event_dateなど任意のものにするMW WP Formでフォームを作成し、次のセレクトボックスのフォームタグを設置します。
[mwform_select name="event_title"]
このままでは静的なセレクトボックスなので、動的に記事タイトルを挿入する処理を追加します。
functions.phpに、次のコードを追加します。
function form_event_cat_list($children, $atts)
{
if ($atts['name'] == 'event_title') {
$today = date_i18n('Y-m-d'); // 今日の日付
$threemonthslater = date_i18n("Y-m-d", strtotime("+90 day", current_time('timestamp'))); // 3ヶ月後の日付
$events = get_posts(array(
'post_type' => 'event', // 投稿タイプ
'posts_per_page' => -1, // 全件
'meta_key' => 'event_date', // イベント開催日
'orderby' => 'meta_value',
'order' => 'ASC', // 昇順
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'event_date', // イベント開催日
'value' => $today, // 今日
'compare' => '>=', // 今日以降
'type' => 'DATE' // 日付として比較
),
array(
'key' => 'event_date', // イベント開催日
'value' => $threemonthslater, // 3ヶ月後
'compare' => '<=', // 3ヶ月後以前
'type' => 'DATE'
),
),
));
/* 取得した配列からタイトルだけを抽出 */
foreach ($events as $event) {
$children[$event->post_title] = $event->post_title;
}
}
return $children;
}
add_filter('mwform_choices_mw-wp-form-XXX', 'form_event_cat_list', 10, 2);
※XXXは、MW WP FormのフォームIDに置き換えてください。
date_i18n('Y-m-d')で今日、strtotime("+90 day", ...)で3ヶ月後(90日後)の日付を求め、meta_queryのrelation => 'AND'で「今日以降 かつ 3ヶ月後以前」という2条件で絞り込んでいます。これにより、開催が近いイベントだけがセレクトボックスに並びます。
日付の比較を正しく行うため、条件には'type' => 'DATE'を指定しています。ACFのデイトピッカーの返り値フォーマットと、比較に使う日付の形式(ここではY-m-d)を揃えておくのがポイントです。フォーマットが合っていないと、意図した抽出にならないので注意しましょう。
補足として、meta_key => 'event_date'とorderby => 'meta_value'は、開催日順(昇順)に並べるための指定です。近い日付から順にセレクトへ並ぶので、ユーザーが選びやすくなります。なお、期間を絞らず「今日以降のすべて」を対象にしたい場合は、3ヶ月後の条件を外して1条件にするだけで応用できます。
ACFのデイトピッカーとMW WP Formを組み合わせれば、日付に応じてフォームの選択肢を自動で出し分けられます。開催が過ぎたイベントや、まだ先すぎるイベントを自動で除外できるので、選択肢の手動更新が不要になり、運用がぐっと楽になります。「今日以降のみ」を表示する応用は、あわせて関連記事も参考にしてみてください。