wordpress源代码研究-插件机制
先前说过WP所有的处理都在index.php里,单入口。而这里面又分成了两步。 一个是数据的准备,第二是模板的加载。那我们的插件调用是在哪里 呢??可以这么说,插件需要的数据是在第一步准备好的,插件的调用机制也是在第一步初始化的,并且一部分的接口调用也是在第一步做了。然后第二部主要是就 是在特定的地方调用接口的方法。
其实所谓的插件,说白了就是一堆函数,写插件的作者希望这一堆函数能在WP运行流程的一些地方插进去运 行。比如我们希望一个关键词过滤的东西,每遇 到“*”你换成“***”。那就可以写一个插件,在每一次日志提交的时候,在入库之前让执行一个函数,让这个$content中的“*”你换成 “***”。这就是插件。
那为什么我们不直接改源代码就行了呢,反正是开源的。这个问题,我觉得原因有两点。
1.开源没错,但是我为了一个小功能要看全部源代码,是不是有点。。。
2.你改了源代码你用,别人要用你再教他怎么怎么改。是不是有点。。。再如果对方不懂程序,OMG。
所以最好是写成一个东西,傻瓜都会用的那种。这时候插件就出现了。
可能你还会想,那我写一个执行脚本,让他在指定的文件指定的行添加一些代码,不也“插件”了吗。
没错,这样肯定也能成功。不过如果其它人也有其它的插件,大家都要改文件,那是不是可能出现冲突,不河蟹了是吧。
上面用插件的原因你了不了解都无所谓。下面要说的是插件的具体实现。
WP中用一种叫hook的机制实现了插件,hook:钩子是也。也就是在指定的地方放一些钩子,然后你可以把你的代码写成函数,挂在某些钩子上,当程序执行到钩子的时候,就把那上面的一串函数给执行了。
那这个挂的动作是什么时候发生的呢?是怎么发生的呢?
当 我们在执行上面说的wp-settiongs.php的时候,里面包含了我们每个插件的一个引导文件(就是一个PHP文件),在这个文件里调用了 一些方法,比如:add_action(“钩子”,”函数”)。比如apply_filter(“钩子”,”函数”)..当然还有相应的删除,修改什么的 一系列函数。你可以随便打开一个插件的外层PHP文件看一下里面的这些代码。
这些代码什么意思呢。他们其实是描述了一个对应关系,就是一个钩子对应一些函数的对应关系,每调用一次上面的挂钩函数。就会让这个钩子上多关联一个函数。其实这所有的信息就是存在PHP的关联数组里的。可以想一下是怎么存的,我这就不说了。是时候看看代码了吧。呵呵。
然后这样的一个全局变量被初始化了,在后面具体执行到一些钩子的时候,函数就被执行了。具体就是这样实现的。不神奇是吧。只是确实很管用。
不好地的方就是每次干什么事都会做这种初始化,不管你用不用得到。他都会被准备好。
所以WP才这么慢。有兴趣的朋友可以试着var_dump一下PHP的$GLOBALS,数据量那是相当相当相当惊人,如果机器不太好的话,可能会让你的浏览器卡死。