Плагин для удаления пунктов меню администратора на основе роли пользователя?

Я искал высокий и низкий для плагина, который может удалить / скрыть пункты меню Admin, включая пользовательские типы сообщений и таксономии, основанные на роли пользователя.

Каждый, кого я пробовал, выполняет только глобальное скрытие, а не основанное на роли пользователя. Другие более сложные, такие как adminize, не отображают пользовательские типы сообщений или таксономии.

Должен ли я писать свою собственную функцию или есть простой плагин, который я пропускаю?

Обновить:

чтение ответа Майка снова заставило меня думать, что вы можете добавить новые возможности для роли и использовать это как условие удаления, так что:

// first add your role the capability like so // get the "author" role object $role = get_role( 'administrator' ); // add "see_all_menus" to this role object $role->add_cap( 'see_all_menus' ); //then remove menu items based on that function remove_those_menu_items( $menu_order ){ global $menu; // check using the new capability with current_user_can if ( !current_user_can( 'see_all_menus' ) ) { foreach ( $menu as $mkey => $m ) { //custom post type name "portfolio" $key = array_search( 'edit.php?post_type=portfolio', $m ); //pages menu $keyB = array_search( 'edit.php?post_type=page', $m ); //posts menu $keyC = array_search( 'edit.php', $m ); if ( $key || $keyB || $keyC ) unset( $menu[$mkey] ); } } return $menu_order; } //Then just Hook that function to "menu_order" add_filter( 'menu_order', 'remove_those_menu_items' ); 

Старый ответ

Я полностью согласен с тем, что выложил майк, но если вы не в соответствии с пользовательским кодированием Взгляните на плагин редактора Admin Menu Editor .

он позволяет устанавливать права доступа по уровню.

Там есть плагин, созданный для точного вопроса: Hide Admin Menu . Этот плагин может:

  • Скрыть элементы меню администратора на основе роли пользователя, включая администратор и пользовательскую роль пользователя
  • Может также скрывать элементы панели администратора
  • Можно использовать параметры экспорта / импорта для использования на других сайтах

Еще одна хорошая вещь из этого плагина – это интуитивно понятный и простой в использовании.

Привет @Wyck:

Я могу определенно оценить ваши потребности; У меня были клиенты, которые просят об этом. К сожалению, WordPress связывает страницы меню администратора (то есть разделы меню) и подстраницы меню (т.е. пункты меню) с возможностями, а не с ролями .

Однако было бы не слишком сложно написать некоторый код плагина, который позволяет вместо этого назначать опции меню администратора для ролей; ваш скрипт установит возможность, необходимую для всех параметров меню, для использования новой 'not-allowed' возможности, а затем ваш код выборочно назначает возможность 'read' по умолчанию для каждого параметра меню, где роль текущего пользователя имеет определенную возможность.

Чем больше возникает вопрос, каким образом вы представляете сопоставление ролей пользователей с параметрами меню? Я мог видеть, что требуется довольно сложный пользовательский интерфейс администратора. Конечно, если вы просто хотите жестко задавать массив, который определяет, какие роли могут видеть, это будет довольно легко …

Это будет содержать только несколько пунктов меню для не-администраторов. В версии add_cap используется add_cap , которая должна выполняться только один раз, при активации темы или плагина.

 add_action('admin_menu', function () { if (current_user_can('administrator')) { return; } /** * Keep only specific menu items and remove all others */ global $menu; $hMenu = $menu; foreach ($hMenu as $nMenuIndex => $hMenuItem) { if (in_array($hMenuItem[2], array( 'index.php', 'edit.php?post_type=product', )) ) { continue; } unset($menu[$nMenuIndex]); } } с add_action('admin_menu', function () { if (current_user_can('administrator')) { return; } /** * Keep only specific menu items and remove all others */ global $menu; $hMenu = $menu; foreach ($hMenu as $nMenuIndex => $hMenuItem) { if (in_array($hMenuItem[2], array( 'index.php', 'edit.php?post_type=product', )) ) { continue; } unset($menu[$nMenuIndex]); } }