大话wordpress之理解勾子(2)

前一篇讲了 wordpress 为什么要引入勾子,那么如何使用勾子呢?为便于理解,只讲最简单的情况,更深一步的将会在代码分析中说明。

“勾子”,其实,我更喜欢用“锚点”或者“桩”来形容,对于理解 wordpress 插件机制,后者于我而言更能触景生情,当然每个人的兴奋点不一样,请自行理解。既然大多数文章用“勾子”惯了,所以我以后也“勾子”下去。

使用勾子,主要涉及到2对函数 add_action() / do_action()、 add_filter() / apply_filter()。
use_hook

 

add_action() 是往勾子上挂,一次只能挂一个函数

do_action() 是调用勾子上挂着的所有函数。

这里有几个问题:

1、如果不小心在一个勾子上挂了2次同一个函数,它会过滤吗? No,wordpress 还没智能到能识别你是有心还是无意。

2、 do_action() 之后,勾子上挂的函数还在吗? No, wordpress 会把此勾子上的函数全部解挂。

3、能在勾子上“持久”性地挂个函数吗? No,wordpress 的勾子上目前都是“一次性”地挂, 尚不支持“持久”挂。但可以间接实现,即修改勾子函数,在 return 之前再挂一次, 达到“持久”的效果。

4、已经挂好了func1()、func2(),能在它们之间再挂一个函数吗? 答案是看情况!

wordpress 在挂函数的时候是可以指定一个优先级序号的(如果不指定默认就是10),序列小的在前(先执行),比如 add_action(‘hook’, ‘func1’, 4), add_action(‘hook’, ‘func2’, 2),那触发时就是先执行func2(),再执行func1()。

如果此勾子上func1与func2的优先级不等,比如一个是4,一个是2,中间挂一个小3当然很容易;如果相等,那想在中间插一腿,还是蛮难的,只能先remove_action()后重挂。

5、在勾子函数中能再次挂勾子吗? 当然可以,不仅可以而且是一种重要的用法。

function func1() {
    add_action('hook1', 'func100');
}

看看下面有趣的代码,勾子呈连环状:

add_action( 'init', 'foo1');
add_action( 'foo1', 'foo2');
add_action( 'foo2', 'foo3');

function foo1($arg) {
    echo __METHOD__;
    do_action('foo1');
}

function foo2($arg) {
    echo __METHOD__;
    do_action('foo2');
}
function foo3($arg) {
    echo __METHOD__;
    do_action('foo3');
}

猜猜输出结果?

发表评论

电子邮件地址不会被公开。 必填项已用*标注