解决ZBlogPHP通过钩子代码无法正常获取前后文章的问题
最近在用ZBlogPHP作为后台帮朋友搭建网站的时候遇到了获取与当前文章的隶属于同一分类的文章的“前一篇”与“后一盘”文章的需求。
因为ZBlogPHP的底层是作为个人博客而设计的,它和其他的博客系统一样,默认附带了获取当前文章“前一篇”“后一篇”文章的标签,但是这是基于整站文章获取的,不是在当前分类中查找。
不过ZBlogPHP预留了丰富的接口钩子,可以通过二次开发实现默认程序中没有实现的个性化需求。
通过查询官网的二次开发文档,我找到了“Filter_Plugin_Post_Next”和“Filter_Plugin_Post_Prev”两个钩子,也就知道可以通过这个钩子去实现我需要的同一分类下的文章的前后一篇文章。
首先,编写附带分类过滤功能条件的获取上下文的功能函数:
// 获取同类文章的上篇 function Leo_Post_Prev(&$getthis) { global $zbp; $prev = $getthis; $articles = $zbp->GetArticleList( array('*'), array(array('=', 'log_Type', 0), array('=', 'log_CateID', $prev->Category->ID), array('=', 'log_Status', 0), array('<', 'log_PostTime', $prev->PostTime)), array('log_PostTime' => 'DESC'), array(1), null ); if (count($articles) == 1) { return $articles[0]; } else { return null; } } // 获取同类文章的下篇 function Leo_Post_Next(&$getthis) { global $zbp; $next = $getthis; $articles = $zbp->GetArticleList( array('*'), array(array('=', 'log_Type', 0), array('=', 'log_CateID', $next->Category->ID), array('=', 'log_Status', 0), array('>', 'log_PostTime', $next->PostTime)), array('log_PostTime' => 'ASC'), array(1), null ); if (count($articles) == 1) { return $articles[0]; } else { return null; } }
然后,在主题(插件)激活函数ActivePlugin_XXXXX()中添加钩子调用这两个功能函数的方法:
Add_Filter_Plugin('Filter_Plugin_Post_Next', 'Leo_Post_Next'); Add_Filter_Plugin('Filter_Plugin_Post_Prev', 'Leo_Post_Prev');
不出意外的话,在主题中正常使用前后一篇文章的标签获取隶属于同一分类的上下一篇文章信息了。
<a href="{$article.Prev.Url}" rel="prev">前一篇:{$article.Prev.Title}</a> <a href="{$article.Next.Url}" rel="next">后一篇:{$article.Next.Title}</a>
在前端测试的时候,发现了问题,“后一篇”里面出现的文章和“前一篇”的内容一样,并没有出现预期的“后一篇”的文章信息。
在确认我编写的代码没有问题后,我去查看系统核心代码,在“zb_system\function\lib\post.php”文件中找到了问题,在钩子Filter_Plugin_Post_Next的实现逻辑中,程序开发人员将_next误写成_prev了。
由于主题(插件)无法改写zb_system中的内容,只能直接在系统代码中修改了(正常情况下不建议修改系统核心代码),在将此处三个_prev修改为_next后,通过上述钩子代码获取当前分类中“前一篇““后一篇”文章的功能正常运行了。
最后,我到Github上ZBlogPHP代码库中将这个问题作为issue反馈给开发者了,希望在后续的版本中能够修复。
Update 2020.3.29 21:30
ZBlogPHP主程序开发人员很快在Github上确认了我提出的issue,并将bug修复合并到主程序中,现在无需修改zb_system\function\lib\post.php文件中的核心代码了。
留言评论