在WordPress中,向编辑人员显示仅管理员可见的子菜单链接会导致错误。

6

我正在使用一个插件,它会像这样向管理菜单中添加一个子菜单项:

add_submenu_page( 'propertyhive', 'Property Hive Settings', 'Settings', 'manage_options', 'ph-settings', 'callback_fn' );

由于它声明了manage_options,因此仅对管理员可见。但我需要让编辑也能看到它。以下是我在主题的functions.php文件中尝试过的内容:

add_action( 'admin_menu', 'custom_settings_menu', 99 );
function custom_settings_menu()
{
    // Remove the submenu item first
    remove_submenu_page( 'propertyhive', 'ph-settings' );

    // Add it again but with different role (manage_propertyhive)
    // This role does exist as other submenu items ue it
    add_submenu_page( 'propertyhive', 'Property Hive Settings', 'Settings', 'manage_propertyhive', 'ph-settings', 'my_theme_callback_fn' );
}

尽管这样做可以正确显示子菜单项,但我收到以下错误消息:
“抱歉,您无权访问此页面。”
有人看到了什么问题或者有任何想法是什么导致这个问题吗?
注意:manage_propertyhive权限确实存在。
4个回答

1
我认为这是因为“manage_propertyhive”不是一个定义好的权限,所以没有人可以访问该菜单。你可以使用预定义的WordPress权限之一,你可以在这里找到它们,或者你可以按照这里的说明定义自己的自定义权限,例如“manage_propertyhive”。
希望这能帮助你!

1
谢谢,但是manage_propertyhive绝对是一个功能。a)这是我的插件;b)其他子菜单项都没有问题地使用它。不过还是谢谢你的回答。 - BIOSTALL

1

1) 你确定插件中的add_submenu_page()函数已经正确复制了吗?add_submenu_page()只接受6个参数 - 在你的问题中,它有7个参数,其中propertyhive是功能,manage_optionsmenu_slug(这令人困惑)。

https://developer.wordpress.org/reference/functions/add_submenu_page/

2) 我猜管理员和编辑都有能力 manage_propertyhive?如果没有,请确保。

3) 在您的示例代码中,新的 propertyhive 子菜单页面的回调函数是 my_theme_callback_fn - 您是否在此处插入了正确的回调函数?

4) 添加子菜单页面到编辑器并不一定意味着他们可以访问该页面 - 您是否检查了插件以进行进一步的能力检查?也许在回调函数的代码或插件功能的某些其他函数中再次检查了功能,并且编辑器缺少某些功能。


1
这一定会奏效。
function add_theme_caps() {
    $role = get_role( 'editor' );  
    $caps = (array)$role->capabilities;
    if(!array_key_exists('manage_propertyhive', $caps)) {
        $role->add_cap( 'manage_propertyhive' ); 
    }
}
add_action( 'admin_init', 'add_theme_caps');

0

假设您已经正确设置了功能,也许父页面不允许访问子菜单页面,请确保用户能够访问父页面...

这是检查用户是否可以访问页面的函数... 如果返回false,则显示错误...
https://github.com/WordPress/WordPress/blob/4.6.1/wp-admin/includes/plugin.php#L1697-L1763

除了检查其他几个事项外,它还检查用户是否可以访问父页面。

如果这样不起作用,我建议您转到本地安装的此文件,并var_dump所有在返回false之前检查的变量,这就是我们开发人员调试错误的方法... ;)

请确保将文件恢复为原始文件(我刚刚更新了WordPress,这会将所有核心文件恢复到其原始状态)...

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接