不存在的博客页面不会重定向到404

时间:2012-03-19 作者:dashaluna

我有一个叫做博客的页面。在Settings -> Reading 我已经设置了Blog pagePosts page. 在菜单中单击Blog 链接帖子加载正确,分页工作正常,目前为止效果良好。所有信息都来自home.php 样板

我正在使用我自己的分页代码来生成要查看的页面max_num_pages and paged 参数。简而言之,它会生成具有正确链接的正确数量的页面。

然而,当我测试一个不存在的博客页面时。例如,存在5个页面,我键入blog/page/6 它没有重定向到404,相反,它似乎返回到main的else语句if(have_posts()).

我已经测试了使用相同分页代码的类别分页页面,它们工作正常:类型为category/<category_name>/page/2 被重定向到404 样板

我想不出为什么不存在的主博客“分页页面”不会重定向到404。

我将非常感谢任何提示和帮助。

非常感谢,Dasha

3 个回复
最合适的回答,由SO网友:Dave Hunt 整理而成

这是使用自定义查询(您自己输入分页值)或索引时分页的默认Wordpress行为。php,直到它已经加载了模板,然后尝试运行WP\\u查询,它才意识到第xxx页上没有可显示的内容。

您可以尝试添加确定是否设置了$paged且未找到任何结果的逻辑,然后抛出404,如下所示:

header("HTTP/1.0 404 Not Found");
$wp_query->set_404();
require TEMPLATEPATH.\'/404.php\';
exit;

SO网友:Daniele Raimondi

这是我通常在函数中使用的。每个wordpress站点中的php(我知道,我应该将其编码为插件…)

/**
 * @author daniele raimondi W3B snc
 * @version 0.4
 * @abstract This workaround fixes a problem with page pagination, where you can request
 * n paginated part of a (non-paginated)page from 2 to 2147483647 (max 32 signed int value)
 * and you will never get a 404 error. WP returns instead the page itself  if it\'s a not-paginated page, 
 * or the first page if you request n-paginated pages, from n+1 on.
 */

function fix_missing_404_on_paginated_page() {
    global $wp_query,$page,$paged;

    if (!isset($page)) $page = get_query_var(\'page\');
    if (!isset($paged)) $paged = get_query_var(\'paged\');
    if (is_page() || is_single()) {
        $realpagescount = count( explode( \'<!--nextpage-->\', $wp_query->post->post_content ) );

        if ( (isset($page) && isset($realpagescount) && $page >= $realpagescount) || (is_paged() && isset($paged) && $paged >=0 ) ){
        //wp_redirect( home_url() );
            nocache_headers();
            status_header( \'404\' );
            $wp_query->is_404=true;
            $wp_query->is_single=false;
            $wp_query->is_singular=false;
            $wp_query->post_count=0;
            $wp_query->page=0;
            $wp_query->query[\'page\']=\'\';
            $wp_query->query[\'posts\']=array();
            $wp_query->query[\'post\']=array();
            $wp_query->posts=array();
            $wp_query->post=array();
            $wp_query->queried_object=array();
            $wp_query->queried_object_id=0;
            locate_template(\'404.php\', true);
            exit;
        }
    }
}
add_action(\'template_redirect\', \'fix_missing_404_on_paginated_page\');

SO网友:fuxia

我最近在多站点安装的页面和帖子上也有类似的内容。不幸的是,我还没有弄明白为什么WordPress有时不调用404模板,但我建立了一个解决方法:

functions.php 我创建了一个小助手函数:

/**
 * Helper for cases where the 404 template is not loaded correctly.
 *
 * @return bool
 */
function t5_force_404()
{
    if ( have_posts() )
    {
        return FALSE;
    }

    header( \'HTTP/1.0 404 Not Found\' );
    locate_template( \'404.php\', TRUE, TRUE );
    $GLOBALS[\'wp_query\']->is_404 = TRUE;
    return TRUE;
}
single.phppage.php 我这样称呼它:

if ( t5_force_404() ) {
    return; // stop any further processing
}

// everything is fine, go on.
get_header();
所以……这会解决问题,但我仍然不知道为什么会发生。

结束

相关推荐

WP_query and pagination?

我必须获得一些自定义的帖子类型,并且需要使用WP\\u Query(Query\\u帖子不起作用)。如何分页?不管我怎么做都没用。。。任何帮助都太棒了,我无法独自解决这个问题。。。$args = array( \'tax_query\' => array( \'posts_per_page\' => 5, array( \'author\' => $user_id, \'taxonomy\' => \'c