Как заблокировать пункт меню в консоли администратора 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: