Как убрать пункты меню в админке WordPress

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

Полный список хаков, позволяющих:

#Скрыть верхнюю панель WordPress

Самая простая задача. Данная панель отображается в админке и на самом сайте, а ее скрытие решается она буквально в несколько кликов. Для этого нам надо всего лишь перейти в раздел «Пользователи» — на странице редактирования настроек:

Чтобы отключить верхнюю панель в WordPress вам нужно снять соответствующую галочку в параметрах профиля. По умолчанию, при создании нового пользователя опция является активной.

Если вы хотите деактивировать данную функцию для всех пользователей, чтобы не отключать ее каждый раз вручную, можно использовать код:

add_filter('show_admin_bar', '__return_false');

или

show_admin_bar(false);

Размещаете любую из строк в functions.php и готово.
Есть еще один вариант, позволяющий убрать верхнюю панель в WordPress всем кроме администратора:

function remove_admin_bar() {
	if (!current_user_can('administrator') && !is_admin()) {
		show_admin_bar(false);
	}
}

В принципе, никакой особо полезной информации / действий она не содержит, желательно деактивировать данную панель.

#Как скрыть пункты меню в WordPress админке

Для этих целей в системе есть 2 функции:

  • remove_menu_page — удаляет элементы первого уровня (разделы)
  • remove_submenu_page — избавляется от подстраниц (второго уровня).

Разработчики советуют вызывать их исключительно с помощью хука admin_menu иначе могут возникнуть ошибки. Важно(!) Физически страницы настроек никуда не деваются, вы просто прячете их, т.е. по прямым ссылкам они будут доступны! Примеры кодов ниже работают для версий WP 3.1+ (в противном случае гуглите функцию unset).

В качестве параметра для функции remove_menu_page вставляете название файла, отвечающего за нужный раздел, например:

add_action('admin_menu', 'remove_admin_menu');
function remove_admin_menu() {
	remove_menu_page('options-general.php'); // Удаляем раздел Настройки	
  	remove_menu_page('tools.php'); // Инструменты
	remove_menu_page('users.php'); // Пользователи
	remove_menu_page('plugins.php'); // Плагины
	remove_menu_page('themes.php'); // Внешний вид	
	remove_menu_page('edit.php'); // Посты блога
	remove_menu_page('upload.php'); // Медиабиблиотека
	remove_menu_page('edit.php?post_type=page'); // Страницы
	remove_menu_page('edit-comments.php'); // Комментарии	
	remove_menu_page('link-manager.php'); // Ссылки
}

Чтобы узнать какие названия разделов используются в плагинах, попробуйте добавить хак:

add_action( 'admin_init', 'wpse_136058_debug_admin_menu' );
function wpse_136058_debug_admin_menu() {
    echo '<pre>' . print_r( $GLOBALS[ 'menu' ], TRUE) . '</pre>';
}

В админке отобразится массив данных, где элементы показывают опции по каждому из пунктов меню, например:

[12] => Array (
    [0] => WooCheckout
    [1] => manage_options
    [2] => woocommerce-checkout-manager
    [3] => WooCheckout
    [4] => menu-top toplevel_page_woocommerce-checkout-manager menu-top-last
    [5] => toplevel_page_woocommerce-checkout-manager
    [6] => dashicons-businessman
)

Вам нужно значение в [2] то есть в параметрах функции remove_menu_page указываете woocommerce-checkout-manager. Аналогично по всем остальным элементам.

У страниц (edit.php?post_type=page) тоже немного необычный формат. Если на сайте есть другие таксономии, применяете конструкцию:

remove_menu_page('edit.php?post_type=custom-post-name');

Где custom-post-type-name — название таксономии. Когда нужно удалить в меню страницу Wodpress модуля вида wp-admin/admin.php?page=some_pageslug, поможет код:

remove_menu_page('some_pageslug');

Для подстраниц формат записи функции несколько иной, но принцип похожий — подставляете в качестве параметров сначала название раздела, а потом конкретного подпункта:

add_action('admin_menu', 'remove_admin_menu', 999);
function remove_admin_menu() {
	remove_submenu_page('themes.php','themes.php'); // Удаляем подпункт с выбором тем
	remove_submenu_page('themes.php','theme-editor.php'); // Редактирование шаблона
	remove_submenu_page('themes.php','theme_options'); // Настройки темы
	remove_submenu_page('edit.php','edit-tags.php?taxonomy=post_tag'); // Скрытие Тегов для Постов
	remove_submenu_page('edit.php','edit-tags.php?taxonomy=category'); // Скрытие Категорий для Постов
}

Фишка применения remove_submenu_page в том, что вы сможете скрыть пункт меню в админке WordPress второго уровня, а сам раздел (Посты, Внешний вид) останется.

Также вы могли заметить, что в последнем случае вызова add_action использован приоритет = 999. Дело в том, что некоторые строки не всегда срабатывают без него — это касалось модулей и раздела Внешний вид. В сети есть варианты 99, 500, но 999 надежнее. 

#Убрать специальные разделы таксономий темы

В некоторых премиум шаблонах разработчики добавляют специальные таксономии для сайта — отзывы, FAQ, портфолио, услуги и т.д. Если вам не нужны какие-то из этих объектов, поищите в файлах шаблона, где они были созданы (функция register_post_type).

В этом случае код находится в файле theme-init.php. Открываем и смотрим его содержимое — там после задания соответствующих параметров таксономий идет активация через add_action. Чтобы от них избавиться, просто закомментируйте эти строки, если подобные функции на сайте не нужны. 

#Убираем меню в WordPress для конкретного пользователя

Допустим вы хотите сделать отдельные настройки для какого-то конкретного редактора, убрав лишнее. Задавать параметры всем пользователей с одним и тем же типом прав доступа в этом случае не вариант. Вам пригодится ограничение по email (т.к. значение почты уникально для каждого пользователя).

add_action('admin_menu', 'remove_admin_menu_links', 999);
function remove_admin_menu_links() {
	$user = wp_get_current_user();
	if ( $user &amp;&amp; isset($user->user_email) ) {
	 if (('email1@site.com' == $user->user_email) || ('email2@site.com' == $user->user_email)) {
		remove_menu_page('tools.php');
	remove_menu_page('users.php');
		remove_menu_page('wpcf7');
	remove_menu_page('options-framework');
	}
 }

В данном случае условие срабатывает для двух профилей с почтой email1@site.com и email2@site.com. Важно(!) Не забудьте поменять эти значения на свои. 

#Как удалить меню в WP по ролям

У каждой роли пользователей в WordPress (админ, автор, редактор) есть определенные возможности: правка готовых постов, удаление чужих записей и т.п. С помощью функции current_user_can и условного оператора вы можете решить нужные задачи:

add_action( 'admin_menu', 'remove_some_menus', 999 );
 function remove_some_menus() {
 // 1. Добавляете строки скрытия пунктов меню для всех
     if ( ! current_user_can('manage_options') ) {
 // 2. Здесь будут вызовы для роли редактора и ниже (но не админа)
     }
     if ( ! current_user_can('delete_others_posts') ) {
// 3. Условие для авторов и ниже, но не редакторов и админов
     }
 }

Код размещаете в файле функций functions.php. Здесь проверяются условия с помощью current_user_can — может ли текущий юзер менять настройки или удалять посты. Например, последняя задача недоступна для роли Автор, поэтому будет выполнен соответствующий (третий) блок исключений (которые и получат все авторы).

Вот еще один сниппет. Дабы скрыть меню Инструменты из WordPress для всех, кто не является админом, используйте:

add_action( 'admin_init', 'remove_menu_nonadmin' );
function remove_menu_nonadmin () {
	global $user_ID;
	if ( !current_user_can('administrator') ) {
		remove_menu_page('tools.php', 'tools.php');
	}
}

#Admin Menu Editor для модификации меню

Решить вопрос именно с помощью кода задача для тех, кто хоть как-то разбирается в нем, но традиционно под нашу задачу есть и специальные плагины для WordPress админки. Один из них — Admin Menu Editor. Он позволяет:

  • Редактировать заголовки, иконки, CSS для навигации в системе.
  • Переставлять пункты местами с помощью перетаскивания, в том числе и меняя их иерархию.
  • Показывать и скрывать меню в WordPress.
  • Устанавливать разные разрешения доступа.
  • Создавать новые разделы и подпункты.

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