Как заблокировать пункт меню в консоли администратора WordPress

Исключить пункт из меню администратора WordPress

Исключить пункт из меню администратора

Предположим, вы не желаете, чтобы у зарегистрированного пользователя WordPress был доступ к определённому пункту меню панели администратора WordPress, и проблему нельзя решить при помощи редактирования системы ролей и разрешений WordPress – просто не существует такой возможности, такого разрешения (capability), которое можно было бы в данной ситуации применить. Например, чтобы предоставить пользователю право настройки виджетов, нужно дать ему доступ в меню “Внешний вид” (Appearance). Для этого достаточно предоставить пользователю путём добавления в его роль или напрямую разрешение edit_theme_options. Но тут же вы столкнётесь с другой проблемой – кроме пункта меню “Виджеты” (Widgets) то же разрешение edit_theme_options одновременно добавляет в меню пункты “Темы” (Themes) и “Меню” (Menus).
Другая возможная ситуация – вы хотите запретить зарегистрированному пользователю редактировать свой профайл. Зачем это может понадобиться? Например, вы решили предоставить группе пользователей одну учетную запись в общее пользование. Если один из членов этой группы вдруг сменит пароль, это будет неожиданно для остальных, не правда ли? Следовательно, вам необходимо заблокировать пункт меню консоли администратора и ссылку, отвечающие за выхоз редактора профайла пользователя. Давайте рассмотрим, как это можно сделать. Добавим несколько строк кода в файл functions.php, расположенный в каталоге активной темы (wp-content/themes/ваша_тема/functions.php). Начнём,

Откройте упомянутый выше файл functions.php и вставьте в его начало следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// блокировать меню profile для пользователей с ролью Subscriber
if ( is_user_logged_in() ) {
  if (current_user_can('subscriber')) {
    function remove_profile_submenu() {
      global $submenu;
      // удалить пункт меню "Твой профайл"
      unset($submenu['profile.php'][5]);
    }
    add_action('admin_head', 'remove_profile_submenu');
 
    function remove_profile_menu() {
      global $menu;
// удалить пункт меню "Профайл"
      unset($menu[70]);
    }
    add_action('admin_head', 'remove_profile_menu');
 
 
    function profile_redirect() {
      $result = stripos($_SERVER['REQUEST_URI'], 'profile.php');
      if ($result!==false) {
        wp_redirect(get_option('siteurl') . '/wp-admin/index.php');
      }
    }
 
    add_action('admin_menu', 'profile_redirect');
  }
}
// конец блокировки пункта меню profile для пользователей с ролью Subscriber

Вот, собственно, и всё. Этот код блокирует редактор профайла пользователя для всех пользователей с ролью Subscriber. Я использовал роль Subscriber только для примера. Это может быть любая другая роль, в том числе и созданная Вами. Для создания собственной роли и наполнения её возможностями в соотвествии с вашими потребностями используйте плагин Редактор Ролей Пользователей.
Теперь разберём код:
Сначала, в строке 3 мы проверяем роль пользователя WordPress:

3
if (current_user_can('subscriber')) {

Для проверки другой не subscriber роли, замените имя роли в одинарных кавычках в строке 3 на нужное Вам.
Затем строки 4-8 удаляют пункт меню ‘Ваш Профайл’. Обратите внимание на строку 7:

7
 unset($submenu['profile.php'][5]);

Как определить, какой елемент массива $submenu удалить? Откройте файл wp-admin/menu.php, найдите заголовок меню, который Вам нужно заблокировать. Найдите поблизости код, объявляющий элемент массива $submenu для этого пункта меню. Я уверен, удача улыбнется Вам :), и Вы найдете нужные данные. Если Вы всё же не нашли нужную информацию, задайте вопрос здесь, и я постараюсь помочь Вам.
Строки 11-15 удаляют пункт меню ‘Профайл’. Посмотрите на строку 14:

14
  unset($menu[70]);

Для блокировки пункта меню верхнего уровня нужно удалить соответствующий элемент массива $menu. Индекс нужного элемента для удаления можно найти в том же файле wp-admin/menu.php.

Достаточно ли уже сделанного и можно ли остановиться на этом? Нет. Мы только скрыли пункты от пользователя меню. Но любознательный пользователь может напрямую набрать в адресной строке браузера что-либо вроде wp-admin/profile.php. Поэтому в строках 22-29 мы вынуждены перенаправить такого пользователя обратно на консоль администратора WordPress.

Для блокировки другого пункта меню исследуйте файл wp-admin/menu.php.
Приведённый выше пример кода протестирован с WordPress 3.2.

Tags:

  • Алексей Девятов

    Очень интересный пример, только что пробовал у себя на сайте.

  • Алексей Девятов

    Подскажите пожалуйста, а если хочу добавить для нескольких ролей, скажем автора и редактора. Подскажите как это будет в коде написано.

  • Алексей Девятов

    Я так понимаю в строке 3:

    if (current_user_can(‘subscriber’) or(‘Автор’) or (‘Редактор’)) {

    • Совершенно верно:
      if (current_user_can(‘subscriber’) || current_user_can(‘author’) || current_user_can(‘editor’)) {

  • Алексей Девятов

    Все настроил все работает. Статья очень понравилась, большое спасибо.

  • Vladislav-dimakov

    Как удалить только подменю, без удаления самого меню
    Например:
    я имею пункт меню “Параметры” и множество подменю вложенных в него,
    мне надо удалить из него подменю “Приватность”, так что бы сам пункт “Параметры” остался на месте.
    Как это сделать?

    • Для удаления пункта меню “Приватность” из меню “Параметры” можно использовать такой код:

      function remove_privacy_submenu() {
      global $submenu;
      // удалить пункт меню "Твой профайл"
      unset($submenu['options-general.php'][35]);
      }
      add_action('admin_head', 'remove_privacy_submenu');

      • Vladislav-dimakov

        Большое спасибо!
        Но назрел еще один вопрос:
        Как удалить те подменю, которые были установлены сторонними плагинами?
        Ведь в menu.php нет этого, или я чего то не так понимаю…

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

          add_submenu_page('users.php', 'User Role Editor', 'User Role Editor', 'edit_users', basename(__FILE__), 'ure_optionsPage');

          чтобы пункт появился в меню “Пользователи” или такой для меню “Параметры”

          add_options_page('Silence Is Golden Guard', 'SIG Guard', 'create_users', basename(__FILE__), 'sig_guard_optionsPage');

          Таким образом, используя 4-ый параметр в 1-м случае и 3-ий – во 2-м, автор плагина уже устанавливает планку, каким пользователям показывать этот пункт меню, а каким нет. Если требуется ужесточить можно заменить привилегию в коде плагина на более высокую или наоборот более низкую.

          Если же цель упростить экран самому себе, как администратору, то лучше использовать для этого плагин Adminimize, предоставляющий интерфейс для визуального исключения “ненужных” пунктов из меню администратора.

  • Владимир

    Доброго времени суток. Очень интересная статья, но у меня возникла такая проблема: у меня многопользовательская блоговая сеть (на мультисайтинговом ВП), чтобы админы блогов не лазили в лишние пункты меню использую код

    if (current_user_can(‘administrator’)) {
    function remove_t13_submenu() {
    global $submenu;
    unset($submenu[‘options-general.php’][35],$submenu[‘index.php’][0],$submenu[‘index.php’][5],$submenu[‘themes.php’][5],$submenu[‘themes.php’][10],$submenu[‘options-general.php’][30],$submenu[‘options-general.php’][40]);
    }
    add_action(‘admin_head’, ‘remove_t13_submenu’);

    function remove_t14_menu() {
    global $menu;
    unset($menu[15],$menu[65],$menu[75],$menu[20],$menu[60]);
    }
    add_action(‘admin_head’, ‘remove_t14_menu’);

    }

    Но в этом случае эти меню убираются и у меня (моя группа: Super Admin, а не Administrator)

    Можно ли как то запретить выполнение этого скрипта для группы Super Admin???
    Заранее благодарен)))

    • Добрый вечер, попробуйте это условие


      if (current_user_can('administrator') && !is_super_admin()) {

      Функция is_super_admin() проверяет является ли текущий пользователь WP суперадминистратором для мультисайтинговой конфигурации.

      • Владимир

        Спасибо огромное!
        Сначала не захотело работать, но потом вылечил переделав получение группы пользователя.

  • Дояр

    Ребят иди те ка вы нахуй
    И не слушайте Владислава он ливер

  • Оп Опов

    ДА ДА согласен с Дояром

  • Григорий

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

    • Можно начать с этой статьи
      http://www.shinephp.com/hide-draft-and-pending-posts-from-other-authors/
      Понадобится исключить дополнительно опубликованные (published) посты.
      В Media Library contributor/author может изменять только собственно-ручно загруженные объекты.

      • Григорий

        Спасибо. Пробую. 🙂
        Владимир, а с вами можно как-то связаться персонально? Вы наверно видите мой емейл, если дайте мне знать куда вам написать.

        • Можно:
          – через пункт меню “Контакт” открывается форма, отправляющая сообщение на мой e-mail.
          – или прямо на vladimir [at-sign] shinephp.com

  • алексей

    А как убрать консоль по адресу wp-admin/index.php для обычных пользователей?

    • Вставьте в functions.php своей темы данный фрагмент
      function block_back_end() {

      if (current_user_can(‘subscriber’)) {
      wp_redirect(get_site_url());
      }

      }
      add_action(‘admin_init’, ‘block_back_end’);

      Все пользователи с ролью subscriber будут автоматически перенаправляться с wp-admin на домашнюю страницу.

      • В предыдущем варианте была неточность. Используйте лучше этот, исправленный (см. выше).

  • Владимир

    Спасмибо за инструкции!!

    Подскажите, я скрыл несколько меню, но не могу сделать редирект с нескольких прямых адресов пунктов меню, получается скрыть только один прямой адрес (в моем примере /upload.php), что нужно изменить?

    // блокировать меню для пользователей с ролью contributor
    if ( is_user_logged_in() ) {
    if (current_user_can(‘contributor’)) {

    function remove_profile_menu() {
    global $menu;
    // удалить пункт меню “1, 4-7”
    unset($menu[1]);
    unset($menu[4]);
    unset($menu[5]);
    unset($menu[6]);
    unset($menu[7]);
    }
    add_action(‘admin_head’, ‘remove_profile_menu’);

    function profile_redirect() {
    $result = stripos($_SERVER[‘REQUEST_URI’], ‘upload.php’);
    if ($result!==false) {
    wp_redirect(get_option(‘siteurl’) . ‘/wp-admin/index.php’);
    }
    }

    add_action(‘admin_menu’, ‘profile_redirect’);
    }
    }
    // конец блокировки меню для пользователей с ролью contributor

    • function profile_redirect() {
      $prohibited_items = array(‘upload.php’, ‘some.php’);
      foreach ($prohibited_items as $item) {
      $result = stripos($_SERVER[‘REQUEST_URI’], $item);
      if ($result !== false) {
      wp_redirect(get_option(‘siteurl’) . ‘/wp-admin/index.php’);
      }
      break;
      }
      }

  • Игорь

    Здравствуйте! А как сделать тоже самое, но только для edit-comments.php? Спасибо!