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

  categories:wordpress  author:

鉴于在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");
    }



快乐成长 每天进步一点点      京ICP备18032580号-1