操作(Actions)是钩子(Hooks)的两种类型之一。它们提供了一种在 WordPress 核心、插件和主题的执行过程中的特定点运行函数的方法。操作的回调函数不会向调用它的操作钩子返回任何内容。它们是过滤器(Filters)的对应物。以下是关于操作与过滤器之间的区别的复习。
添加一个操作
添加操作的过程包括两个步骤:
创建回调函数
首先,创建一个回调函数。当它挂钩的操作运行时,该函数将被运行。
回调函数就像一个普通函数:它应该有前缀,并且应该在 functions.php 或某个可调用位置中。它应该接受的参数将由您挂钩的操作定义;大多数钩子都有明确的定义,因此请查看钩子文档以了解您选择的操作将传递给您的函数的哪些参数。
分配(挂钩)您的回调函数
其次,将您的回调函数添加到操作中。这称为挂钩,并指示操作在运行时运行您的回调函数。
当您的回调函数准备就绪时,使用 add_action() 将其挂钩到您选择的操作上。至少,add_action() 需要两个参数:
string $hook_name是您要挂钩的操作的名称,以及callable $callback您的回调函数的名称。
下面的示例将在 init 钩子执行时运行 wporg_callback():
function wporg_callback() {
// do something
}
add_action( 'init', 'wporg_callback' );您可以参考钩子(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():它也有优先级 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
}最好将回调函数的参数名称与传递的参数名称相同,或尽可能接近。