动作

Actions是Hooks的两种类型之一。它们提供了一种在执行 WordPress 核心、插件和主题的特定点运行函数的方法。Action 的回调函数不会将任何内容返回给调用 Action 挂钩。它们是Filters的对应物。这里回顾一下actions 和 filters 之间的区别。

添加动作

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

创建_回调函数_

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

回调函数就像一个普通函数:它应该有前缀,并且应该在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章节来获取可用的 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
}

提示:最好为回调函数参数提供与传递的参数相同的名称,或者尽可能接近。