一个重要但经常被忽视的做法是在插件中使用自定义钩子,以便其他开发人员可以扩展和修改它。自定义钩子的创建和调用方式与 WordPress Core 钩子相同。
要创建自定义钩子,请do_action()
使用Actions和apply_filters()Filters 。
我们建议对输出到浏览器的任何文本使用 ` apply_filters() `,尤其是在前端。
这使得插件可以更轻松地根据用户的需求进行修改。
要将回调函数添加到自定义钩子,请add_action()使用Actions和add_filter()Filters 。
当两个开发人员将相同的钩子名称用于完全不同的目的时,就会发生命名冲突(“碰撞”)。这会导致难以查找错误。因此,务必在钩子名称前添加一个唯一的字符串,以避免钩子名称与其他插件发生冲突。
例如,一个名为 的过滤器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 运行。并且由于预期的参数数量没有值,因此假定默认值为 1。
自定义钩子的创建和调用方式与核心钩子相同,都是使用add_action() / do_action() 和 add_filter() / apply_filters()。由于任何插件都可以创建自定义钩子,因此在钩子名称前添加前缀非常重要,以避免与其他插件冲突。
一个重要但经常被忽视的最佳实践是向您的插件添加自定义钩子,以便其他开发人员可以扩展和修改它,而不必分叉它。自定义钩子的创建和调用方式与Core钩子相同,使用add_action() / do_action()和add_filter() / apply_filters()。
由于任何插件都可以创建自定义钩子,因此务必为钩子名称添加前缀,以避免与其他插件冲突。例如,名为 email_body的过滤器就不合适,因为其他开发者很可能会选择相同的名称。如果用户同时安装了这两个插件,可能会导致难以追踪的错误。将函数命名为abcd_email_body (其中“abcd”是插件的唯一前缀)可以避免任何冲突。
如果你的插件在管理面板中添加了设置表单,你可以使用操作允许其他插件向其中添加自己的设置。此示例展示了在表单末尾调用的自定义操作:
function markup_settings_menu() {
?>
Foo: <input id="foo" name="foo1" type="text" />
Bar: <input id="bar" name="bar1" type="text" />
<?php
do_action( 'myplugin_after_form_settings' );
}
因此现在另一个插件可以为自定义myplugin_after_form_settings操作注册一个回调并注入新的设置:
function add_form_settings() {
?>
New 1: <input id="new_setting" name="new_settings" type="text" />
New 2: <input id="new_setting2" name="new_setting2" type="text" />
<?php
}
add_action( 'myplugin_after_form_settings', 'add_form_settings' );
在这个例子中,当注册新的帖子类型时,定义它的参数会通过过滤器传递,因此另一个插件可以在创建帖子类型之前更改它们。
function myplugin_create_post_type() {
$post_type_params = array( /* ... */ );
register_post_type(
'post_type_slug',
apply_filters( 'myplugin_post_type_params', $post_type_params ),
);
}
想要修改帖子类型的插件可以为上面创建的自定义myplugin_post_type_params过滤器注册一个回调函数。在本例中,回调函数会将帖子类型从扁平类型更改为层级类型。
function change_post_type_params( $post_type_params ) {
$post_type_params['hierarchical'] = true;
return $post_type_params;
}
add_filter( 'myplugin_post_type_params', 'change_post_type_params' );