カスタムフィールドに入力している日付が、前日以前(過去の日付)になっていたら自動でカテゴリーを変更する方法をご紹介いたします。
イベント情報やセミナー情報を投稿しているサイトで、カテゴリーを自動で”開催終了”に変更したい場合などに活用できます。
カスタムフィールドに設定した日付が今日を過ぎていたらカテゴリーを自動変更する方法
日付を設定するためのカスタムフィールドは、Advanced Custom Fieldsを使って追加している前提です。Advanced Custom Fieldsの日付選択フィールドを使うと簡単です。
カスタムフィールドが設定できたら、適用しているテーマのfunctions.phpに以下を追加します。
//イベントをスケジュール
if (!wp_next_scheduled('event_end_check')) {
//現在時刻のタイムスタンプを取得
date_default_timezone_set('Asia/Tokyo');
$current_time = strtotime(wp_date('Y/m/d H:i:s'));
//翌日0時のタイムスタンプを格納
$scheduled_time = strtotime('tomorrow 00:00:00', $current_time);
//スケジュールをセット
wp_schedule_event($scheduled_time, 'daily', 'event_end_check');
}
//スケジュールイベントから実行されるアクション
function do_event_end_check() {
//現在日付のタイムスタンプを格納
$today = strtotime(wp_date('Ymd'));
//投稿を取得して内容を更新
$args = array(
'post_type' => '投稿タイプ名',
'posts_per_page' => -1,
'post_status' => 'publish',
);
$wp_query_event = new WP_Query($args);
if ($wp_query_event->have_posts()) {
while ($wp_query_event->have_posts()) {
$wp_query_event->the_post();
//カスタムフィールドの日付を取得してタイムスタンプを格納
$event_end_date = strtotime(get_field('カスタムフィールド名'));
//カスタムフィールドの日付が本日を超えていたらカテゴリーを変更
if (!empty($event_end_date) && $event_end_date < $today) {
wp_set_object_terms(get_the_ID(), 'ターム名', 'タクソノミー名');
}
}
}
wp_reset_postdata();
}
add_action('event_end_check', 'do_event_end_check');
「投稿タイプ名」「タクソノミー名」「ターム名」の部分は、環境に合わせて変更してください。
また、”event_end_check”や”do_event_end_check”などの関数名や$event_end_dateなどの変数名も気になる場合は適宜ご変更ください。
wp_schedule_eventによって毎日0:00にチェックが行われるようスケジュールされます。
※疑似cronを使うので厳密には0:00ちょうどにチェックされるわけではなく、0:00以降サイトにアクセスがあったタイミングで実行されます。
定期実行される「do_event_end_check」は、wp_dateで今日の日付を取得してカスタムフィールドの日付と比較し、カスタムフィールドの日付が前日以前になっていたらwp_set_object_termsでカテゴリー(タクソノミー)を変更するという挙動です。
あとがき
投稿数が多いサイトでは、WP_Queryの条件をもう少し絞った方が良いですね。
最近同じことをしたいという要望を立て続けにいただいたので、割と需要はあるかもしれません。