允许具有编辑者角色的用户编辑菜单(没有插件)

时间:2020-02-05 作者:alvarogois

我发现需要一个站点编辑器来编辑菜单。我找到了一些answers 这表明add_cap() 方法,添加edit_theme_options 编辑角色的能力。

should be done once 然后从中删除functions.php:

// Do this only once. Can go anywhere inside your functions.php file
$role_object = get_role( \'editor\' );
$role_object->add_cap( \'edit_theme_options\' );
相同的答案显示了隐藏不需要的外观子菜单的方法。但是它also hides those sub-menus to Administrator role.

我的问题是:这是解决这个问题的正确方法吗?将子菜单显示给管理员,但将其隐藏给编辑器角色?

// Show Appearance sub-menus only to users with \'manage_options\' capability

function hide_menu() {
    if ( ! current_user_can( \'manage_options\' ) ) {
        remove_submenu_page( \'themes.php\', \'themes.php\' ); // hide the theme selection submenu
        remove_submenu_page( \'themes.php\', \'widgets.php\' ); // hide the widgets submenu
        remove_submenu_page( \'themes.php\', \'customize.php?return=%2Fwp-admin%2Ftools.php\' ); // hide the customizer submenu
        remove_submenu_page( \'themes.php\', \'customize.php?return=%2Fwp-admin%2Ftools.php&autofocus%5Bcontrol%5D=background_image\' ); // hide the background submenu

        // these are theme-specific. Can have other names or simply not exist in your current theme.
        remove_submenu_page( \'themes.php\', \'custom-header\' );
        remove_submenu_page( \'themes.php\', \'custom-background\' );
    }
}

add_action(\'admin_head\', \'hide_menu\');

1 个回复
SO网友:Antti Koskinen

最近我不得不处理同样的问题。我使用user_has_cap 筛选以允许动态访问。

add_filter(\'user_has_cap\', \'editor_allow_edit_menu\', 10, 4);
function editor_allow_edit_menu($allcaps, $caps, $args, $user) {

  if ( ! isset( $allcaps[\'editor\'] ) || true !== $allcaps[\'editor\'] ) {
    return $allcaps;
  }

  global $pagenow;
  // new items are added to the menu with ajax
  // you could perhaps also check here that the ajax action is \'add-menu_item\' from $_POST
  if ( wp_doing_ajax() || \'nav-menus.php\' === $pagenow ) {
    $allcaps[\'edit_theme_options\'] = true;
  }

  return $allcaps;
}
上面的代码允许用户访问菜单编辑页面并向菜单添加新项目,这是通过管理ajax操作实现的。但是,这不会显示指向编辑页面的链接。为此,我在管理菜单中添加了一个自定义链接。

add_action( \'admin_menu\', \'add_nav_menus_link_for_editor\' );
function add_nav_menus_link_for_editor() {
  if ( ! current_user_can(\'editor\') ) {
    return;
  }
  // Custom link to the nav menus page
  add_menu_page(
    __(\'Menus\'),
    __(\'Menus\'),
    \'edit_others_posts\',
    \'?options=nav-menus.php\', // I didn\'t get \'nav-menus.php\' working directly here and didn\'t bother figuring out why
    \'\',
    \'dashicons-menu\',
    90
  );
  // remove themes menu page, would be visible otherwise when user is on menu editing page and has the edit_theme_options capability
  remove_menu_page(\'themes.php\');
}
因为我没有nav-menus.php 直接在上使用时工作add_menu_page() 作为页面slug,我添加了快速而脏的重定向开关(quick and dirty redirect switcheroo),以便在单击自定义菜单链接时将用户引导到菜单编辑页面。

add_action(\'admin_init\', \'redirect_to_nav_menu_page\');
function redirect_to_nav_menu_page() {
  if ( current_user_can(\'editor\') && isset($_GET[\'options\']) && \'nav-menus.php\' === $_GET[\'options\'] ) {
    wp_redirect( admin_url( \'nav-menus.php\' ) );
    die;
  }
}
我认为这种访问方式更加有限,因为只有在使用一个特定的管理页面时才能设置该功能。尝试直接访问任何其他设置页面将导致功能错误通知。

这是我使用的代码的简化版本。最初,我有一个奇特的循环,允许编辑器基于一个配置数组访问其他几个设置页面。

相关推荐

如何在WordPress中覆盖/定制wp-admin/nav-menus.php

我想知道是否有办法定制wp管理/导航菜单。php,以便我可以添加自己的额外字段或选项卡。例如,我想为用户创建的每个菜单创建一个新选项卡(菜单设置)。我觉得如果在创建的每个菜单上都附加了特定的设置,会更加方便用户。这可能吗?目前,我正在按主题选项进行此操作,但它有局限性:(