通过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");
}


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

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




发表评论

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