这里有很多关于分页的问题,这绝对是WordPress内部工作方式中最不为人理解的方面之一。
为了理解为什么会得到404,我们将从Action Reference in Codex 要查看每个请求的过程,WordPress将遵循以下步骤。
这个过程首先加载插件和主题,然后进行一些初始化来设置所有内容,等等。。我们感兴趣的部分开始于parse_request
, WordPress确定请求的页面类型时,以及parse_query
, 当查询变量设置为生成Main Query.
下一个操作是pre_get_posts
, 这使我们有机会修改主查询。这是您想要执行自己的代码来更改主查询的地方,例如,设置不同的posts_per_page
值(提示,提示)。
然后我们到达wp
操作,在运行主查询之后,最后是本说明中的重要信息—template_redirect
行动这是WordPress根据主查询结果确定加载哪个模板的操作。如果是类别,则加载类别模板;如果是存档,则加载存档模板,然后if it\'s a 404- the 404 template is loaded.
是的,加粗文本意味着最后一部分很重要,希望我们开始理解这个问题。WordPress在您的模板加载之前就决定请求是404。无论在模板中运行查询得到什么结果,都是无关紧要的。如果主查询没有返回post,则返回404。
在你的例子中,你得到的是404,因为主查询每页加载5篇文章,而你只有3篇,就主查询而言,没有第二页。
(但是等一下,你会说,为什么它在某些页面上有效,而在其他页面上无效?是的,令人困惑的是,它不会总是生成404,例如,当请求是单数页面时。)
您的类别问题的解决方案在前面的文章中有所暗示-如果要修改查询,请使用pre_get_posts
在运行主查询之前。
// modify main query for category ID 15 and all its children
function wpd_category_query( $query ) {
if( $query->is_main_query() && $query->is_category() ) {
$parent = 15; // your parent category
$categories = get_term_children( $parent, \'category\' );
$categories[] = $parent;
if( is_category( $categories ) ) {
$query->set( \'posts_per_page\', 2 );
}
}
}
add_action( \'pre_get_posts\', \'wpd_category_query\' );