
很多人学 Z-BlogPHP 插件开发,卡的不是 PHP 语法,而是 Hook。
最常见的状态是这样的:
于是就会出现两种极端:
其实 Hook 这件事,最重要的从来不是记忆力,而是分类能力。
你只要先把需求归类,再去找对应 Hook 家族,效率会高很多。
在 Z-BlogPHP 里,Hook 可以先粗暴理解成一句话:
系统在某个阶段,留了一个能让主题或插件插入逻辑的位置。
所以 Hook 不是另外一套平行系统。
它只是让你在:
这些节点里,挂进自己的代码。
你一旦这样理解,Hook 就没那么吓人了。
这是最关键的一步。
与其一上来问“有哪些 Hook”,不如先问:
只要这个问题先答清楚,搜索范围就会立刻缩小很多。
如果你改的是:
那优先关注前台视图相关 Hook。
最常见的一组包括:
Filter_Plugin_ViewList_CoreFilter_Plugin_ViewPost_CoreFilter_Plugin_ViewSearch_CoreFilter_Plugin_ViewList_TemplateFilter_Plugin_ViewPost_Template它们适合处理的方向大致是:
如果你改的是:
那就优先看后台 Hook 家族。
例如:
Filter_Plugin_Admin_HeaderFilter_Plugin_Admin_FooterFilter_Plugin_Admin_TopMenuFilter_Plugin_Admin_ArticleMng_TableFilter_Plugin_Edit_ResponseFilter_Plugin_Category_Edit_ResponseFilter_Plugin_Tag_Edit_Response这类 Hook 的价值非常高,因为很多后台扩展根本不需要改核心文件。
如果你改的是:
那就先看早期请求相关 Hook。
最常见的是:
Filter_Plugin_Zbp_PreLoadFilter_Plugin_Zbp_LoadFilter_Plugin_Zbp_Load_Pre其中最常见的一个用途,就是路由注册。
如果你改的是:
那就优先看评论 Hook。
最常见的一组包括:
Filter_Plugin_PostComment_CoreFilter_Plugin_CheckComment_CoreFilter_Plugin_CheckComment_SucceedFilter_Plugin_Error_Handler评论这一块常常不是模板问题,而是流程问题,所以很多时候真正该看的不是 comments.php,而是这些 Hook。
如果你改的是:
那就看 API Hook 家族。
例如:
Filter_Plugin_API_Extend_ModsFilter_Plugin_API_CheckModsFilter_Plugin_API_Result_DataFilter_Plugin_API_Response这组更偏进阶,但一旦做内部工具或对接系统,就会用得上。
我更建议按这个顺序来。
比如先搜:
rg -n "RegisterPlugin|Add_Filter_Plugin|RegRoute" zb_users
这样做的好处是,你先看到当前项目里“已经在怎么挂接”。
很多时候,现成写法比空背文档有用得多。
比如你在做评论,就搜:
rg -n "PostComment|CheckComment|Error_Handler" zb_users zb_system
如果你在做编辑页扩展,就搜:
rg -n "Edit_Response|Category_Edit_Response|Tag_Edit_Response" zb_users zb_system
如果项目层还不够清楚,再看:
zb_system/function/c_system_plugin.php这时你带着问题去看,会比一上来翻平台文件有效得多。
不要只看名字像不像。
更稳的判断方式是看三件事:
这决定了你是不是已经找错层。
比如:
ViewList_Core 更像逻辑准备ViewPost_Template 更像模板选择比如评论、保存、删除,这个顺序差别很大。
你要做校验,通常挂“前”。
你要做成功后的副作用,通常挂“后”。
如果你刚开始,不必背完整表。
先记这些就够用很多了:
Filter_Plugin_Zbp_PreLoadFilter_Plugin_Zbp_LoadFilter_Plugin_ViewList_CoreFilter_Plugin_ViewPost_CoreFilter_Plugin_ViewList_TemplateFilter_Plugin_ViewPost_TemplateFilter_Plugin_Edit_ResponseFilter_Plugin_Category_Edit_ResponseFilter_Plugin_Tag_Edit_ResponseFilter_Plugin_PostComment_Core这些覆盖了:
已经足够支撑很多常见开发了。
不管具体挂哪个 Hook,结构通常都长这样:
RegisterPlugin("MyPlugin", "ActivePlugin_MyPlugin");
function ActivePlugin_MyPlugin() {
Add_Filter_Plugin('Filter_Plugin_Zbp_Load', 'MyPlugin_Init');
}
function MyPlugin_Init() {
}
你真正要替换的,其实只有两处:
所以 Hook 学不会,往往不是不会写这几行,而是还没有建立“需求 -> Hook 家族”的映射。
先看:
Filter_Plugin_Edit_Response先看:
Filter_Plugin_Category_Edit_Response先看:
Filter_Plugin_ViewList_Core先看:
Filter_Plugin_Zbp_PreLoad先看:
Filter_Plugin_PostComment_CoreFilter_Plugin_CheckComment_Core这就是为什么我一直说,Hook 更像一张地图,而不是一本词典。
顺序反了。
不看阶段、不看上下文,后面很容易挂偏。
很多流程问题根本不在模板层。
zb_system,不先看项目代码这样常常会把自己带得太深。
实际上你前期真正高频用到的,就是那几组。
Hook 这件事,一旦从“背单词”切到“看地图”,难度会一下降很多。
你真正要练出来的是这条路径:
只要这条路熟了,后面你写字段、写评论插件、写路由、写后台扩展,都会顺很多。
下一篇我们继续讲 Metas 和自定义字段,这正是 Hook 最常见、也最实用的一块落地场景。
发表评论: