案例#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
根据您的自定义规则,并确保分页不会出错。