通过wordpress debug插件,显示filter调用过程

鉴于在wordpress中filter的重要地位,继续研究filter,在我们读wordpress代码的时候有提到过,在所有的filter被调用之前,有一个叫all的filter会被首先调用,因此这里的all filter就相当有用了,可以在这里把被调用的filter的名字和参数记录下来,然后在结束之前打印,这样就可以生成一个完整的filter调用列表。我这样做了,列表的长度是比想象中的长,在我的首页中一共有3千多个filter被调用。

为了避免这个filter不影响用户正常的使用网站,需要有个开关来控制这个plugin,在wordpress中有一个WP_DEBUG是专门用来控制当前是否是debug模式,但是这个值被写死在wp_config.php 中,这样作并不方便,不过有一个很简单的技巧可以来条件的开启WP_DEBUG. 见如下代码
if( $_GET["debug"]==999 ){    //把这个值设为一个不容易被别人猜到的值
define('WP_DEBUG', true);
}else{
define('WP_DEBUG', false);
}

这样,每次你想要进入debug状态的时候,可以在页面的查询字串中加上”&debug=999″ 就可以进入debug状态。
而打印filter的插件代码如下:
/*
Plugin Name: Bagualu_debug
Version:     0.1
Plugin URI:  http://www.bagualu.net/wordpress/?p=1601
Description: debugging
Author:      Jianghang
Author URI:  http://www.bagualu.net
*/
$mcalled_filters = array();
function Bagualu_debug(){
global $mcalled_filters ;
array_push($mcalled_filters,current_filter());    //记录当前的filter名字
$args=func_get_args();
array_push($mcalled_filters,$args);     //记录当前filter调用的参数
}
function Bagualu_dumpfilters(){
global $mcalled_filters ;
echo "<pre>" ;                                   //增强最终的列表的可读性
print_r($mcalled_filters);
echo "</pre>" ;
global $wp_filter;
echo "<h2>wp_filter</h2>";
echo "<pre>" ;
print_r($wp_filter);                               //所有定义的filter
echo "</pre>" ;
global $wp_actions;
echo "<h2>wp_actions</h2>";
echo "<pre>" ;
print_r($wp_actions);                          //所有被调用的actions,action后面的数字表示该action被调用的次数
echo "</pre>" ;
}
if( WP_DEBUG == true ){
add_filter('all', 'Bagualu_debug');
add_action('shutdown',"Bagualu_dumpfilters");
}

发表评论