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

作成日:

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

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

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

Shell
https://hoge.com/2019/8

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

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

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

にアクセスした際、公開日ではなくイベントの開催日や終了日を基準として表示されることが望ましいです。

(例えば2019年8月に開催されるイベントを2019年7月に公開しても、上記アーカイブには表示されません。)

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

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

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

PHP
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. 日付アーカイブで条件分岐し、get_queried_object()から現在の投稿タイプを取得します。
    PHP [2]
    	if ( $query->is_date() ) {
    
  2. 日付アーカイブで指定されている期間(年/月/日)の日付を取得します。
    PHP [6-21]
    			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 );
    			}
    
  3. 日付アーカイブの期間中に開催日~終了日が重なる投稿をフィルタリングします。
    PHP [22-54]
    			$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',
    					),
    				),
    			);			
    
  4. 標準の並び順を開催日基準とします。
    PHP [55-56]
    			$query->set( 'meta_key', 'from_date' );
    			$query->set( 'orderby', 'meta_value' );
    
  5. 通常の日付アーカイブを無効にします。
    PHP [57-59]
    			$query->set( 'year', '' );
    			$query->set( 'monthnum', '' );
    			$query->set( 'day', '' );
    

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

イベント以外にも使えるはず。

物草 灸太郎
物草 灸太郎

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

Loading...

コメント

morisaki さん
お返事ありがとうございます! そうなのですね、また記事が更新されるのを楽しみにしています!
2019年10月6日 6:05 PM 返信
物草 灸太郎 さん
カレンダーは現在制作中にあります。イベントカレンダーになるので、日をまたぐ形式での表示をどのようにするか思案中です。jQueryを使えば早いのはわかっているのですが、なるべくPHPだけで実装したいので。
2019年10月4日 6:55 PM 返信
morisaki さん
こんにちは、はじめまして! シリーズ『WordPressでイベント投稿を作る』を参考にさせていただきました。 アーカイブを作成するところまで理解したのですが、物草さんは最終的にカスタム投稿のカレンダーを出力されたのでしょうか?
2019年10月4日 11:21 AM 返信

morisaki へ返信する

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