第一个分页页面和其余分页页面的Posts_Per_Page设置是否不同?

时间:2013-11-24 作者:its_me

如何设置posts_per_page 查询设置,以便在第一个分页页面(主页、存档、搜索等)和其余页面上显示不同数量的帖子?

例如,假设我想在类别档案的第一个分页页面上显示10篇文章,在其余页面上显示15篇文章。我该怎么做?

This works:

function itsme_category_offset( $query ) {
  if( $query->is_category() && $query->is_main_query() ) {

    if( !$query->is_paged() ) {

      $query->set( \'posts_per_page\', 10 );

    } else {

      $query->set( \'offset\', 10 );
      $query->set( \'posts_per_page\', 15 );

    }
  }
}
add_action( \'pre_get_posts\', \'itsme_category_offset\' );
But...

根据the Codex entry for WP_Query() pagination parameters:

偏移(int)-要置换或传递的桩号。Warning: Setting the offset parameter overrides/ignores the paged parameter and breaks pagination

根据the linked Codex entry for a workaround:

在查询中指定硬编码偏移量可以也将中断分页,因为偏移量由WordPress内部用于计算和处理分页。

所示的解决方法使用的函数found_posts 过滤并建立偏移。它假设我应该这样做:

function itsme_category_offset( $query ) {
  if( $query->is_category() && $query->is_main_query() ) {
    $paged = get_query_var( \'paged\' );

    if( 0 == $paged ) {

      $query->set( \'posts_per_page\', 10 );

    } else {

      $offset = 10 + ( ($paged - 2) * 15 );
      $query->set( \'offset\', $offset );
      $query->set( \'posts_per_page\', 15 );

    }
  }
}
add_action( \'pre_get_posts\', \'itsme_category_offset\' );

function itsme_adjust_category_offset_pagination( $found_posts, $query ) {
  $paged = get_query_var( \'paged\' );
  if( $query->is_category() && $query->is_main_query() ) {
    if( 0 == $paged ) {

      $offset = 0;

    } else {

      $offset = 10 + ( ($paged - 2) * 15 );

    }

    return $found_posts - $offset;
  }
}
add_filter( \'found_posts\', \'itsme_adjust_category_offset_pagination\' );
既然我的简单函数已经工作了,那么Codex警告是否仍然正确?(即,我是否应该按照第二个代码块所示进行操作?)WordPress的最新版本中是否修复了此偏移/分页问题?如果是的话:如何?

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

案例#1:简单偏移

您希望通过“n”来“偏移”类别存档中的帖子,即您不想显示存档中的第一个/最新的“n”帖子。

也就是说,(考虑到posts_per_page “WP Dashboard”>“Settings”>“Reading”中的设置设置为10)您希望在第一页显示帖子11到20(例如。example.com/category/tech/), 第二个21到30(例如。example.com/category/tech/page/2/), 第三个是31到40,以此类推。

不管怎样,下面是您的操作方法:

/*
 * Offset posts by 10 on \'Techonology (tech)\' category archive
 */
function itsme_category_offset( $query ) {
    $offset = 10;
    $ppp = get_option( \'posts_per_page\' );
    $paged = $query->query_vars[ \'paged\' ];

    if( $query->is_category( \'tech\' ) && $query->is_main_query() ) {
        if( !is_paged() ) {

            $query->set( \'offset\', $offset );

        } else {

            $paged_offset = $offset + ( ($paged - 1) * $ppp );
            $query->set( \'offset\', $paged_offset );

        }
    }
}
add_action( \'pre_get_posts\', \'itsme_category_offset\' );
那么,还有一件事。在创建分页之前,WordPress会查看WP_Query 类报告在运行查询时查找。

因此,要使分页正常工作,需要删除offset 来自查询找到的帖子总数(因为前10篇帖子没有显示)。这就是你要做的:

function itsme_adjust_category_offset_pagination( $found_posts, $query ) {
    $offset = 10;

    if( $query->is_category( \'tech\' ) && $query->is_main_query() ) {
        return( $found_posts - $offset );
    }
}
add_filter( \'found_posts\', \'itsme_adjust_category_offset_pagination\', 10, 2 );
就是这样!

PS: (可以找到更技术性的解释here.)

案例2:条件偏移量与我的案例一样,您希望在存档的第一页上显示“m”个帖子,在其他页面上显示“n”个帖子。

也就是说,(考虑到您只想在归档的第一页上显示5篇文章,并让其余页面遵循posts_per_page 在“WP Dashboard”>“Settings”>“Reading”中设置,设置为10)您希望在第一页显示帖子1到5(例如。example.com/category/tech/), 第二次为6到15(例如。example.com/category/tech/page/2/), 第三个是16到25,依此类推。

您可以这样做:

/*
 * Show a different no. of posts on the first page, and the rest
 * of the pages of \'Techonology (tech)\' category archive
 */
function itsme_category_offset( $query ) {
    $ppp = get_option( \'posts_per_page\' );
    $first_page_ppp = 5;
    $paged = $query->query_vars[ \'paged\' ];

    if( $query->is_category( \'tech\' ) && $query->is_main_query() ) {
        if( !is_paged() ) {

            $query->set( \'posts_per_page\', $first_page_ppp );

        } else {

            // Not going to explain the simple math involved here
            $paged_offset = $first_page_ppp + ( ($paged - 2) * $ppp );
            $query->set( \'offset\', $paged_offset );

            /*
             * As we are not adding a custom `$query->set( \'posts_per_page\', ... );`,
             * the default `posts_per_page` setting from WP Dashboard > Settings > Reading
             * will be applied here.
             */

        }
    }
}
add_action( \'pre_get_posts\', \'itsme_category_offset\' );
这个案子很复杂。那么,首先让我们看看found_posts 函数应如下所示:

function itsme_adjust_category_offset_pagination( $found_posts, $query ) {
    $ppp = get_option( \'posts_per_page\' );
    $first_page_ppp = 5;

    if( $query->is_category( \'tech\' ) && $query->is_main_query() ) {
        if( !is_paged() ) {

            return( $found_posts );

        } else {

            return( $found_posts - ($first_page_ppp - $ppp) );

        }
    }
    return $found_posts;
}
add_filter( \'found_posts\', \'itsme_adjust_category_offset_pagination\', 10, 2 );
与中不同Case #1, 在这里,我们没有从总数中删除任何职位;我们需要展示所有这些;除了我们想在类别归档的第一页上显示一组帖子,在其他分页页面上显示不同数量的帖子。

问题是,为了计算生成分页的页数,$query (WP\\u查询)查看posts_per_page 当前页面的设置。由于我们将除第一页以外的所有其他页的值设置为“10”,因此在除第一页以外的任何其他页上,$query 假设所有页面(包括上一页/下一页,即包括第一页)都是相同的,并开始基于此计算分页。

例如,在第二页(如果我们将帖子总数取为“20”),根据:

  • $query 分页应为:10+10,但correct 分页将是:5+10+5(因为在pre_get_posts 函数我们将第一页的分页设置为“5”)
因此,在第二页(或除第一页以外的任何页面)上,根据我们的示例,我们需要$query 相信帖子的总数是25个,这样就可以生成这样一个正确的分页。。。

5 第1页上的帖子+10 第二+5 3号岗位

。。。认为它实际上是这样做的:

10 第1页上的帖子+10 第二+5 3号岗位

从那以后found_posts 过滤器对给定页面上实际显示的帖子数量没有任何影响posts_per_page 将以第一个函数的设置为准,没有分页问题。

这应该会把事情弄清楚(如果有什么问题,一定要告诉我。)

因此,要直接回答这个问题,是的,您通常需要使用一个found_posts 过滤器挂钩,用于调整$query 根据您的自定义规则,并确保分页不会出错。

SO网友:Oxfordian3

我没有足够的stackexchange点数来评论上述内容,但我确实有一个更正。

案例#1:简单的补偿对我的网站非常有效。它只需要修复,以便在不满足特殊条件时返回默认偏移量:

function itsme_adjust_category_offset_pagination( $found_posts, $query ) {
    $offset = 10;

    if( $query->is_category( \'tech\' ) && $query->is_main_query() ) {
        return( $found_posts - $offset );
    } else {
        return $found_posts;
    }
}
add_filter( \'found_posts\', \'itsme_adjust_category_offset_pagination\', 10, 2 );

结束

相关推荐

Pagination for event query

我正在使用Modern Tribe Events Calendar我的问题是分页。这是对WP\\U查询分页的错误方式,还是有其他方法可以对事件日历分页?我找到了一个tutorial 这使用了WPNavi插件,但我想使用核心wordpress函数。<?php $upcoming = new WP_Query(); $upcoming->query( array( \'post_type\'=> \'tribe_events\', \'eve