跳转到主要内容

行动Actions

操作是两种类型的Hook之一。它们提供了一种在 WordPress 核心、插件和主题执行的特定点运行函数的方法。Action 的回调函数不会将任何内容返回到调用 Action 挂钩。它们与Filter相对应。这里回顾一下操作和过滤器之间的区别

添加动作

添加动作的过程包括两个步骤:

创建回调函数

首先,创建一个回调函数。当它所挂接的操作运行时,该函数将运行。

回调函数就像普通函数一样:它应该有前缀,并且应该位于functions.php可调用的位置。它应该接受的参数将由您挂钩的操作定义;大多数钩子都有明确的定义,因此请查看钩子文档以了解您选择的操作将传递给函数的参数。

分配(钩子)你的回调函数

其次,将回调函数添加到操作中。这称为挂钩,并告诉操作在运行时运行回调函数。

当您的回调函数准备就绪时,使用add_action() 将其挂钩到您选择的操作。至少add_action()需要两个参数:

  1. string $hook_name这是您要挂钩的操作的名称,并且
  2. callable $callback您的回调函数的名称。

下面的示例将在执行钩子wporg_callback()时运行:init


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()是 run:它的优先级也为 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
}
提示:最好为回调函数参数指定与传递的参数相同的名称,或者尽可能接近的名称。