使用自定义帖子类型分页导致404个问题

时间:2013-02-13 作者:elclanrs

我有一个非常简单的index.php:

<div id="content">
  <? get_template_part(\'content\', get_post_format()) ?>
</div>

<div id="pagination">
  <? previous_posts_link() ?>
  <? next_posts_link() ?>
</div>
还有我的content.php 大致如下所示:

<?
$paged = get_query_var(\'paged\') ? get_query_var(\'paged\') : 1;
query_posts([
  \'post_type\' => [\'articles\', \'projects\', \'tips\'],
  \'orderby\' => \'date\',
  \'posts_per_page\' => 7,
  \'paged\' => $paged
]);
?>

<? while(have_posts()): the_post() ?>
  <article class="post">
    <h2><? the_title() ?></h2>
    <p><? the_excerpt() ?></p>
    <ul>
      <? foreach($categories as $cat): ?>
      <li class="category"><a href="#"><?= $cat->name ?></a></li>
      <? endforeach ?>
    </ul>
  </article>
<? endwhile ?>
总共有14个帖子,但“下一个”帖子总是重定向到404 on/page/2 而不是显示其余的7个帖子。

Edit: 如果我使用自定义WP_Query 而不是query_posts 然后,下一个和上一个链接甚至不会显示。https://gist.github.com/elclanrs/4782705

从昨天开始,我一直在努力寻找解决这个问题的办法。我知道所有其他与此类似的问题,但对于我的特定设置,我发现没有一个解决方案有效,包括:

我也知道pre_get_posts 但是我想知道我目前的设置有什么问题。有什么想法吗?

2 个回复
最合适的回答,由SO网友:Milo 整理而成

当您到达模板时,WordPress已经查询了数据库,并根据这些结果决定要显示什么。

您看到404错误,因为根据默认的主查询,没有更多的帖子可显示。

当你打电话的时候query_posts 在模板中,覆盖原始查询。尽管您的新查询结果包含更多帖子,但WordPress没有意识到这个修改后的查询。

这就是为什么你应该never use query_posts in the template. 您已经为您的问题提供了解决方案,请使用pre_get_posts 在主查询发生之前修改主查询的操作。

SO网友:AdamB

如果使用自定义帖子类型UI插件,另一个对我有效的解决方案是更改自定义帖子类型界面中的重写设置。

例如,我有一个自定义的“新闻”帖子类型,除了分页之外,没有其他问题不起作用(例如,/新闻/页面/2将是404)。我找到的两种解决方案是:

将“重写”设置设为false(导致新闻文章URL,如domain.co.uk/?=新闻文章标题)

  • 或将“重写”设置保持为true,但使用自定义slug,如我的示例“newsstory”,它解决了404问题,然后将文章URL重写为domain。不过,如果您的登录页面与您的帖子类型被称为相同,那么最终,我想上面的内容只是一个补丁。E、 g.“新闻”帖子类型的页面显示在屏幕上,也有“新闻”这样可能会混淆问题。

  • 结束

    相关推荐

    Excluded category from loop

    我使用它从循环中排除特定类别。它做到了这一点,但它也做到了这一点:在我的页面上,它显示了除此之外的其他类别的帖子。/** Replace the standard loop with our custom loop */ remove_action( \'genesis_loop\', \'genesis_do_loop\' ); add_action( \'genesis_loop\', \'child_do_custom_loop\' ); function chil