WordPress 网站中添加钩子函数和其优先顺序
在 WordPress 系统开发过程中,如果一个钩子 Hook 挂载了多个钩子函数 Hook Functions;则这些钩子函数的执行顺序就需要慎重的考虑一下。
有可能钩子上的钩子函数不同的执行顺序,产生的执行结果是不同的。这里钩子函数的执行顺序,就是通过对钩子函数设置优先顺序进行控制的。
一、向钩子中添加钩子函数
函数 add_action 和函数 add_filter 分别向 Action 动作钩子和 Filter 过滤器钩子中添加钩子函数。
1.1、动作钩子 Action
向动作钩子 Action 中添加动作函数的方式:add_action($action_name,$action_func_name,$priority,$accepted_args)
在 WordPress 中向动作钩子里添加动作函数,需要几个参数值:
- 动作钩子的名称 $action_name,
- 钩子函数的名称 action_func_name,
- 钩子函数的优先顺序 priority,
- 钩子函数调用是传入的参数个数 accepted_args。
1.2、过滤器钩子 Filter
和动作钩子的操作过程相似,只不过函数名改变了而已。add_filter($action_name,$action_func_name,$priority,$accepted_args)
二、钩子函数的优先顺序
在向钩子中添加钩子函数时,可以指定其钩子函数的执行优先顺序。如果没有设置 priority 参数,则使用默认值 10。
钩子函数的优先顺序 priority 数值越小,则优先级越高,越早执行。
2.1、输出钩子中的钩子函数信息
有时候,我们需要查看一下某个钩子都挂载了那些钩子函数,以及这些钩子函数的优先顺序是多少。
// 列出所有的hook function及其priority
function list_hooked_functions($tag=false)
{
global $wp_filter;
if ($tag)
{
$hook[$tag]=$wp_filter[$tag];
if (!is_array($hook[$tag]))
{
trigger_error("Nothing found for '$tag' hook", E_USER_WARNING);
return;
}
}
else
{
$hook=$wp_filter;
ksort($hook);
}
echo '<pre>';
foreach($hook as $tag => $priority)
{
echo "<br />>>>>>\t<strong>$tag</strong><br />";
ksort($priority);
foreach($priority as $priority => $function)
{
echo $priority;
foreach($function as $name => $properties) echo "\t$name<br />";
}
}
echo '</pre>';
return;
}
在 function.php 中定义上面的函数;在需要时,直接调用它,就可以查看某个钩子上的钩子函数信息了。