WordPressのイベント投稿を開催日と終了日基準に日付アーカイブを作成する方法
作成日:
2019年8月23日
WordPressでカスタム投稿タイプとして「 イベント投稿 」を作成するとします。
📝 今回の例
- カスタム投稿 | my_event
- 開催日(カスタムフィールド) | from_date
- 終了日(カスタムフィールド) | to_date
このとき、通常投稿での日付アーカイブでは、
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' );
コード解説
- 日付アーカイブで条件分岐し、get_queried_object()から現在の投稿タイプを取得します。PHP [2]
if ( $query->is_date() ) {
- 日付アーカイブで指定されている期間(年/月/日)の日付を取得します。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 ); }
- 日付アーカイブの期間中に開催日~終了日が重なる投稿をフィルタリングします。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', ), ), );
- 標準の並び順を開催日基準とします。PHP [55-56]
$query->set( 'meta_key', 'from_date' ); $query->set( 'orderby', 'meta_value' );
- 通常の日付アーカイブを無効にします。PHP [57-59]
$query->set( 'year', '' ); $query->set( 'monthnum', '' ); $query->set( 'day', '' );
これでイベント投稿の日付アーカイブで開催日、終了日を基準にして表示出来るようになりました。
イベント以外にも使えるはず。
物草 灸太郎
WordPressでホームページを制作しつつ、休日は畑を耕したりDIYを楽しんでいます。
関連投稿
コメントをどうぞ
- メールアドレスが公開されることはありません。
- コメント欄にURLは入力できません。
- このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシーと利用規約が適用されます。
コメント
2019年10月6日 6:05 PM
2019年10月4日 6:55 PM
2019年10月4日 11:21 AM