イベントカレンダーを作るには日別イベントアーカイブの作成も必要
作成日:
2019年1月28日
さて、イベント投稿のカレンダーを作成しようと考えた際、デフォルトのカレンダーウィジェットですと、投稿のある日付をクリックすると
[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を楽しんでいます。
コメントをどうぞ