2017-09-21

猎数博客

数据挖掘,机器学习

WordPress代码之apply_filters

作者:江航 / 2011-04-29 / (阅读 3,274 次) /



先看代码:


function apply_filters($tag, $value) {

global $wp_filter, $merged_filters, $wp_current_filter;

$args = array();
$wp_current_filter[] = $tag;

// Do ‘all’ actions first

if ( isset($wp_filter[‘all’]) ) {

$args = func_get_args();

_wp_call_all_hook($args);

}

if ( !isset($wp_filter[$tag]) ) {

array_pop($wp_current_filter);

return $value;

}

// Sort

if ( !isset( $merged_filters[ $tag ] ) ) {

ksort($wp_filter[$tag]);

$merged_filters[ $tag ] = true;

}

reset( $wp_filter[ $tag ] );

if ( empty($args) )

$args = func_get_args();

do {

foreach( (array) current($wp_filter[$tag]) as $the_ )

if ( !is_null($the_[‘function’]) ){

$args[1] = $value;

$value = call_user_func_array($the_[‘function’], array_slice($args, 1, (int) $the_[‘accepted_args’]));

}

} while ( next($wp_filter[$tag]) !== false );
array_pop( $wp_current_filter );

return $value;

}


现在开始逐行分析。
定义三个全局变量$wp_filter, $merged_filters, $wp_current_filter, 然后初始化$args为空数组,$wp_current_filter初始化为当前tag.注意这里的$wp_current_filter是全局变量,在这里初始化之后,估计会被其他的函数使用。
首先检查,注册的filter中有没有一个叫‘all’的tag,这个tag定义的函数(filter)会在所有的filter调用之前被调用。如果有,就调用func_get_args() 来获得参数,这里的func_get_args是php自带的一个函数,用来获取改函数参数数组。在拿到参数以后,就通过_wp_call_all_hook调用tag ‘all’ 下的所有filter。具体如何调用,可以后面在去研究。
在tag all被调用以后,检查当前tag是否已经注册过,如果没有就直接返回调用参数。所以,就算某个filter没有定义,通过这个函数调用可以实现调用tag all的功能。
接下来,就是当前tag被注册过的情况。因为每个tag有好几个优先级,每个优先级可能有很多注册filter,所以先用优先级对所有注册filter进行排序,排完序以后将 $merged_filters[ $tag ]致为true,下次在调用这个tag就不用再排序了。
排完序后就应该是调用这些filter了,不过首先还要做一件事情就是拿到函数参数。因为如果tag all 没有注册的话,$args到目前为止将还是空值。
拿到参数后,调用current($wp_filter[$tag]) 函数,生成一个包含该tag所有filter的数组。然后对每个filter,如果其’function’不为空,
令args[1]=$value,这里的$value为调用filter时传进来的值,调用该函数,同时取参数值为args中从1开始到accepted_args结束。

到目前为止,我们filter的注册和调用就有了一个大致的了解。注意,这里apply_filters定义中虽然只有两个参数,但是实际应用中,从代码看似乎可以传入更多的参数给各个filter。每个filter更具自己的定义按顺序取出其中的参数即可。



Wordpress一览无余,源码面前没有秘密,wordpress的函数调用库,展示wordpress页面打开过程中十几万个函数调用,学习WP开发的绝佳资源。点击这里进入

本文地址: http://www.bagualu.net/wordpress/archives/226 转载请注明






相关文章

  • 再说Wordpress中添加小挂件widget( 5,869 )
  • Wordpress中添加自定义参数( 3,413 )
  • WordPress代码之apply_filters( 3,274 )
  • 微博分享按钮( 3,227 )
  • WordPress版权声明插件( 3,199 )
  • wordpress函数调用库( 2,634 )
  • 通过wpdb访问WordPress数据库( 2,444 )
  • 通过wordpress debug插件,显示filter调用过程( 2,405 )
  • 用Wordpress做相册( 2,398 )
  • WordPress 代码之 add_filter( 2,337 )
  • Leave a Reply

    您必须登录以发表评论,

    沪ICP备11036560号
    联系我: jianghang at bagualu.net