动作
Actions是Hooks的两种类型之一。它们提供了一种在执行 WordPress 核心、插件和主题的特定点运行函数的方法。Action 的回调函数不会将任何内容返回给调用 Action 挂钩。它们是Filters的对应物。这里回顾一下actions 和 filters 之间的区别。
添加动作
添加动作的过程包括两个步骤:
创建_回调函数_
首先,创建一个_回调函数_。该函数将在它所挂钩的操作运行时运行。
回调函数就像一个普通函数:它应该有前缀,并且应该在functions.php
可调用的地方或某个地方。它应该接受的参数将由您挂钩的操作定义;大多数钩子都有明确的定义,因此请查看钩子文档以查看您选择的操作将传递给您的函数的参数。
分配(挂钩)你的回调函数
其次,将回调函数添加到操作中。这称为_挂钩_并告诉操作在操作运行时运行回调函数。
当您的回调函数准备就绪时,使用add_action() 将其挂接到您选择的操作。至少add_action()
需要两个参数:
-
string $hook_name
这是您要挂钩的操作的名称,并且 -
callable $callback
您的回调函数的名称。
下面的示例将wporg_callback()
在init
执行挂钩时运行:
function wporg_callback() {
// do something
}
add_action( 'init', 'wporg_callback' );
你可以参考Hooks章节来获取可用的 hooks 列表。
随着您获得更多经验,查看 WordPress 核心源代码将使您找到最合适的钩子。
附加参数
add_action()
可以接受两个附加参数,int $priority
用于指定回调函数的优先级,以及int $accepted_args
将传递给回调函数的参数数量。
优先事项
许多回调函数可以挂接到单个操作。例如,钩子init
有很多用处。在某些情况下,您可能需要确保您的回调函数在其他回调函数之前或之后运行,即使那些其他函数可能尚未被挂钩。
WordPress 根据两件事确定回调函数的运行顺序:第一种方法是手动设置优先_级_。这是使用 的第三个参数完成的add_action()
。
以下是关于优先级的一些重要事实:
- 优先级是正整数,通常在 1 到 20 之间
-
priority
默认优先级(意思是,当没有手动提供值时分配的优先级)是 10 - 优先级值没有理论上的上限,但实际上限是100
优先级为 11 的函数将在优先级为 10 的函数_之后运行;优先级为 9 的函数将在优先级为 10 的函数_之前运行。
_确定回调函数顺序的第二种方法是简单地根据它在同一优先级值中_注册的顺序。因此,如果两个回调函数以相同的优先级注册到同一个钩子,它们将按照它们注册到钩子的顺序运行。
比如下面的回调函数都注册到了钩子上init
,只是优先级不同:
add_action('init', 'wporg_callback_run_me_late', 11);
add_action('init', 'wporg_callback_run_me_normal');
add_action('init', 'wporg_callback_run_me_early', 9);
add_action('init', 'wporg_callback_run_me_later', 11);
在上面的例子中:
- 第一个运行的函数将是
wporg_callback_run_me_early()
,因为它的手动优先级为 9 - 接下来,
wporg_callback_run_me_normal(),
因为它没有设置优先级,所以它的优先级是 10 - 接下来
wporg_callback_run_me_late()
运行,因为它的手动优先级为 11 - 最后
wporg_callback_run_me_later()
是run:它的优先级也是11,但是在之后被hook了wporg_callback_run_me_late()
。
参数数量
有时需要回调函数接收一些与挂钩的操作相关的额外数据。
例如,当 WordPress 保存帖子并运行挂钩时save_post
,它会将两个参数传递给回调函数:正在保存的帖子的 ID 和帖子对象本身:
do_action( 'save_post', $post->ID, $post );
当为钩子注册一个回调函数时save_post
,它可以指定它想要接收这两个参数。它通过add_action
(在这种情况下)2
作为第四个参数告诉期望它们来做到这一点:
add_action('save_post', 'wporg_custom', 10, 2);
为了在回调函数中实际接收这些参数,请修改回调函数将接受的参数,如下所示:
function wporg_custom( $post_id, $post ) {
// do something
}
提示:最好为回调函数参数提供与传递的参数相同的名称,或者尽可能接近。