WordPress中文开发手册

WordPress插件开发 — 自定义Hooks

一个重要但经常被忽视的做法是在您的插件中使用自定义钩子,以便其他开发人员可以扩展和修改它。

自定义钩子以与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
Tags