一个重要但经常被忽视的做法是在您的插件中使用自定义钩子,以便其他开发人员可以扩展和修改它。 自定义钩子以与WordPress Core钩子相同的方式创建和调用。 ## 创建一个钩子 要创建自定义钩子,请对操作使用do_action(),对过滤器应用apply_filters()。 >[warning] 注意:我们建议在输出到浏览器的任何文本上使用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