设置了 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官方给出的解决方案,如果你有更好的解决方案,欢迎在评论中提出。
相关文章
-
如何创建WordPress古腾堡编辑器的区块(PHP+原生JS) 2024-01-10 01:01:06
-
搭建一个WordPress网站需要多少成本 2023-11-06 00:09:51
-
Symlink介绍(附:如何使用Symlink进行WordPress开发) 2023-11-05 23:38:32
-
让WordPress实现数据库同步的插件:HyperDB 2023-10-24 23:40:49
-
allegro电商平台值得做吗(附:2023年Allegro注册流程指南) 2023-10-08 21:53:39
-
印度跨境电商平台有哪些(附:印度跨境电商做什么产品好) 2023-10-08 21:34:23
-
跨境电商必看的几大海外二手电商平台 2023-10-08 18:04:42
-
WordPress同城互联网产品解决方案:UBASE 2023-10-03 16:40:39
-
WordPress网站的安全插件:wordfence 2023-09-14 09:25:18
-
WordPress 6.3 支持在手动更新插件和主题失败后回滚旧版本 2023-08-28 16:58:45