你所经历的一切都是正常的,也是意料之中的。这是我一直强调这一点的一个重要原因,从未使用自定义查询替换主页或任何类型的存档页上的主查询。他们解决了一个问题,却创造了许多新问题
让我们看看你有什么以及为什么会得到这些结果:
基础知识尽管在存档页面上看不到输出,但主查询将在上执行every 页面加载并返回一个帖子数组。删除循环不会停止执行主查询。循环只显示主查询正在检索的内容。因此,基本情况是,如果用自定义循环替换默认循环,则每个页面加载检索两组帖子。主查询检索到的帖子和自定义查询检索到的帖子。如果要测试这一点,请在php标记内的归档页面的循环外添加以下代码行
?><pre><?php var_dump( $wp_query->posts ); ?></pre><?php
这将输出由该特定页面上的主查询检索到的帖子数组
当is替换主查询时,这使得自定义查询非常无效。这就像用刺破的磨损轮胎替换顶部形状的充气轮胎。
您的场景有以下场景
119篇自定义帖子类型的帖子
管理中设置的每页帖子选项为6
自定义查询设置为每页检索4篇文章
数学主查询将返回20页,您可以使用这些页面进行测试echo $wp_query->max_num_pages;
. 数学很简单,你有119个帖子,你也可以查看echo $wp_query->found_posts;
, 在admin中,每页的帖子数设置为6,因此119/6的上限=20
对于自定义查询,您可以通过更改$wp_query
到$custom_query
. 您将看到仍有119篇帖子,但由于每页帖子数现在设置为4,因此您将有30页。119/4的天花板=30
404在第21页,每当主查询没有帖子显示时,就会触发404,这就是您看到的。有足够的帖子来填满20页,而不是21页或更多。因此,当转到第21页时,主查询404的原因很简单,因为无论您的自定义查询中是否还有足够的内容可显示,都没有更多的帖子可显示。
我看到过一些帖子,人们说解决方案很简单,只需更改管理页面中每页的帖子数量,以匹配自定义查询。Don\'t ever do that. 是的,它确实解决了这个问题,但它解决了真正的问题,即您不应该用自定义查询替换主查询。顺便说一句,这个问题的真正解决方案是非常简单、干净的,并且是实现您需要的正确方法
为什么选择自定义查询
您决定使用自定义查询是因为两件事
自定义帖子类型存档页面上每页的帖子数量与网站其他部分不同
修改了按日期排序的帖子,而不是默认的帖子日期
如您所见,您已经用自定义查询解决了两个问题,但也产生了其他问题
解决方案这是解决问题的正确、简单的方法。使用pre_get_posts
在执行前更改主查询。pre_get_posts
相应地修改用于计算特定页面请求的SQL查询的查询变量。
在这里,您必须做两件事,第一件事是删除归档页面上的自定义查询,并将其替换为默认循环。一旦你做到了这一点,你将看到每页按发布日期排序的6篇文章,默认情况下应该是这样的。
现在,打开函数。php和使用pre_get_posts
更正每页的帖子数量和排序顺序
add_action( \'pre_get_posts\', function ( $q )
{
if( !is_admin()
&& $q->is_main_query()
&& $q->is_post_type_archive( \'projekte\' )
) {
$q->set( \'posts_per_page\', 4 );
$q->set( \'orderby\', \'modified\' );
}
});
您现在应该可以看到按修改日期排序的每页4篇文章,在自定义文章类型存档页面上正确分页
projekte
额外阅读
你还应该阅读我不久前就类似问题发表的以下帖子,以及我在该特定帖子中链接的所有帖子
- When to make use of a custom query对于那些使用不支持闭包的恐龙php版本的用户,这里是
pre_get_posts
行动add_action( \'pre_get_posts\', \'wpse176347_pre_get_posts\' );
function wpse176347_pre_get_posts( $q )
{
if( !is_admin()
&& $q->is_main_query()
&& $q->is_post_type_archive( \'projekte\' )
) {
$q->set( \'posts_per_page\', 4 );
$q->set( \'orderby\', \'modified\' );
}
}