diff --git a/wp-includes/canonical.php b/wp-includes/canonical.php index 423dcc6366..0c56ba24f0 100644 --- a/wp-includes/canonical.php +++ b/wp-includes/canonical.php @@ -101,6 +101,20 @@ function redirect_canonical( $requested_url = null, $do_redirect = true ) { } } + if ( get_query_var( 'day' ) && get_query_var( 'monthnum' ) && get_query_var( 'year' ) ) { + $year = get_query_var( 'year' ); + $month = get_query_var( 'monthnum' ); + $day = get_query_var( 'day' ); + $date = sprintf( '%04d-%02d-%02d', $year, $month, $day ); + if ( ! wp_checkdate( $month, $day, $year, $date ) ) { + $redirect_url = get_month_link( $year, $month ); + $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum', 'day' ), $redirect_url ); + } + } elseif ( get_query_var( 'monthnum' ) && get_query_var( 'year' ) && 12 < get_query_var( 'monthnum' ) ) { + $redirect_url = get_year_link( get_query_var( 'year' ) ); + $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum' ), $redirect_url ); + } + if ( ! $redirect_url ) { if ( $redirect_url = redirect_guess_404_permalink() ) { $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'page', 'feed', 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); diff --git a/wp-includes/query.php b/wp-includes/query.php index 329b8d9330..0286072738 100644 --- a/wp-includes/query.php +++ b/wp-includes/query.php @@ -1513,15 +1513,24 @@ class WP_Query { if ( $qv['day'] ) { if ( ! $this->is_date ) { - $this->is_day = true; - $this->is_date = true; + $date = sprintf( '%04d-%02d-%02d', $qv['year'], $qv['monthnum'], $qv['day'] ); + if ( $qv['monthnum'] && $qv['year'] && ! wp_checkdate( $qv['monthnum'], $qv['day'], $qv['year'], $date ) ) { + $qv['error'] = '404'; + } else { + $this->is_day = true; + $this->is_date = true; + } } } if ( $qv['monthnum'] ) { if ( ! $this->is_date ) { - $this->is_month = true; - $this->is_date = true; + if ( 12 < $qv['monthnum'] ) { + $qv['error'] = '404'; + } else { + $this->is_month = true; + $this->is_date = true; + } } }