大话wordpress之理解勾子(1)

1、某日,项目开发紧张进行中,“小菜啊,这里要显示一段欢迎词”,  领导说。小菜唰唰唰很快就搞定了,代码如下:

703be3b1jw1f3x2tze5hjj20ju05u0ui

function display_hello() {
    echo 'welcome to mywordpress.cn';
}

用户要使用,方法很简单,只需这么用

display_hello();

“活真好”,领导很满意。不久,产品一下子火了,源代码被下载了很多次,大家都表示调用了display_hello()。

 

2、很快,N多的用户,强烈要求能自定义欢迎词,不然就卸载。“小问题,不就是加个参数吗?”,小菜开始撸起,不到3分钟就出货了。

function display_hello($content) {
    echo $content
}

“小菜啊,我们的产品现在影响很大了”,领导说,“以前,大家在调用display_hello()时都是不带参数的,为了兼容,这个接口是不能再变了,换句话说,这个函数是不能带参数滴,否则用户那边满屏都是warning,后果很严重啊!”。
“这。。。”,小菜开始抓耳捞腮,解锁各种设计模式姿势,外加大神指点,3天后小菜出了新版本(注意前方wordpress要神出现了)

function display_hello() {
    echo apply_filters( 'display_hello', 'welcome to mywordpress.cn' );
}

照例,领导要先review一番,“我靠,这啥啊?” ,领导有点蒙圈,运行了一下,还是显示老欢迎词,“小菜,不行啊”。小菜娓娓道来,“apply_filters()就是执行挂在display_hello这个锚点(也叫勾子)上的函数,此函数会对参数’welcome to mywordpress.cn’串进行加工,最后显示加工后的结果…”。

现在用户要使用,稍微有点麻烦,得这么用

add_filter( 'display_hello', function($content) {
    return 'welcome to my site';
});
display_hello();

“嗯,这个方法貌似可以…”,领导沉思片刻,好象有点头晕。。。

 

3、然并卵,好景不长,N多用户反映,想在显示欢迎词后做几个动作,比如发个email,发个短信啥的…,不然不愿成为付费用户。。。二话不说,小菜给出了最后的版本。

function display_hello() {
    echo apply_filters( 'display_hello', 'welcome to mywordpress.cn' );
    do_action( 'after_display_hello' );
}

现在,用户要想使用,非常麻烦,得这么用了

add_filter( 'display_hello', function($content) {
    return 'welcome to my site';
});
add_action( 'after_display_hello', function($content) {
    wp_mail( 'mayun@taobao.com', 'email title', $content );
});
display_hello();

 

4、看,为了满足灵活的需求,一个简单的函数,搞成了混身是窟窿,N多的函数都可以插入进去。 确实,wordpress中勾子满天飞,勾子成为Wordpress得以进化成为CMS框架的重要基础。

结论:一个系统要在功能上很灵活,那么它在使用上必然很复杂,哲学啊。

《大话wordpress之理解勾子(1)》有2个想法

  1. 拜读
    function display_hello() {
    echo apply_filters( 'display_hello', 'welcome to mywordpress.cn' );
    }

    请问这里,’welcome to mywordpress.cn’ 是 ‘display_hello’的参数吗?

    1. 一句话还真不好回答。

      “display_hello”是一个勾子,上面勾着一串加工字符串的函数。

      apply_filters()就是挨个执行这一串函数,第1个函数要加工的参数就是“welcome to mywordpress.cn”,它的返回结果作为第2个函数要加工的参数,第2个函数的返回结果又作为第3个函数的参数,…

发表评论

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