
很多人学 Z-BlogPHP 插件开发,卡的不是 PHP 语法,而是 Hook。
最常见的状态是这样的:
- 知道系统里有很多 Hook
- 也知道插件离不开 Hook
- 但一到真要改东西的时候,完全不知道该找哪个
于是就会出现两种极端:
- 要么全站乱搜,越搜越晕
- 要么开始死背 Hook 名字,最后还是不会用
其实 Hook 这件事,最重要的从来不是记忆力,而是分类能力。
你只要先把需求归类,再去找对应 Hook 家族,效率会高很多。
一、先别把 Hook 想得太玄
在 Z-BlogPHP 里,Hook 可以先粗暴理解成一句话:
系统在某个阶段,留了一个能让主题或插件插入逻辑的位置。
所以 Hook 不是另外一套平行系统。
它只是让你在:
- 请求开始前后
- 列表页渲染前后
- 文章页渲染前后
- 评论提交前后
- 后台菜单、编辑页、表格输出时
- API 处理时
这些节点里,挂进自己的代码。
你一旦这样理解,Hook 就没那么吓人了。
二、找 Hook 前,先问自己在改什么
这是最关键的一步。
与其一上来问“有哪些 Hook”,不如先问:
- 我是在改前台页面
- 还是在改后台
- 还是在改评论
- 还是在改路由
- 还是在改 API
只要这个问题先答清楚,搜索范围就会立刻缩小很多。
三、最常见的 Hook 家族,大致可以分成这几类
1. 前台页面相关
如果你改的是:
- 列表页
- 文章页
- 搜索页
- 模板选择
那优先关注前台视图相关 Hook。
最常见的一组包括:
Filter_Plugin_ViewList_CoreFilter_Plugin_ViewPost_CoreFilter_Plugin_ViewSearch_CoreFilter_Plugin_ViewList_TemplateFilter_Plugin_ViewPost_Template
它们适合处理的方向大致是:
- 列表页数据准备
- 文章页数据准备
- 搜索结果处理
- 页面模板切换
2. 后台相关
如果你改的是:
- 后台菜单
- 后台表格
- 编辑页字段
- 后台全局头尾
那就优先看后台 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 的价值非常高,因为很多后台扩展根本不需要改核心文件。
3. 请求和启动阶段相关
如果你改的是:
- 路由
- 早期初始化
- 权限拦截
- 全局预处理
那就先看早期请求相关 Hook。
最常见的是:
Filter_Plugin_Zbp_PreLoadFilter_Plugin_Zbp_LoadFilter_Plugin_Zbp_Load_Pre
其中最常见的一个用途,就是路由注册。
4. 评论相关
如果你改的是:
- 评论校验
- 评论审核
- 反垃圾
- 评论错误处理
那就优先看评论 Hook。
最常见的一组包括:
Filter_Plugin_PostComment_CoreFilter_Plugin_CheckComment_CoreFilter_Plugin_CheckComment_SucceedFilter_Plugin_Error_Handler
评论这一块常常不是模板问题,而是流程问题,所以很多时候真正该看的不是 comments.php,而是这些 Hook。
5. API 相关
如果你改的是:
- 自定义 API 模块
- API 请求过滤
- API 返回数据调整
- CSRF 例外控制
那就看 API Hook 家族。
例如:
Filter_Plugin_API_Extend_ModsFilter_Plugin_API_CheckModsFilter_Plugin_API_Result_DataFilter_Plugin_API_Response
这组更偏进阶,但一旦做内部工具或对接系统,就会用得上。
四、最稳的找 Hook 方法,不是全站乱搜
我更建议按这个顺序来。
第一步,先在目标插件或主题里搜
比如先搜:
rg -n "RegisterPlugin|Add_Filter_Plugin|RegRoute" zb_users
这样做的好处是,你先看到当前项目里“已经在怎么挂接”。
很多时候,现成写法比空背文档有用得多。
第二步,再按需求搜 Hook 家族
比如你在做评论,就搜:
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- 相关参考文档
这时你带着问题去看,会比一上来翻平台文件有效得多。
五、看到 Hook 名字后,怎么判断它离需求近不近
不要只看名字像不像。
更稳的判断方式是看三件事:
1. 它发生在前台还是后台
这决定了你是不是已经找错层。
2. 它发生在数据准备阶段还是模板输出阶段
比如:
ViewList_Core更像逻辑准备ViewPost_Template更像模板选择
3. 它发生在提交前还是提交后
比如评论、保存、删除,这个顺序差别很大。
你要做校验,通常挂“前”。
你要做成功后的副作用,通常挂“后”。
六、别死记具体名字,先记住几个高价值入口
如果你刚开始,不必背完整表。
先记这些就够用很多了:
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 的基本使用骨架长什么样
不管具体挂哪个 Hook,结构通常都长这样:
RegisterPlugin("MyPlugin", "ActivePlugin_MyPlugin");
function ActivePlugin_MyPlugin() {
Add_Filter_Plugin('Filter_Plugin_Zbp_Load', 'MyPlugin_Init');
}
function MyPlugin_Init() {
}
你真正要替换的,其实只有两处:
- 挂哪个 Hook
- 处理函数具体做什么
所以 Hook 学不会,往往不是不会写这几行,而是还没有建立“需求 -> Hook 家族”的映射。
八、几种特别常见的需求,对应先看哪些 Hook
想给文章编辑页加一个 SEO 字段
先看:
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 更像一张地图,而不是一本词典。
九、最常见的 5 个误区
1. 先背名字,再找场景
顺序反了。
2. 找到一个名字像的 Hook 就直接挂
不看阶段、不看上下文,后面很容易挂偏。
3. 一个问题只盯模板,不看 Hook
很多流程问题根本不在模板层。
4. 只搜 zb_system,不先看项目代码
这样常常会把自己带得太深。
5. 看到 Hook 多就害怕
实际上你前期真正高频用到的,就是那几组。
结语
Hook 这件事,一旦从“背单词”切到“看地图”,难度会一下降很多。
你真正要练出来的是这条路径:
- 先判断自己在改什么
- 再锁定 Hook 家族
- 再去搜当前项目写法
- 最后才看平台定义
只要这条路熟了,后面你写字段、写评论插件、写路由、写后台扩展,都会顺很多。
下一篇我们继续讲 Metas 和自定义字段,这正是 Hook 最常见、也最实用的一块落地场景。
发表评论
发表评论