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

30 янв. 2011 г., 02:19:58
Просмотры: 29.2K
Голосов: 6

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

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

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

1
Комментарии

Попробуйте этот плагин: Hide Admin Panels)

User User
31 мая 2011 г. 20:39:10
Все ответы на вопрос 4
2

Обновление:

Перечитав ответ Майка, я задумался, что можно добавить новую возможность (capability) к роли и использовать её как условие для удаления, вот так:

   // Сначала добавляем возможность к роли
   // Получаем объект роли "administrator"
   $role = get_role( 'administrator' );

   // Добавляем возможность "see_all_menus" к этой роли
   $role->add_cap( 'see_all_menus' );

   // Затем удаляем пункты меню на основе этой возможности
   function remove_those_menu_items( $menu_order ){
            global $menu;
            // Проверяем новую возможность с помощью current_user_can
            if ( !current_user_can( 'see_all_menus' ) ) {
             foreach ( $menu as $mkey => $m ) {
                // Имя типа записи "portfolio"
                $key = array_search( 'edit.php?post_type=portfolio', $m );
                // Меню страниц
                $keyB = array_search( 'edit.php?post_type=page', $m );
                // Меню записей
                $keyC = array_search( 'edit.php', $m );

                if ( $key || $keyB || $keyC )
                    unset( $menu[$mkey] );
             }
            }
            return $menu_order;
    }

 // Затем просто подключаем эту функцию к фильтру "menu_order"
        add_filter( 'menu_order', 'remove_those_menu_items' );

Старый ответ

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

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

30 янв. 2011 г. 02:55:26
Комментарии

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

Wyck Wyck
30 янв. 2011 г. 07:18:21

Ок, новый подход, я обновил свой ответ.

Bainternet Bainternet
30 янв. 2011 г. 11:49:00
0

Существует плагин, созданный именно для этого вопроса: Hide Admin Menu. Этот плагин может:

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

Ещё одно преимущество этого плагина — он интуитивно понятен и прост в использовании.

28 авг. 2012 г. 18:26:33
1

Привет, @Wyck:

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

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

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

30 янв. 2011 г. 02:38:34
Комментарии

Спасибо, Майк, может быть, идея для плагина, если позволит время, но пока я думаю, что просто сделаю что-то простое и захардкожу массив. Забавно, что я опубликовал это в треде функций здесь пару недель назад.

Wyck Wyck
30 янв. 2011 г. 07:23:37
0

Этот код оставит только несколько пунктов меню для пользователей, не являющихся администраторами. Версия от @Bainternet использует add_cap, что должно выполняться только один раз — при активации темы или плагина.

add_action('admin_menu', function () {
    if (current_user_can('administrator')) {
        return;
    }

    /**
     * Оставляет только определенные пункты меню и удаляет все остальные
     */
    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]);
    }
}
19 июн. 2013 г. 19:32:34