CMS 的钩子机制越来越好用,但新人反而更难入门了

· 互联网观察 · 阅读 8
摘要

这两天翻了几个 CMS 的插件文档,从 WordPress 的 add_action 到 Z-Blog 的 Add_Filter_Plugin,钩子设计确实比十年前成熟太多。可我心里有点别的感受:越好用,新人越懵。 以前的插件是「抄一份改」

这两天翻了几个 CMS 的插件文档,从 WordPress 的 add_action 到 Z-Blog 的 Add_Filter_Plugin,钩子设计确实比十年前成熟太多。可我心里有点别的感受:越好用,新人越懵。

以前的插件是「抄一份改」,现在是「找那个点」

老式做法很粗暴,直接把主题文件复制一份,改完丢回去。丑,但门槛低——你能看见每一行在干什么。

钩子时代不是这样。文档告诉你「挂到 xxx 钩子上」,可那个钩子到底在流程的哪一步触发、传进来几个参数、返回值被谁用了,文档经常就一两句话。我上个月在 WordPress 里找 wp_head 上某个回调的优先级,翻主题源码找了半小时。

这不是某个 CMS 的问题,是设计上必然的代价。你抽象得越干净,使用者的心智负担就越多地转移到「理解抽象」上。

参数名起得好不好,决定了学习成本

举个具体的。WordPress 的 pre_get_posts 传的是一个 WP_Query 对象;Z-Blog 的 Filter 传的是值,而且要自己 return。前者适合改状态,后者适合改内容。同一个词「钩子」,两种模型。

我见过不少人抱怨「Z-Blog 的钩子没法改数据」,其实能,只是得 return 回去。反过来也有人说 WP 的 filter 太啰嗦,一个值套三层函数。

哪种更好?我没答案。我只能说我自己写 Z-Blog 主题时更顺手,因为显式 return 不容易搞丢副作用。

真正的门槛从来不是语法

会写 add_action( 'init', 'foo' ); 只需要五分钟。知道该在 init 还是 template_redirect 里干活,得踩至少三回坑。

这东西文档教不了,只能靠调试时打印日志、看调用栈,一点点攒。我现在看新手问「钩子不生效」,九成都是优先级或者触发时机不对——而这两个概念,光看文档真理解不了。

所以我的判断是:钩子机制本身没错,值得继续走下去。缺的是「什么时候该用哪个钩子」这层经验,而这层现在基本靠口口相传。