イベントカレンダーを作るには日別イベントアーカイブの作成も必要

作成日:

さて、イベント投稿のカレンダーを作成しようと考えた際、デフォルトのカレンダーウィジェットですと、投稿のある日付をクリックすると

[bash]http://hogehoge.com/2019/01/28/[/bash]

のように、日別アーカイブページにリンクすることになります。

ですので、

日付形式のアーカイブページを階層タクソノミーに変更

のようにイベントアーカイブも月別でなく、日別まで登録する方が良かろうと思い至りました。

そこで最終的にはこんな感じに。

function presave_option() {
	global $post;
	if ( 'event' === $post->post_type ) {
		// 開催日.
		$from_date = get_post_meta( $post->ID, 'from_date', true );
		// 終了日.
		$to_date = get_post_meta( $post->ID, 'from_date', true );
		if ( $to_date ) {
			if ( get_post_meta( $post->ID, 'to_date', true ) !== $to_date ) {
				delete_post_meta( $post->ID, 'to_date' );
				update_post_meta( $post->ID, 'to_date', $to_date, true );
			}
			// 期間を配列に取得.
			$diff = ( strtotime( $to_date ) - strtotime( $from_date ) ) / ( 60 * 60 * 24 );
			for ( $i = 0; $i <= $diff; $i++ ) {
				$period[] = date( 'Y-m-d', strtotime( $from_date . '+' . $i . 'days' ) );
			}
		} else {
			$period[] = $from_date;
		}		
		$period_slug = array();
		foreach ( $period as $val ) {
			$archive_date       = explode( '-', date( 'Y-n-j', strtotime( $val ) ) );
			$archive_year_name  = $archive_date[0] . '年';
			$archive_year_slug  = $archive_date[0];
			$archive_month_name = $archive_year_name . $archive_date[1] . '月';
			$archive_month_slug = $archive_year_slug . '-' . $archive_date[1];
			$archive_date_name  = $archive_month_name . $archive_date[2] . '日';
			$archive_date_slug  = $archive_month_slug . '-' . $archive_date[2];
			if ( ! term_exists( $archive_year_slug, 'event_archive' ) ) {
				wp_insert_term( $archive_year_name, 'event_archive', $args = array( 'slug' => $archive_year_slug ) );
			}
			$archive_year_id = get_term_by( 'slug', $archive_year_slug, 'event_archive' )->term_id;
			if ( ! term_exists( $archive_month_slug, 'event_archive' ) ) {
				wp_insert_term( $archive_month_name, 'event_archive', $args = array( 'slug' => $archive_month_slug, 'parent' => $archive_year_id ) );
			}
			$archive_month_id = get_term_by( 'slug', $archive_month_slug, 'event_archive' )->term_id;
			if ( ! term_exists( $archive_date_slug, 'event_archive' ) ) {
				wp_insert_term( $archive_date_name, 'event_archive', $args = array( 'slug' => $archive_date_slug, 'parent' => $archive_month_id ) );
			}
			$period_slug[] = $archive_date_slug;
		}
		wp_delete_object_term_relationships( $post->ID, 'event_archive' );
		wp_set_object_terms( $post->ID, $period_slug, 'event_archive', true );
	}
}
add_action( 'save_post', 'presave_option', 999 );

詳しく説明すると、
 [php]$from_date = get_post_meta( $post->ID, 'from_date', true );
$to_date = get_post_meta( $post->ID, 'from_date', true );[/php]開催日と終了日のカスタムフィールドを取得
 

if ( $to_date ) {
	if ( get_post_meta( $post->ID, 'to_date', true ) !== $to_date ) {
		delete_post_meta( $post->ID, 'to_date' );
		update_post_meta( $post->ID, 'to_date', $to_date, true );
	}
	// 期間を配列に取得.
	$diff = ( strtotime( $to_date ) - strtotime( $from_date ) ) / ( 60 * 60 * 24 );
	for ( $i = 0; $i <= $diff; $i++ ) {
		$period[] = date( 'Y-m-d', strtotime( $from_date . '+' . $i . 'days' ) );
	}
} else {
	$period[] = $from_date;
}

終了日が登録されている=イベントが複数日に渡る期間イベントであると考えられるので、差分の日付を配列に登録
 

$period_slug = array();
foreach ( $period as $val ) {
	$archive_date       = explode( '-', date( 'Y-n-j', strtotime( $val ) ) );
	$archive_year_name  = $archive_date[0] . '年';
	$archive_year_slug  = $archive_date[0];
	$archive_month_name = $archive_year_name . $archive_date[1] . '月';
	$archive_month_slug = $archive_year_slug . '-' . $archive_date[1];
	$archive_date_name  = $archive_month_name . $archive_date[2] . '日';
	$archive_date_slug  = $archive_month_slug . '-' . $archive_date[2];
	if ( ! term_exists( $archive_year_slug, 'event_archive' ) ) {
		wp_insert_term( $archive_year_name, 'event_archive', $args = array( 'slug' => $archive_year_slug ) );
	}
	$archive_year_id = get_term_by( 'slug', $archive_year_slug, 'event_archive' )->term_id;
	if ( ! term_exists( $archive_month_slug, 'event_archive' ) ) {
		wp_insert_term( $archive_month_name, 'event_archive', $args = array( 'slug' => $archive_month_slug, 'parent' => $archive_year_id ) );
	}
	$archive_month_id = get_term_by( 'slug', $archive_month_slug, 'event_archive' )->term_id;
	if ( ! term_exists( $archive_date_slug, 'event_archive' ) ) {
		wp_insert_term( $archive_date_name, 'event_archive', $args = array( 'slug' => $archive_date_slug, 'parent' => $archive_month_id ) );
	}
	$period_slug[] = $archive_date_slug;
}
wp_delete_object_term_relationships( $post->ID, 'event_archive' );
wp_set_object_terms( $post->ID, $period_slug, 'event_archive', true );

期間内の日付を1日ずつイベントアーカイブに登録

これで大丈夫かな。

残る課題は不要になったタームをイベント終了後に自動で削除する方法かな。
過去のイベントアーカイブって、どこまで残す必要があるのかも考慮しないと。

物草 灸太郎
物草 灸太郎

WordPressでホームページを制作しつつ、休日は畑を耕したりDIYを楽しんでいます。

Loading...

コメントをどうぞ

  • メールアドレスが公開されることはありません。
  • コメント欄にURLは入力できません。
  • このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシー利用規約が適用されます。