设置了 offset 参数时,page-navi 函数失效的解决办法
文 / @UTHEME
遇到的问题
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官方给出的解决方案,如果你有更好的解决方案,欢迎在评论中提出。

相关文章
-
IDC/ISP办理许可证的基本条件(附:IDC和ISP许可证申请流程) 2023-06-07 08:00:01
-
利用tinymce.activeEditor获取到 WordPress可视化编辑器中的值(附:tinymce.activeEditor常见其他用法) 2023-06-06 08:00:02
-
WordPress是什么框架吗?WordPress是用什么写的? 2023-06-06 08:00:02
-
WordPress哪个版本稳定好用(附:如何查看当前WordPress版本) 2023-06-06 08:00:02
-
Automattic 发布 wp-now:由 WordPress Playground 提供支持的本地开发环境 2023-06-05 08:00:02
-
PHP预定义常量都有哪些(含常见PHP魔术常量) 2023-06-04 08:00:01
-
php的 require 和include 有什么区别 2023-06-04 08:00:01
-
UGPT插件:国内首个永久免费WordPress ChatGPT插件 2023-06-04 08:00:01
-
wordpress seo哪个插件好用 – WordPress SEO by Yoast 2023-06-03 08:00:02
-
WordPress古腾堡编辑器模块开发教程 2023-06-03 08:00:02