一个重要但经常被忽视的做法是在插件中使用自定义钩子,以便其他开发人员可以对其进行扩展和修改。
自定义钩子的创建和调用方式与WordPress核心钩子相同。
创建钩子
要创建自定义钩子,请使用do_action()表示动作,使用apply_filters()表示过滤器。
向钩子添加回调
要将回调函数添加到自定义钩子,请使用add_action()表示动作,使用add_filter()表示过滤器。
命名冲突
由于任何插件都可以创建自定义钩子,因此在钩子名称前加前缀以避免与其他插件发生冲突非常重要。
例如,名为email_body
的过滤器将不太有用,因为很可能其他开发人员会选择相同的名称。如果用户同时安装这两个插件,可能会导致难以追踪的bug。
命名函数wporg_email_body
(其中wporg_
是插件的唯一前缀)可以避免任何冲突。
示例
可扩展动作:设置表单
如果您的插件将设置表单添加到管理面板中,您可以使用动作允许其他插件向其中添加自己的设置。
Foo: Bar: <?php do_action( 'wporg_after_settings_page_html' ); }
现在,另一个插件可以为wporg_after_settings_page_html
钩子注册回调函数并注入新设置:
New 1: <?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' );
外部资源
- Michael Fields的 可扩展扩展
- Brandon Dove的 可插入插件
- Will Norris的 WordPress插件的弊病之三:不具有可扩展性