提问者:小点点

更改连续类别页面上的帖子数量(Wordpress)


我正在尝试将类别页面上显示的帖子数量更改为连续页面上显示的帖子数量(第2页、第3页等)。因此,第一页显示7篇文章,但该类别的第2、3和4页等每页仅显示6篇文章(即,当您单击“下一页”列出旧文章时)。

我知道改变不同类别/存档页面的帖子数量相对简单——但这是不同的,因为我希望分页页面有不同数量的帖子。

有什么想法吗?


共1个答案

匿名用户

这是我最近在WPSE上做的一个回答。我做了一些改变以满足你的需要。你可以去看看这里的帖子

步骤1

如果您已经更改了自定义查询的主查询,请将其更改回默认循环

<?php

        if ( have_posts() ) :
            // Start the Loop.
            while ( have_posts() ) : the_post();

                ///<---YOUR LOOP--->

            endwhile;

                //<---YOUR PAGINATION--->   

            else : 

                //NO POSTS FOUND OR SOMETHING   

            endif; 

    ?>

步骤2

使用pre\u get\u posts更改主查询,以更改类别页面上的posts\u per\u page参数

步骤3

现在,从后端获取posts\u per\u page选项集(我假设为6),并设置我们将要使用的偏移量。这将是1,因为你将需要在第一页上发表7篇文章,在其余页上发表6篇文章

$ppg = get_option('posts_per_page');
$offset = 1;

步骤4

在第一页上,您需要将偏移量添加到每页的帖子中将加起来最多7篇,以获得第一页上的7篇帖子。

$query->set('posts_per_page', $offset + $ppp);

步骤5

您必须将您的偏移量应用于所有后续页面,否则您将在下一页重复该页面的最后一篇文章

$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset); 

步骤6

最后,你需要从found_posts中减去你的偏移量,否则你在最后一页的分页将是错误的,并给你一个404错误,因为最后一篇文章将因不正确的帖子计数而丢失

function category_offset_pagination( $found_posts, $query ) {
    $offset = 1;

    if( !is_admin() && $query->is_category() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'category_offset_pagination', 10, 2 );

全部

这就是你的完整查询应该进入函数的样子。php

function ppp_and_offset_category_page( $query ) {
  if ($query->is_category() && $query->is_main_query() && !is_admin()) {
    $ppp = get_option('posts_per_page');
    $offset = 1;
    if (!$query->is_paged()) {
      $query->set('posts_per_page',$offset + $ppp);
    } else {
      $offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
      $query->set('posts_per_page',$ppp);
      $query->set('offset',$offset);
    }
  }
}
add_action('pre_get_posts','ppp_and_offset_category_page');

function category_offset_pagination( $found_posts, $query ) {
    $offset = 1;

    if( !is_admin() && $query->is_category() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'category_offset_pagination', 10, 2 );