时间:2013-05-27 23:42:54

wordpress 过滤器原理执行过程分析(源码分析)

分享到:

 

从上一篇:wordpress 3.5 filter 消息标签的名称 ,我们知道了wordpress过滤器消息灵活性。接下来,我们分析下这个具体执行过程。这个也是wordpress 优秀代码一个核心点。学习并使用该方法,应用到自己的站点中,将会给自己的系统带来很大的灵活性提升,扩展性将大大增强。其实这 类设计模式,就是”监听者模式“,先让监听者监听某个事件,只要发生某个事情,就去执行任务。对一个事件,可以添加条监控,分别执行独立任务。 不过,消息过滤模式,它有一个特点,每个执行任务将会返回一个结果,这个结果将作为下一个任务输入参数。第一个任务输入参数,就是发送消息,并且传入的参数。

是不是感觉有点晕晕啦,呵呵,如果对监听者设计模式熟悉的话,比较容易理解的。 打个比方说,教室有张三在看小说,李四在聊天。但是,他们都怕老师进入教师。 因此都监听老师来了的事件。只要老师来了,张三就停止看小说,李四也不能聊天。 有个同学就望风,发现老是来了。 他喊一声:某某老是来了。 然后,张三,李四动作就激发啦。 望风报信同学,是消息的发送者。

实现类似上面2个功能,wordpress主要2个常用函数是:

add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1) 添加消息主题$tag类型过滤器,过滤函数是:$function_to_add 该函数一定需要有返回值的;$priority是该函数执行优先级;数字越小将越先执行,accepted_args支持传入参数个数,默认是1。

apply_filters($tag, $value) ,发送过滤主题消息,$tag消息主题,$value 发送需要过滤内容。

 

PHP代码执行该过程原理

 

举例说明:

add_filter(‘the_title’,’filter_trim_title’,1,1);

实际实现类似:

$wp_filter[‘the_title’] []= array(‘function’=>’filter_trim_title’…) 用一个数组列表,记录消息所有映射函数,及所有传入参数

如果再有一条

add_filter(‘the_title’,’filter_substr_title’,1,1);

继续执行:

$wp_filter[‘the_title’] []= array(‘function’=>’filter_substr_title’…) ,该消息内容增加一条函数映射

如果这个时候,执行以下代码:apply_filters(‘the_title’,’testtest’),代码执行将会是类似如下:

$args=’testtest’;

foreach(add_filter(‘the_title’) as $the)

{

$args = call_user_func_array($the['function'], array_slice($args, 1, (int) $the(‘accepted_args’])); ///循环将该消息所有函数,执行一次,将返回的值作为下一个函数传入值。这里foreach前 会按照优先级排序

}

return $args; ///返回过滤后结果

 

 

通过上面例子,会发现,添加消息过滤方法,跟发送消息可以不同地方,只要放到一个全局数组中就可以了。 你只要在开始时候,增加过滤消息映射配置,可以变得更多行。 然后,可以再任意地方,发出这类消息,并且传入输入字符。 你会发现,通过该功能做消息的过滤,将是很轻松事情。

 

我们经常下会有从数据库里面读出代码,然后想做输出,这个时候,我们需要做转义操作。如果你的系统在读出内容后,添加了过滤消息发送接口,你需要对输出数据进行处理很容易。如下举例子

在通用包含地方添加如下代码(functions.php是不错选择)

 

add_filters(‘the_content’,’filter_contents’);

function filter_contents($data) 

{

     return htmlspecialchars($data);

}

然后在读取数据库地方加入如下代码

function get_content($data)

{

      return apply_filters(‘the_content’,$data);  //这样将$data作为消息发送,内容数据一起发送出去,所有绑定了’the_content’消息的所有函数,按照顺序串起来过滤内容。第一个过滤后结果,作为第2个输入参数,直到最后一个处理完,返回了内容。就是apply_filters 获得的内容。

}

 

 

觉得不错吧,这种解耦方法。扩展性大大增强,在你的项目中也用下类似方法吧。 其实实现过程很容易的。 但是,带来的扩展性就非常巨大了。其它处理消息过滤器函数,还有:has_filter() current_filter() merge_filters() remove_filter() remove_all_filters() 等,感兴趣,可以去研究下 它们源码!

不早了,昨晚休息比较晚,今天这个时候,感觉很困了。 欢迎与我交流!

作者:程默的博客  QQ:8292669
原文网址:http://blog.chacuo.net/89.html
订阅保持关注:http://blog.chacuo.net/feed
本文版权归作者所有,欢迎转载,请务必添加原文链接。


 

留下评论

要发表评论,您必须先登录