动作 (Action)是两种钩子 (Hook)类型之一。它们提供了一种在 WordPress 核心、插件和主题执行过程中的特定点运行函数的方法。动作的回调函数不会向调用动作的钩子返回任何内容。它们与过滤器 (Filter)相对应。以下是动作 (Action) 和过滤器 (Filter) 之间区别的回顾。
添加动作的过程包括两个步骤:
首先,创建一个回调函数。此函数将在其所挂钩的操作运行时运行。
回调函数与普通函数类似:它应该带有前缀,并且应该位于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 Core 源代码将允许您找到最合适的钩子。
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()
运行:它的优先级也是 11,但它在之后被挂接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
}
最好让回调函数参数的名称与传递的参数名称相同,或者尽可能接近。