设置了 offset 参数时,page-navi 函数失效的解决办法

文 / @WordPress主题

遇到的问题

WordPress中有两个参数用到了MySQL的offset语句,一个是paged,一个是offset,在使用时,如果这两个同时出现,会导致offset可以用,但是分页失效。

通常情况下,需要同时使用这两个参数的情况并不多见,常见的一种情况是在索引页面需要跳过前一篇或者几篇文章不显示,但在索引页面中,分页同样很重要。

解决办法

为了实现这种效果,我们需要通过以下两个WordPress钩子对分页功能进行调整:

  • pre_get_posts:在WordPress查询允许之前,调整WordPress查询参数,并保证offset参数只应用在第一页。
  • found_posts:允许我们调整WordPress文章查询结果总数量。

接下来需要使用pre_get_posts同时处理offset和分页,这个钩子会把WordPress查询对象传递到自定义功能中,在自定义功能中,我们可以对查询对象进行修改。下面的例子中,需要在WordPress博客存档页面跳过前10篇文章:

add_action('pre_get_posts','myprefix_query_offset',1);
functionmyprefix_query_offset(&$query){

//确定我们在正确的位置
if(!$query->is_posts_page){
return;
}
//定义需要跳过的文章数量
$offset=10;
//获取设置中每页现实文章的数量
$ppp=get_option('posts_per_page');
//检测和处理分页
if($query->is_paged){
//手动确定查询偏移量
$page_offset=$offset+(($query->query_vars['paged']-1)*$ppp);
//应用调整后的偏移量
$query->set('offset',$page_offset);
}else{
//如果是首页,只设置偏移量
$query->set('offset',$offset);
}
}

上述代码可以让我们同时使用两个参数,但是还存在一个问题,WordPress计算总文章数量的时候,不会把跳过的文章考虑进入,比如数据库里有25篇文章,每页显示10篇,如果没有偏移,分页数为3,设置了偏移量之后,正确的分页数为2,但是WordPress现实出来的分页仍然是3。如果点击第三页,肯定返回404页面,因为只有15篇文章,这一页根本不存在。为了修复这个问题,我们需要添加一些代码:

add_filter('found_posts','myprefix_adjust_offset_pagination',1,2);
functionmyprefix_adjust_offset_pagination($found_posts,$query){

//定义需要跳过的文章数量
$offset=10;

//确保我们修改的是正确的查询对象
if($query->is_posts_page){
//用找到的文章数量减去偏移的文章数量
return$found_posts-$offset;
}
}

以上是WordPress官方给出的解决方案,如果你有更好的解决方案,欢迎在评论中提出。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。