最近在研究开发,wordpress的Hook(钩子)太多了,甚至主题、插件也能自己写Hook,我们要记忆这些Hook的话是很困难的,而且钩子还分为动作钩子和过滤钩子,那有没有一种方便调试的方法呢?其实是有的。
我们先回到如何创建一个钩子,并调用它:
1、动作钩子:
do_action('action_name');
add_action( 'action_name', 'your_function_name' );
function your_function_name() {
// 业务代码
}
2、过滤钩子:
$variable = apply_filter( 'filter_name', $variable );
add_filter( 'filter_name', 'your_function_name' );
function your_function_name( $variable ) {
// 业务代码
return $variable;
}
我们可以发现,在创建动作钩子时会执行do_action函数,而在创建过滤钩子的时候会执行apply_filter,那我们修改调试创建函数,是不是就能看到哪里有钩子,有些什么钩子;或者我们再看,动作钩子在执行业务代码时都会执行add_action函数,而过滤钩子在执行业务代码的时候都会执行add_filter。而其实action和filter的底层是相同的。
那我们就可以修改两个地方,来显示动作钩子和过滤钩子了。
1、修改add_action和add_filter源码
上面说到,action和liter底层相同,最终,我们的add_action是通过add_filter实现的,所以我们只需要修改add_filter源码即可,最终,我是在“/wp-includes/plugin.php”查询到源码,注意如下129行,就是我添加的,不严谨,应该是要不显示,重定向存储到其他地方才好,这样有的地方会报错吧,不过不影响我们分析。
2、修改do_action和apply_filter源码
修改do_action源码,“/wp-includes/plugin.php”第518行:
修改apply_filter源码,“/wp-includes/plugin.php”第206行:
其实,经过阅读源码,我们发现其实还可以通过全局变量来查询有哪些hook,将以下代码放在主题functions.php或者是写成插件,总之,找个合适的位置放上去,当然,这和我们的标题似乎不符合,因为这查看的是所有Hook,我的代码如下:
function kekc_get_hooks(){
global $wp_filter,$wp_actions,$wp_filters,$wp_current_filter;
//filters
var_dump($wp_filter);
}
add_action("shutdown ","kekc_get_hooks",9999999999);//但记住,后台在shutdown之后还有一个wp_dashboard_setup钩子。
至此,你应该已经对WordPress的钩子有了进一步的了解了。