向WordPress中的编辑器显示仅限管理员的子菜单链接。导致错误

时间:2016-10-19 15:26:30

标签: php wordpress

我使用插件将一个子菜单项添加到管理菜单中,如下所示:

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' );
}

虽然确实正确显示子菜单项,但我收到以下错误:

Sorry, you are not allowed to access this page.

任何人都可以看到任何显而易见的事情,或者对于可能导致此事的原因有任何倾向吗?

注意: manage_propertyhive 功能肯定确实存在

4 个答案:

答案 0 :(得分:1)

我相信这是因为' manage_propertyhive'不是已定义的功能,因此没有人可以访问该菜单。您可以使用您可以找到here之一的预定义wordpress功能,也可以按照here的说明定义自己的自定义功能,例如' manage_propertyhive'。

希望这有帮助!

答案 1 :(得分: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)将子菜单页面添加到编辑器这一事实并不一定意味着他们可以访问该页面 - 您是否检查了插件以进行进一步的功能检查?也许在回调函数的代码中或插件功能的某些其他功能中再次检查并且编辑器缺少某些功能。

答案 2 :(得分: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');

答案 3 :(得分:0)

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

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

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

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

确保将文件恢复为原始文件(我只是再次更新WordPress,将所有核心文件恢复到原始状态)...

希望有所帮助。