WordPress 网站中添加钩子函数和其优先顺序

2018-07-06 0 By admin

在 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 中向动作钩子里添加动作函数,需要几个参数值:

  1. 动作钩子的名称 $action_name,
  2. 钩子函数的名称 action_func_name,
  3. 钩子函数的优先顺序 priority,
  4. 钩子函数调用是传入的参数个数 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 中定义上面的函数;在需要时,直接调用它,就可以查看某个钩子上的钩子函数信息了。