一个重要但常被忽视的做法是在插件中使用自定义钩子,以便其他开发者可以对其进行扩展和修改。

自定义钩子的创建和调用方式与 WordPress 核心钩子相同。

创建钩子

要创建自定义钩子,请使用 do_action() 用于 动作,以及 apply_filters() 用于 过滤器。

我们建议在输出到浏览器的任何文本上都使用 `apply_filters()`,特别是在前端。

这使得插件更容易根据用户的需求进行修改。

为钩子添加回调函数

要为自定义钩子添加回调函数,请使用 add_action() 用于 动作,以及 add_filter() 用于 过滤器。

命名冲突

命名冲突(“碰撞”)发生在两名开发者为完全不同的目的使用相同的钩子名称时。这会导致难以发现的错误。因此,重要的是用唯一的字符串前缀您的钩子名称,以避免与其他插件的钩子名称发生碰撞。

例如,名为 email_body 的过滤器通用性太强,以至于两名或多名开发者可以在不同的插件中为不同的目的使用此钩子。为了避免这种情况,添加了前缀。例如,本手册中用作示例的函数使用前缀 wporg_。

当您选择前缀时,可以使用您的公司名称、您的 wp 用户名、插件名称或任何您喜欢的内容。目标是使其唯一,因此请慎重选择。

示例

可扩展动作:设置表单

如果您的插件向管理面板添加了设置表单,您可以使用动作来允许其他插件向其添加自己的设置。

    do_action( 'wporg_after_settings_page_html' );

现在另一个插件可以为 wporg_after_settings_page_html 钩子注册回调函数并注入新设置:

add_action( 'wporg_after_settings_page_html', 'myprefix_add_settings' );

请注意,因为这是一个动作,所以不返回值。另外请注意,由于未指定优先级,它将在默认优先级 10 处运行。

可扩展过滤器:自定义帖子类型

在此示例中,当注册新的帖子类型时,定义它的参数通过过滤器传递,因此另一个插件可以在创建帖子类型之前更改它们。

function wporg_create_post_type() {
    $post_type_params = [/* ... */];

    register_post_type(
        'post_type_slug',
        apply_filters( 'wporg_post_type_params', $post_type_params )
    );
}

现在另一个插件可以为 wporg_post_type_params 钩子注册回调函数并更改帖子类型参数:

function myprefix_change_post_type_params( $post_type_params ) {
	$post_type_params['hierarchical'] = true;
	return $post_type_params;
}
add_filter( 'wporg_post_type_params', 'myprefix_change_post_type_params' );

请注意,过滤器接收数据、修改它并返回它。因此调用的代码(myprefix_change_post_type_params)不使用 echo 或 html 或其他任何内容直接输出到屏幕。另外请注意,返回值被 register_post_type 直接使用,而无需先赋值给变量。这可以跳过这个额外的(不必要的)步骤。

另外请注意,由于未指定优先级,它将在默认优先级 10 处运行。并且由于没有指定预期参数数量的值,因此假设默认为一个。