Hook 到底怎么找、怎么用?先别死记名字

Hook 到底怎么找、怎么用?先别死记名字 配图

很多人学 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_Core
  • Filter_Plugin_ViewPost_Core
  • Filter_Plugin_ViewSearch_Core
  • Filter_Plugin_ViewList_Template
  • Filter_Plugin_ViewPost_Template

它们适合处理的方向大致是:

  • 列表页数据准备
  • 文章页数据准备
  • 搜索结果处理
  • 页面模板切换

2. 后台相关

如果你改的是:

  • 后台菜单
  • 后台表格
  • 编辑页字段
  • 后台全局头尾

那就优先看后台 Hook 家族。

例如:

  • Filter_Plugin_Admin_Header
  • Filter_Plugin_Admin_Footer
  • Filter_Plugin_Admin_TopMenu
  • Filter_Plugin_Admin_ArticleMng_Table
  • Filter_Plugin_Edit_Response
  • Filter_Plugin_Category_Edit_Response
  • Filter_Plugin_Tag_Edit_Response

这类 Hook 的价值非常高,因为很多后台扩展根本不需要改核心文件。

3. 请求和启动阶段相关

如果你改的是:

  • 路由
  • 早期初始化
  • 权限拦截
  • 全局预处理

那就先看早期请求相关 Hook。

最常见的是:

  • Filter_Plugin_Zbp_PreLoad
  • Filter_Plugin_Zbp_Load
  • Filter_Plugin_Zbp_Load_Pre

其中最常见的一个用途,就是路由注册。

4. 评论相关

如果你改的是:

  • 评论校验
  • 评论审核
  • 反垃圾
  • 评论错误处理

那就优先看评论 Hook。

最常见的一组包括:

  • Filter_Plugin_PostComment_Core
  • Filter_Plugin_CheckComment_Core
  • Filter_Plugin_CheckComment_Succeed
  • Filter_Plugin_Error_Handler

评论这一块常常不是模板问题,而是流程问题,所以很多时候真正该看的不是 comments.php,而是这些 Hook。

5. API 相关

如果你改的是:

  • 自定义 API 模块
  • API 请求过滤
  • API 返回数据调整
  • CSRF 例外控制

那就看 API Hook 家族。

例如:

  • Filter_Plugin_API_Extend_Mods
  • Filter_Plugin_API_CheckMods
  • Filter_Plugin_API_Result_Data
  • Filter_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_PreLoad
  • Filter_Plugin_Zbp_Load
  • Filter_Plugin_ViewList_Core
  • Filter_Plugin_ViewPost_Core
  • Filter_Plugin_ViewList_Template
  • Filter_Plugin_ViewPost_Template
  • Filter_Plugin_Edit_Response
  • Filter_Plugin_Category_Edit_Response
  • Filter_Plugin_Tag_Edit_Response
  • Filter_Plugin_PostComment_Core

这些覆盖了:

  • 路由
  • 启动
  • 列表页
  • 详情页
  • 模板切换
  • 编辑页字段
  • 评论流程

已经足够支撑很多常见开发了。

七、一个 Hook 的基本使用骨架长什么样

不管具体挂哪个 Hook,结构通常都长这样:

RegisterPlugin("MyPlugin", "ActivePlugin_MyPlugin");

function ActivePlugin_MyPlugin() {
    Add_Filter_Plugin('Filter_Plugin_Zbp_Load', 'MyPlugin_Init');
}

function MyPlugin_Init() {
}

你真正要替换的,其实只有两处:

  1. 挂哪个 Hook
  2. 处理函数具体做什么

所以 Hook 学不会,往往不是不会写这几行,而是还没有建立“需求 -> Hook 家族”的映射。

八、几种特别常见的需求,对应先看哪些 Hook

想给文章编辑页加一个 SEO 字段

先看:

  • Filter_Plugin_Edit_Response

想给分类编辑页加一个描述字段

先看:

  • Filter_Plugin_Category_Edit_Response

想调整列表页渲染前的数据

先看:

  • Filter_Plugin_ViewList_Core

想给某些请求注册自定义路由

先看:

  • Filter_Plugin_Zbp_PreLoad

想拦评论、做反垃圾或审核

先看:

  • Filter_Plugin_PostComment_Core
  • Filter_Plugin_CheckComment_Core

这就是为什么我一直说,Hook 更像一张地图,而不是一本词典。

九、最常见的 5 个误区

1. 先背名字,再找场景

顺序反了。

2. 找到一个名字像的 Hook 就直接挂

不看阶段、不看上下文,后面很容易挂偏。

3. 一个问题只盯模板,不看 Hook

很多流程问题根本不在模板层。

4. 只搜 zb_system,不先看项目代码

这样常常会把自己带得太深。

5. 看到 Hook 多就害怕

实际上你前期真正高频用到的,就是那几组。

结语

Hook 这件事,一旦从“背单词”切到“看地图”,难度会一下降很多。

你真正要练出来的是这条路径:

  • 先判断自己在改什么
  • 再锁定 Hook 家族
  • 再去搜当前项目写法
  • 最后才看平台定义

只要这条路熟了,后面你写字段、写评论插件、写路由、写后台扩展,都会顺很多。

下一篇我们继续讲 Metas 和自定义字段,这正是 Hook 最常见、也最实用的一块落地场景。

发表评论

发表评论