Как удалить всё админ-меню?
Мне нужно настроить админ-панель для моего пользователя. Как удалить всё админ-меню? Не просто удалить пункты меню, а полностью убрать вертикальную панель меню слева, включая весь дизайн (CSS, фон и т.д.). Я хочу, чтобы там было пусто.
Я могу сделать это с помощью CSS-хака. Но предпочитаю использовать хук. Есть идеи?
Спасибо

Правильный хук для использования — admin_menu
, после которого нужно создать функцию для удаления нужных меню. Следующие две функции удаляют все меню.
add_action( 'admin_menu', 'remove_admin_menus' );
add_action( 'admin_menu', 'remove_admin_submenus' );
// Удаление основных меню админки
function remove_admin_menus() {
remove_menu_page( 'edit-comments.php' ); // Комментарии
remove_menu_page( 'link-manager.php' ); // Ссылки
remove_menu_page( 'tools.php' ); // Инструменты
remove_menu_page( 'plugins.php' ); // Плагины
remove_menu_page( 'users.php' ); // Пользователи
remove_menu_page( 'options-general.php' ); // Настройки
remove_menu_page( 'upload.php' ); // Медиафайлы
remove_menu_page( 'edit.php' ); // Записи
remove_menu_page( 'edit.php?post_type=page' ); // Страницы
remove_menu_page( 'themes.php' ); // Внешний вид
}
// Удаление подменю админки
function remove_admin_submenus() {
remove_submenu_page( 'themes.php', 'theme-editor.php' ); // Редактор тем
remove_submenu_page( 'themes.php', 'themes.php' ); // Темы
remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=post_tag' ); // Метки
remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=category' ); // Рубрики
remove_submenu_page( 'edit.php', 'post-new.php' ); // Добавить новую запись
remove_submenu_page( 'themes.php', 'nav-menus.php' ); // Меню
remove_submenu_page( 'themes.php', 'widgets.php' ); // Виджеты
remove_submenu_page( 'themes.php', 'theme-editor.php' ); // Редактор тем (дублирование)
remove_submenu_page( 'plugins.php', 'plugin-editor.php' ); // Редактор плагинов
remove_submenu_page( 'plugins.php', 'plugin-install.php' ); // Установка плагинов
remove_submenu_page( 'users.php', 'users.php' ); // Все пользователи
remove_submenu_page( 'users.php', 'user-new.php' ); // Добавить пользователя
remove_submenu_page( 'upload.php', 'media-new.php' ); // Добавить медиафайл
remove_submenu_page( 'options-general.php', 'options-writing.php' ); // Написание
remove_submenu_page( 'options-general.php', 'options-discussion.php' );// Обсуждение
remove_submenu_page( 'options-general.php', 'options-reading.php' ); // Чтение
remove_submenu_page( 'options-general.php', 'options-discussion.php' );// Обсуждение (дублирование)
remove_submenu_page( 'options-general.php', 'options-media.php' ); // Медиафайлы
remove_submenu_page( 'options-general.php', 'options-privacy.php' ); // Конфиденциальность
remove_submenu_page( 'options-general.php', 'options-permalinks.php' );// Постоянные ссылки
remove_submenu_page( 'index.php', 'update-core.php' ); // Обновления
}
Скриншот левого меню при использовании указанных выше двух функций:

Следуя примеру /wp-admin/admin-header.php
-> /wp-admin/menu-header.php
, нет хука для этого.
Решение заключается в подключении к хуку admin_head
и добавлении CSS + jQuery:
add_action('admin_head', 'wpse_52099_script_enqueuer');
function wpse_52099_script_enqueuer(){
if(!current_user_can('administrator')) {
echo <<<HTML
<style type="text/css">
#wpcontent, #footer { margin-left: 0px; }
</style>
<script type="text/javascript">
jQuery(document).ready( function($) {
$('#adminmenuback, #adminmenuwrap').remove();
});
</script>
HTML;
}
}
[обновление]
Как следует из уточнения вопроса, где становится ясно, что мотивация заключается в брендировании админ-панели, вот 4 плагина, которые я использую для этого:
- Adminimize (скрывает большие части интерфейса WordPress с фильтрацией по ролям)
- Ozh' Admin Drop Down Menu (все меню админки в горизонтальном CSS-выпадающем меню)
- Admin Menus Fixed (идеальное дополнение к Ozh's)
- Admin Tweaks (я автор этого плагина, и его основная цель — кастомизация многих областей интерфейса админки)

Если вы выберете этот путь, логичнее использовать wp_enqueue_script()
с хуком admin_enqueue_script
.

@mrwweb Даже если вставка такая маленькая? Считаете, что это оправдано?

Согласен. Небольшие вставки скриптов/стилей проще делать через admin_head
.

Мне не нравится использовать jQuery, если у меня нет другого выбора. А что если посетители отключат JavaScript в браузере? Хотя это маловероятно, но такая возможность существует. В любом случае, спасибо за совет.

В моем примере это будет вопросом двойного удаления, также скрывая 2 div'а и в CSS.

Единственный удобный для хуков способ, который я знаю, — это использовать remove_menu_page()
для каждого пункта меню. Даже в этом случае я не знаю, что произойдет с самой левой панелью (свернется ли она до 0px в ширину или что-то ещё). Даже при использовании хуков, я предполагаю, что в какой-то момент вам захочется подключить административную таблицу стилей, чтобы убрать оставшиеся стили разметки меню.
Я бы был осторожен с этим. Например, если вы удалите "Настройки", то любые плагины, создающие страницы меню в разделе "Настройки", станут недоступными. В целом, мне интересно, насколько устойчиво полностью удалять меню.

// Добавляем действие при загрузке админ-панели WordPress
add_action( 'admin_menu', 'remove_admin_menus' );
// Функция для удаления всех пунктов меню в админке
function remove_admin_menus(){
// Получаем доступ к глобальному массиву меню
global $menu;
// Очищаем массив меню
$menu = array();
}

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

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

Я улучшаю решение от @brasofilo, так как в нём есть небольшая ошибка — при перезагрузке страницы с нестабильным интернет-соединением меню может ненадолго появиться. Чтобы избежать этого, я добавил немного больше CSS:
add_action('admin_head', 'wpse_52099_script_enqueuer');
function wpse_52099_script_enqueuer() {
if(!current_user_can('administrator')) {
echo <<<HTML
<style type="text/css">
#wpcontent, #footer { margin-left: 0px !important; }
#adminmenuback, #adminmenuwrap { display: none !important; }
</style>
<script type="text/javascript">
jQuery(document).ready( function($) {
$('#adminmenuback, #adminmenuwrap').remove();
});
</script>
HTML;
}
}
