一个重要但经常被忽视的做法是在您的插件中使用自定义钩子,以便其他开发人员可以扩展和修改它。
自定义钩子以与WordPress Core钩子相同的方式创建和调用。
创建一个钩子
要创建自定义钩子,请对操作使用do_action(),对过滤器应用apply_filters()。
注意:我们建议在输出到浏览器的任何文本上使用apply_filters()。 特别是在前台。
这样可以根据用户的需要更容易地修改插件。
向Hook添加回调
要将一个回调函数添加到自定义钩子中,请对“过滤器”使用“动作”的add_action()和add_filter()。
命名冲突
由于任何插件都可以创建一个自定义钩子,所以重要的是为您的挂钩名称前缀以避免与其他插件的冲突。
例如,名为email_body的过滤器将不那么有用,因为另一个开发人员可能会选择相同的名称。 如果用户安装这两个插件,可能会导致难以追踪的错误。
命名功能wporg_email_body(其中wporg_是您的插件的唯一前缀)将避免任何冲突。
示例
可扩展操作:设置表单
如果您的插件向管理面板添加了一个设置表单,您可以使用操作来允许其他插件添加自己的设置。
<?php
function wporg_settings_page_html()
{
?>
Foo: <input id="foo" name="foo" type="text">
Bar: <input id="bar" name="bar" type="text">
<?php
do_action('wporg_after_settings_page_html');
}
现在另一个插件可以为wporg_after_settings_page_html钩子注册一个回调函数,并注入新的设置:
<?php
function myprefix_add_settings()
{
?>
New 1: <input id="new_setting" name="new_settings" type="text">
<?php
}
add_action('wporg_after_settings_page_html', 'myprefix_add_settings');
可扩展过滤器:自定义文章类型
在此示例中,当注册新的帖子类型时,定义它的参数通过过滤器传递,因此另一个插件可以在创建帖子类型之前更改它们。
<?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');
外部资源
- Extendable Extensions by Michael Fields
- WordPress Plugins as Frameworks by Josh Harrison
- The Pluggable Plugin by Brandon Dove
- WordPress Plugin Pet Peeves #3: Not Being Extensible by Will Norris