问题
是否可以为自定义功能提供管理特定插件选项的能力?
背景
我正在开发一套插件,这是一个主要的插件,还有一些附加模块。主插件添加了一个自定义角色和功能,这样这个角色就是一个编辑器,可以管理和编辑套件中的其余插件。
// 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,但两者都不起作用。
最合适的回答,由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()
?
不是一个完整的阐述,但我希望这些帮助你
- 如果您有一个函数或代码返回某个内容,并且希望允许插件或自定义代码过滤/更改该内容的输出,您可以使用
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
已应用筛选器