类别/类别名称分页404错误

时间:2020-01-28 作者:hxhzre
<div class="row">
  <?php
    $currCat = get_category(get_query_var(\'cat\'));
    $cat_name = $currCat->name;
    $cat_id   = get_cat_ID( $cat_name );

    $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
    $query = array(
            \'paged\'=>$paged,
            \'posts_per_page\'=> 3,
            \'orderby\'=>\'rand\',
            \'post_type\'=>\'product\',
            \'cat\' => $cat_id
    );
    $queryObject = new WP_Query($query);
    while ($queryObject->have_posts()) : $queryObject->the_post();
        $post_category = get_the_category(get_the_ID());

  ?>
  <div class="col-md-4 module">
      <a class="" href="<?php the_permalink(); ?>">
          <!-- ... -->
      </a>
  </div>
  <?php endwhile; ?>
    <?php
      global $queryObject;
      $big = 999999999; // need an unlikely integer
      echo \'<div class="d-flex justify-content-center pagination">\';
        echo paginate_links( array(
        \'base\' => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
        \'format\' => \'?paged=%#%\',
        \'prev_text\' => __(\'<<\'),
        \'next_text\' => __(\'>>\'),
        \'current\' => max( 1, get_query_var(\'paged\') ),
        \'total\' => $queryObject->max_num_pages
        ) );
      echo \'</div>\';
    ?>
</div>
1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

在用于类别存档的模板中,您不应该使用new WP_Query. 对于所有main templates WordPress会自行加载帖子存档,WordPress已经查询了正确的帖子,因此您无需再次使用WP_Query. 对于这些模板,模板的工作就是显示那些已经查询过的帖子。这是通过使用The Loop.

使用时分页问题如此常见的原因WP_Query 默认情况下就是这样paginate_links() 设计用于根据“主查询”(WordPress已经执行的查询,循环将输出)中每页的帖子数和帖子数输出分页链接。因此,如果您试图将其用于自定义查询,但尚未完全完美地进行设置,那么自定义查询与主查询之间的不匹配将导致错误的结果。

即使您可以修复分页以处理查询,但执行额外查询仍然存在问题,这会降低站点速度,并会导致大量冗余逻辑。最好的解决方案是按照WordPress希望的方式实现模板。

因此,根据您问题中的标记,您的模板应该是:

<div class="row">
    <?php while ( have_posts() ) : the_post(); ?>
        <div class="col-md-4 module">
            <a href="<?php the_permalink(); ?>">
                <!-- ... -->
            </a>
        </div>
    <?php endwhile; ?>

    <div class="d-flex justify-content-center pagination">
        <?php
        echo paginate_links(
            array(
                \'prev_text\' => \'<<\',
                \'next_text\' => \'>>\',
            )
        );
        ?>
    </div>
</div>
这将使用标记和分页控件输出当前类别中的帖子。

那么,如果您想更改有关所查询帖子的某些内容,例如顺序或每页帖子的数量,该怎么办?如果您搜索“每页查询帖子数”或“反向排序帖子”,您可能会看到许多使用new WP_Query. 这些答案演示了如何为新查询而不是现有的主查询设置这些属性。更改主查询的这些属性的过程略有不同。

要更改主查询的帖子数量或顺序,而不是将其放在模板中,您需要在主题函数中添加一个函数。php即hooked 进入pre_get_posts. 此函数将使您有机会更改主查询的属性。例如,如果要更改类别存档的每页帖子数,可以添加以下内容:

add_action(
    \'pre_get_posts\',
    function( $query ) {
        // We don\'t want to affect any back-end queries.
        if ( is_admin() ) {
            return;
        }

        // We only want to modify the main query for category archives.
        if ( $query->is_category() ) {
            // Change the number of posts per page.
            $query->set( \'posts_per_page\', 3 );
        }
    }
);
这将更改类别页面,使其每页仅显示3篇文章,但分页将继续工作,因为您已经修改了分页控件用于的主查询。

通过谷歌搜索“pre_get_posts”,你会发现更多关于这种修改查询方法的资源。

相关推荐

突出显示第一页Pagination_Links

我需要WordPress的帮助。我不是WordPress开发人员,但出于某种原因,我必须在这里更改一些代码。现在说到点子上。我有一个页面,显示一些分页内容。Im使用paginate_links() 生成分页。当我在第一页时,页码不会突出显示它。但从第二页开始,它会突出显示页码。但我也要强调第一点。以下是我使用的代码:<?php $args = array( \'base\' => \'%_%\', \'format\' => \'#page%#%\