# 定制挂钩
一个重要但经常被忽视的做法是在插件中使用自定义挂钩,以便其他开发人员可以扩展和修改它。
自定义挂钩的创建和调用方式与 WordPress 核心挂钩相同。
#### 创建一个钩子
要创建自定义挂钩,请使用`do_action()`for [Actions](https://developer.wordpress.org/plugins/hooks/actions/)和`apply_filters()`for [Filters](https://developer.wordpress.org/plugins/hooks/filters/)。
笔记:我们建议使用`[apply\_filters()](https://developer.wordpress.org/reference/functions/apply_filters/) ` 适用于输出到浏览器的任何文本。特别是在前端。
这使得插件更容易根据用户的需求进行修改。
#### 添加回调到钩子
要将回调函数添加到自定义挂钩,请使用`add_action()`for [Actions](https://developer.wordpress.org/plugins/hooks/actions/)和`add_filter()`for [Filters](https://developer.wordpress.org/plugins/hooks/filters/)。
#### 命名冲突
当两个开发人员将相同的钩子名称用于完全不同的目的时,就会发生命名冲突(“冲突”)。这导致很难发现错误。因此,在钩子名称前添加一个唯一的字符串是很重要的,以避免钩子名称与其他插件发生冲突。
例如,名为的过滤器`email_body`足够通用,两个或多个开发人员可以在不同的插件中出于不同的目的使用此钩子。所以为了避免这种情况,添加了一个前缀。例如,本手册中用作示例的函数使用`wporg_`作为前缀。
当你选择你的前缀时,你可以使用你的公司名称、你的 wp 句柄、插件名称,任何你真正喜欢的东西。我们的目标是使其独一无二,因此请明智地选择。
#### 例子
#### 可扩展操作:设置表单
如果您的插件将设置表单添加到管理面板,您可以使用操作来允许其他插件向其中添加自己的设置。
```php
do_action( 'wporg_after_settings_page_html' );
```
现在另一个插件可以为钩子注册回调函数`wporg_after_settings_page_html`并注入新设置:
```php
add_action( 'wporg_after_settings_page_html', 'myprefix_add_settings' );
```
请注意,因为这是一个操作,所以不会返回任何值。另请注意,由于未指定优先级,因此它将以默认优先级 10 运行。
#### 可扩展过滤器:自定义帖子类型
在此示例中,当注册新的帖子类型时,定义它的参数将通过过滤器传递,因此另一个插件可以在创建帖子类型之前更改它们。
```php
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`并更改帖子类型参数:
```php
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 运行。并且由于没有预期参数数量的值,因此假定默认值为 1。