第一页上的帖子数不同


11

我需要第一页上每页上的帖子数量与其他页面上不同。

例如,这就是我需要的

  • 总职位:6
  • 第一页:显示3个帖子
  • 下一页:每页显示2条帖子

这是我的代码:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$fp_limit = 3; // first page limit
$limit = 2; // following page limit
$offset = 0; // default offset

if( $paged == 1 ) {
    $limit = $fp_limit;
} else {
    $offset = $fp_limit + ( ($paged - 2) * $limit );
}

$args = array(
    'post_type' => 'my_post_type',
    'post_status' => 'publish',
    'offset' => $offset,
    'posts_per_page' => $limit,
    'caller_ get_ posts' => -1, // remove sticky post
    'paged' => $paged,
    'tax_query' => array(
        array(
            'taxonomy' => 'my_taxo',
            'field' => 'slug',
            'terms' => array('slug1', 'slug2', 'slug3')
        )
    )
);
$my_query = null;
$my_query = new WP_Query($args);

// basic loop
if( $my_query->have_posts() ) : 
while ($my_query->have_posts()) : $my_query->the_post();

...

endwhile; endif; // archive loop
if (function_exists('wp_pagenavi')){ wp_pagenavi( array( 'query' => $my_query ) ); }

wp_reset_query();

在存档的第一页,此代码假定:

好,总共6个帖子,每页3个帖子。因此,我需要2个存档页面,而我向您展示的分页为:

[1] [2]

但是,存档中的任何其他页面的代码都假定:

好吧,总共6个帖子,每页2个帖子。因此,我需要3个存档页面,而我向您展示的分页为:

[1] [2] [3]

需要一点帮助来解决此问题。


如果我能告诉WP_pagenavi在第一页上剩下多少个帖子,剩下的……
norixxx14年

为什么您确实需要这样做呢?任何特殊原因
Pieter Goosen 2014年

只是我客户的自私。我实际上不在乎是否使用wp_pagenavi。我可以使用其他技巧吗?
norixxx

2
首先出现的'caller_ get_ posts'空格,无效。其次,已弃用。使用ignore_sticky_posts代替。
kaiser 2014年

您的首页,是普通首页还是设为首页
Pieter Goosen 2014年

Answers:


21

编辑-已答复的答案

我正在研究另一个解决方案,该解决方案实际上比原始答案更好。这不涉及任何自定义查询,我认为出于所有目的,我的原始答案可以删除,但出于参考目的而保留

我仍然相信您会在首页上,并且也会这样处理。这是我的新解决方案

第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_get_posts改变主查询到您的自定义分类添加到主查询显示在主页上。

步骤3

现在,posts_per_page从后端获取选项集(我假设是2),并设置您offset将要使用的选项。那是1因为您将在第一页上需要3个帖子,其余的则需要2个帖子

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

步骤4

在一个页面,你会需要添加offsetposts_per_page加起来也就3到得到一个页面的三个职位。

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

步骤5

您必须将其应用于offset所有后续页面,否则将在下一页上重复该页面的最后一个帖子

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

步骤6

最后,您需要从中减去偏移量,found_posts否则您在最后一页上的分页将是错误的,并且404由于错误的帖子数而将丢失最后一个帖子,从而给您带来错误

注意:这段代码破坏了搜索页面上的分页。现在已修复,请参阅更新的代码

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

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );

全部一起

这就是完整查询的外观,应该将它放入functions.php中

function tax_and_offset_homepage( $query ) {
  if ($query->is_home() && $query->is_main_query() && !is_admin()) {
    $query->set( 'post_type', 'my_post_type' );
    $query->set( 'post_status', 'publish' );
    $query->set( 'ignore_sticky_posts', '-1' );
    $tax_query = array(
        array(
            'taxonomy' => 'my_taxo',
            'field' => 'slug',
            'terms' => array('slug1', 'slug2', 'slug3')
        )
    );
    $query->set( 'tax_query', $tax_query );
    $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','tax_and_offset_homepage');

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

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );

3

我知道这是从1000年前开始的,但是对于任何使用自定义查询时正在寻找该解决方案的人来说,这是另一个解决方案,这是如何做到的。在此示例中,第一页需要10个帖子,随后的每个页面都需要9个帖子。

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if( $paged == 1 ) {
   $limit = 10;
} else {
   $limit = 9;
}

然后在数组中使用:

'posts_per_page' => $limit,

现在您可以开始了。


2
这行不通。有了这个,您的#10帖子将显示两次。由于进入第二页时,它将“认为”第一页也显示了9条帖子,因此尽管已经显示在第一页上,但将开始显示帖子#10。
leymannx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.