#18190 closed defect (bug) (invalid)
Don't redirect to 404 page on empty post archives
| Reported by: |
|
Owned by: | |
|---|---|---|---|
| Milestone: | Priority: | normal | |
| Severity: | normal | Version: | 3.2.1 |
| Component: | Query | Keywords: | |
| Focuses: | Cc: |
Description
"../archive/2010/09/29" redirects to a 404 Error because there are no posts that day.
If there are no posts, it shouldn't redirect to a 404 page. It should let the user perform the loop and show a message like this:
"Sorry, there are no posts for that date"
Change History (6)
#2
in reply to:
↑ 1
@
14 years ago
Replying to nacin:
/archive/2010/09/29/ isn't a rewrite rule we support in core, so core won't actually consider it a post type archive...
Thanks for replaying :)
Well, let's forget about "archive/". The point is archives pages without posts shouldn't be redirected to a 404 page. I think we should offer a consistent archive navigation experience and explain to the user that this particular date doesn't have posts rather than send him to a 404 page.
What do you think, nacin?
#3
@
14 years ago
After some time, I've found a way to fix this:
function dg_override_404() {
global $wp_query, $post;
if ( $wp_query->post_count == 0 )
{
$day = get_query_var( 'day' );
$monthnum = get_query_var( 'monthnum' );
$year = get_query_var( 'year' );
if ( $day || $monthnum || $year )
{
status_header( 200 );
$id=-28; // need an id
$post = new stdClass();
$post->ID= $id;
$post->post_content='';
$post->post_excerpt= '';
$post->post_status='publish';
$post->post_title= '';
$post->post_type='post';
$post->post_date = $year.'-'.$monthnum.'-'.$day.'00:00:00';
$wp_query->queried_object=$post;
$wp_query->post=$post;
$wp_query->found_posts = 1;
$wp_query->post_count = 1;
$wp_query->is_404 = false;
$wp_query->posts = array($post);
$wp_query->is_archive = 1;
}
}
}
add_filter('template_redirect', 'dg_override_404');
#4
@
14 years ago
A more complete approach:
function dg_override_404() {
global $wp_query, $post;
if ( $wp_query->post_count == 0 )
{
$day = get_query_var( 'day' );
$monthnum = get_query_var( 'monthnum' );
$year = get_query_var( 'year' );
if( $year )
{
$wp_query->is_year = 1;
$wp_query->is_month = 0;
$wp_query->is_day = 0;
}
if( $monthnum )
{
$wp_query->is_month = 1;
$wp_query->is_day = 0;
$wp_query->is_year = 0;
}
if ( $day )
{
$wp_query->is_day = 1;
$wp_query->is_year = 0;
$wp_query->is_month = 0;
}
if( $monthnum && !$day )
$day = 1;
if( $year && !$monthnum )
{
$monthnum = 1;
$day = 1;
}
if ( $day || $monthnum || $year )
{
status_header( 200 );
$id=-28; // need an id
$post = new stdClass();
$post->ID= $id;
$post->post_content='';
$post->post_excerpt= '';
$post->post_status='publish';
$post->post_title= '';
$post->post_type='post';
$post->post_date = $year.'-'.$monthnum.'-'.$day.' 00:00:00';
$wp_query->queried_object=$post;
$wp_query->post=$post;
$wp_query->found_posts = 1;
$wp_query->post_count = 1;
$wp_query->is_404 = false;
$wp_query->posts = array($post);
$wp_query->is_archive = 1;
$wp_query->is_date = 1;
}
}
}
add_filter('template_redirect', 'dg_override_404');
/archive/2010/09/29/ isn't a rewrite rule we support in core, so core won't actually consider it a post type archive...