允许自定义功能来管理插件选项

时间:2019-03-17 作者:bicarlsen

问题

是否可以为自定义功能提供管理特定插件选项的能力?

背景

我正在开发一套插件,这是一个主要的插件,还有一些附加模块。主插件添加了一个自定义角色和功能,这样这个角色就是一个编辑器,可以管理和编辑套件中的其余插件。

// In main plugin, on activation hook
$permissions = get_role( \'editor\' );
$permissions = $permissions->capabilities;
$permissions[ \'custom_capability\' ] = 1;

add_role( \'custom_role\', __( \'Custom Role\' ), $permissions );
为了访问插件页面,我更改了capability 将插件组件的选项页注册到custom_capability, 使插件对那些具有Custom Role 角色

add_submenu_page( \'custom-plugins\', \'Custom Plugins Addon\', \'Addon\', \'custom_capability\', \'custom-plugins-addon\', \'add_custom_addon_options_page\' );
然而,when this role tries to update the plugin settings, it is denied access.

我试过使用option_page_capability 过滤器,但没有任何运气。

// In additional modules, when registering options page
function give_custom_role_access() {
    return \'custom_capability\';
}
apply_filters( \'option_page_capability_custom_addon_options_page\', \'give_custom_role_access\' ); 
显然,对于应该加入什么,存在一些困惑{$option_page} 使用时option_page_capability_{$option_page} 过滤器,所以我尝试了选项页slug和设置组slug,但两者都不起作用。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

如果您使用Settings API, 那个$option_page a的值是否隐藏<input> 字段生成者settings_fields(). 例如:

<input type="hidden" name="option_page" value="{Option group name}">
所以如果你有settings_fields( \'my-group\' ) 在代码中$option_page 可能是my-group. 参见(截至撰写之日,第5页)注释here.

代码示例:(经过尝试和测试的工作)

// Register custom option group.
add_action( \'admin_init\', function(){
    register_setting( \'my-group\', \'test_option\' );
} );

// Allows custom role to save options in the above group (my-group).
add_filter( \'option_page_capability_my-group\', function( $capability ){
    return \'custom_capability\';
} );

// Render the "Custom Plugins Addon" admin page.
function add_custom_addon_options_page() {
    ?>
        <div class="wrap">
            <h1>Custom Plugins Addon</h1>
            <?php settings_errors(); ?>
            <form method="post" action="options.php">
                <p>
                    <label>Text field:</label>
                    <input name="test_option" value="<?php echo esc_attr( get_option( \'test_option\' ) ); ?>">
                </p>
                <?php settings_fields( \'my-group\' ); ?>
                <?php submit_button(); ?>
            </form>
        </div>
    <?php
}
完整代码here, 但请注意,在示例中,我故意不使用add_settings_section()add_settings_field().

更新(抱歉,我实际上没有注意到问题中的这一部分)

因此,我尝试了选项页slug和设置组slug,但两者都不起作用

选项页slug不应该工作(假设它与设置组slug不同);但是,设置组slug(或选项组名称)应该与我给出的示例中的一样工作。

所以也许你错过了settings_fields( \'my-group\' ) 在您的代码中?。。

尝试example plugin 看看你做错了什么。。如有。

更新#2(于2019年3月18日UTC修订)

我想出来了。。。我在使用apply_filters() 而不是add_filter()

我很高兴你明白了。这是一件值得学习的好事情……)

你能详细说明一下什么时候使用吗apply_filters() vs。add_filter()?

不是一个完整的阐述,但我希望这些帮助你

  1. 如果您有一个函数或代码返回某个内容,并且希望允许插件或自定义代码过滤/更改该内容的输出,您可以使用apply_filters() 它注册一个过滤器挂钩,并应用/运行挂钩到该过滤器的回调函数:

    // This function has a hook for a filter named my_filter.
    function my_function() {
        // Allow plugins or custom code to change the output.
        return apply_filters( \'my_filter\', \'default output\' );
    }
    
    // This function does **not** have any hooks.
    function my_function2() {
        return \'something good..\';
    }
    
    当函数或代码的输出不是您想要/喜欢的时&mdash;如果函数/代码有一个过滤器挂钩,您可以使用add_filter() (注册一个filter回调函数)来定制输出,如下所示:(函数代码可以组合,但我将它们分开,这样您就知道可以挂接任意多个回调函数)

    function filter_my_function_output( $output ) {
        return \'custom output\';
    }
    add_filter( \'my_filter\', \'filter_my_function_output\' );
    
    function filter_my_function_output2( $output ) {
        return is_user_logged_in() ? \'You are logged-in...\' : $output;
    }
    add_filter( \'my_filter\', \'filter_my_function_output2\' );
    
    因此,最终输出可能是filter_my_function_output()filter_my_function_output2(). 反之亦然,具体取决于回调优先级:

    // no priority set explicitly; so defaults to 10
    add_filter( \'my_filter\', \'filter_my_function_output\' ); // priority = 10
    
    // using custom priority, which is 1; so this runs before the above
    add_filter( \'my_filter\', \'filter_my_function_output\', 1 ); // priority = 1
    
    因此,总结以上第1点和第2点:

    • my_filter 是筛选器的名称

    • my_function() 包含过滤器所在的挂钩my_filter 正在应用

    • filter_my_function_output()filter_my_function_output2() 是回调函数,当my_filter 已应用筛选器

相关推荐

Testing Plugins for Multisite

我最近发布了一个WordPress插件,它在单个站点上非常有效。我被告知该插件在多站点安装上不能正常工作,我理解其中的一些原因。我已经更新了代码,现在需要一种方法来测试更新后的代码,然后才能转到实时客户的多站点安装。我有一个用于测试的WordPress安装程序的单站点安装,但需要在多站点安装上进行测试。根据我所能找到的唯一方法是在网络上至少有两个站点来安装整个多站点安装,以测试我的插件。设置WordPress的整个多站点安装是插件开发人员的唯一/首选方式,还是有更快的测试环境可用。