Май
16
6

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

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

Я начинал данную тему с одной лишь задачи, что требовалось для недавнего проекта, однако со временем собрал несколько полезных фишек. Хочу включить их все в один пост дабы легче было найти нужную информацию, и не переходить по десяткам ссылок. Поэтому не удивляйтесь, что ниже представлена парочка (на первый взгляд) немного не связанных сниппетов. Тем не менее, все они касаются тематики скрытия меню в WordPress админке.

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

Как убрать верхнее меню 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'); // Ссылки
  	remove_menu_page('wpcf7');   // Contact form 7
	remove_menu_page('options-framework'); // Cherry Framework
}

Две последние строки отвечают за скрытие разделов Contact form 7 и фреймворка Cherry.

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

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

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

    [11] => 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 ссылку на настройщик шаблона почему-то оказалось не так просто. В сети нашел несколько вариантов решения задачи, но ни один из них у меня не сработал. Единственное, что помогло — метод с CSS.

add_action('admin_head', 'hide_customize');
function hide_customize(){
    echo '<style>.hide-if-no-customize{display:none;}</style>';
}

Данный код размещаете в файле функций. Он добавляет display:none; для стиля, который используется в пункте настройщика (hide-if-no-customize). Возможно, в какой-то версии системы там будет другой class/id, смотрите код страницы. 

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

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

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

В данном случае условие срабатывает для двух профилей с почтой yourmail1@gmail.com и yourmail2@gmail.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.
  • Устанавливать разные разрешения доступа.
  • Создавать новые разделы и подпункты.

Admin Menu Editor

В целом инструмент интересный, хотя в нем нужно будет разбираться. Я пытался «поиграться» там с ролями юзеров и скрытием определенных разделов, но если честно, у меня мало что получилось. Решил вернуться к обычным сниппетам. Возможно, в будущем рассмотрю его детальнее. Модуль весьма популярный — около 200 тысяч загрузок и высокие оценки.

Кстати, можете также оценить плагин WP Responsive Menu, который позволяет скрывать нужные элементы навигации для версии сайта под смартфоны/планшеты. Детальнее об этом в заметке о создании альтернативного мобильного меню в WordPress.

Теперь вроде все:) Если знаете еще какие-то задачи или хаки по теме как скрыть пункты меню или убрать из меню лишние элементы, пишите в комментариях.

комментариев 6 к статье “Как убрать пункты меню в WordPress админке”

  • Александр   22.05.2018

    Спасибо за полезный пост!
    Реально помогло! Особенно после долгих и мучительных поисков того, как ограничить доступ пользователей сайта по ролям, установленным в вордпресс. Ничего толкого не нашел.
    А тут с помощью сокрытия меню — просто и удобно.
    А главное — не надо никаких дурацких плагинов!

    Спасибо

  • Tod   22.05.2018

    Александр, рад, что помогло. Кстати, в блоге есть отдельный пост про роли пользователей в WordPress — там была парочка плагинов по управлению ограничениями доступа. Можете также глянуть для ознакомления с темой.

  • Сергей   18.08.2019

    Приветствую! Отличная статья!

    Подскажите плз. у меня есть сайт, до меня его делал другой. В теме, которую надо поправить скрыт пункт «Внешний вид» -> «Меню». Если переключиться на Классическую тему, этот пункт появляется.

    Смотрел файл function.php внутри текущей темы, там только это:

    function true_add_columns($my_columns) {
    $my_columns = array(
    ‘tags’ => __(‘Tags’)
    );
    return $my_columns;
    }

    add_filter(«manage_edit-tags_columns», ‘true_add_columns’);

    Подскажите где искать код, который скрыл часть меню. (Также кроме Меню, скрыт Виджеты и тд)

  • Tod   19.08.2019

    Сергей, если это весь код, который есть в файле функций (и в шаблоне нет других подобных файлов — init, custom-functions и т.п.) то скорее всего меню просто не подключено в шаблоне — смотри пост про вывод меню, где самый первый код добавлять данную опцию в админку.

  • Александр   24.01.2021

    Просьба помочь с Меню!

    На сайте верхнее меню состоит всего из одного пункта (ссылка на внутреннюю страницу).

    Как убрать этот «слайдер» (заменить Menu сразу на его содержимое)? То есть, чтобы вместо раскрывающегося «Menu» (как на картинке — https://i.imgur.com/HtiPkzS.png ) была ссылка на страницу?

    И это именно для мобильной версии. На десктопе все нормально.
    Тема — iconic one.

  • Tod   25.01.2021

    Александр, если честно, не совсем до конца уловил суть проблемы. Возможно, пригодится использование разного обычного и мобильного меню это позволит на ПК версии выводит одно, на мобилке — другое.

Оставить комментарий


Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!

Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога:

Поиск:
Последние посты
Лучшее в категории

Облако тегов
Скажи свое мнение!

В чем основные плюсы Wordpress?

Посмотреть результаты

Загрузка ... Загрузка ...
Друзья проекта
Последние новости