WordPressのイベント投稿を開催日と終了日基準に日付アーカイブを作成する方法

WordPressのイベント投稿を開催日と終了日基準に日付アーカイブを作成する方法



WordPressでカスタム投稿タイプとして「イベント投稿」を作成するとします。

例:カスタム投稿/my_event、開催日(カスタムフィールド)/from_date、終了日(カスタムフィールド)/to_date
※カスタム投稿タイプmy_eventには投稿タイプアーカイブを有効にしておきます。

このとき、通常投稿での日付アーカイブでは、

https://hoge.com/2019/8

にアクセスすると、2019年8月に公開した投稿のアーカイブが表示されます。

一方「イベント投稿」の日付アーカイブでは、

https://hoge.com/2019/8/?post_type=my_event

にアクセスした際、公開日ではなくイベントの開催日や終了日を基準として表示されることが望ましいです。
(例えば2019年8月に開催されるイベントを2019年7月に公開しても、上記アーカイブには表示されません。)

また、2019/7/1から9/15まで開催されるイベントを公開しても、開催日だけを基準にしたアーカイブでは、上記URLにアクセスしても表示されませんので、開催日から終了日までの期間を基準にする必要があります。

そのために、pre_get_postsをカスタマイズして、イベント用のアーカイブを作成します。

次が全体コードになります。

function my_eventt_query( $query ) {
	if ( $query->is_date() ) {
		$query_object  = get_queried_object();
		$the_post_type = $query_object->name;
		if ( 'my_event' === $the_post_type ) {
			if ( $query->is_year() ) {
				$year = get_query_var( 'year' );
				$from = date( $year . '-01-01' );
				$to   = date( $year . '-12-31' );
			} elseif ( $query->is_month() ) {
				$year  = get_query_var( 'year' );
				$month = get_query_var( 'year' ) . '-' . get_query_var( 'monthnum' );
				$from  = date( 'Y-m-d', strtotime('first day of ' . $month) );
				$to    = date( 'Y-m-d', strtotime('last day of ' . $month) );
			} elseif ( $query->is_day() ) {
				$year  = get_query_var( 'year' );
				$month = get_query_var( 'monthnum' );
				$day   = get_query_var( 'day' );
				$from  = date( $year . '-' . $month . '-' . $day );
				$to    = date( $year . '-' . $month . '-' . $day );
			}
			$meta_query = array(
				'relation' => 'OR',
				array(
					'relation' => 'OR',
					array(
						'key'     => 'from_date',
						'value'   => array( $from, $to ),
						'compare' => 'BETWEEN',
						'type'    => 'DATE',
					),
					array(
						'key'     => 'to_date',
						'value'   => array( $from, $to ),
						'compare' => 'BETWEEN',
						'type'    => 'DATE',
					),
				),
				array(
					'relation' => 'AND',
					array(
						'key'     => 'from_date',
						'value'   => array( '1900-01-01', $from ),
						'compare' => 'BETWEEN',
						'type'    => 'DATE',
					),
					array(
						'key'     => 'to_date',
						'value'   => array( $to, '2999-12-31' ),
						'compare' => 'BETWEEN',
						'type'    => 'DATE',
					),
				),
			);			
			$query->set( 'meta_key', 'from_date' );
			$query->set( 'orderby', 'meta_value' );
			$query->set( 'year', '' );
			$query->set( 'monthnum', '' );
			$query->set( 'day', '' );
			$query->set( 'meta_query', $meta_query );
		}
	}
}
add_action( 'pre_get_posts', 'my_eventt_query' );

上から説明をしていきます。

1. $query->is_date()で日付アーカイブで条件分岐し、get_queried_object()から現在の投稿タイプを取得します。

2. 日付アーカイブで指定されている期間の日付をget_query_var()で取得します。

3. meta_queryで日付アーカイブの期間中に開催日~終了日が重なる投稿をフィルタリングします。

4. 標準の並び順を$query->set( ‘meta_key’, ‘from_date’ )$query->set( ‘orderby’, ‘meta_value’ )で開催日を基準とします。

5. $query->set( ‘year’, ” )$query->set( ‘monthnum’, ” )$query->set( ‘day’, ” )で通常の日付アーカイブを無効にします。

これでイベント投稿の日付アーカイブで開催日、終了日を基準にして表示出来るようになりました。

今日はここまで

関連する記事



こちらはいかが?


コメントを残す