分页后返回404页

时间:2015-01-28 作者:any_h

我得到了一个页面循环,从自定义帖子类型中,每页可以拉入4篇帖子。它工作得很好,唯一的缺点是分页不会超过page/20 之后的一切都是404posts_nav_link 根本不会显示下一个箭头。就像页面不存在一样。

在自定义帖子类型中,总共有119篇已发布帖子。如果我改变posts_per_page 到,比如说6,那么我可以从末尾访问更多的帖子,但它也会在page/20.

在生产现场,分页停止在21, 我猜是因为实时数据库有更多的条目。

我将“最多显示博客页面”设置为6。

下面是我使用的循环:

<?php
$paged = get_query_var(\'paged\') ? get_query_var(\'paged\') : 1;
$args  = array(
    \'posts_per_page\' => 4,
    \'orderby\'        => \'modified\',
    \'post_type\'      => "projekte",
    \'paged\'          => $paged
);
$custom_query = new WP_Query($args);
$c = 0;
while($custom_query->have_posts()) :
    $custom_query->the_post();
    ?>
    <article>...</article>
    <?php
endwhile;
wp_reset_postdata(); // reset the query
?>
我经历了functions.php 无数次寻找某种限制get_pre_posts 过滤器,但我什么也看不见。

我还得到了一个错误日志设置,没有返回任何内容,我已经测试过它是否正常工作。

有什么建议吗?

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

你所经历的一切都是正常的,也是意料之中的。这是我一直强调这一点的一个重要原因,从未使用自定义查询替换主页或任何类型的存档页上的主查询。他们解决了一个问题,却创造了许多新问题

让我们看看你有什么以及为什么会得到这些结果:

基础知识尽管在存档页面上看不到输出,但主查询将在上执行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 querypre_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\' );
        }
    }
    

结束

相关推荐

CPT while loop not working

我无法从while循环中获得任何东西:<ul> <?php $query_args = array( \'post_type\' => \'Smart panels\', \'posts_per_page\' => 5, \'orderby\' => \'meta_value_num\', \'meta_key\' => \'post_v