Вопрос или проблема
Я разрабатываю новый плагин для WordPress, который регистрирует несколько новых типов постов. У них у всех есть свое меню и подменю в админке WordPress. Как создать новое меню (как родительская категория) и переместить все элементы под него?
Установите аргумент
'show_in_menu' => false
при регистрации вашего поста с помощью register_post_type() приведет к игнорированию админских меню для этого типа поста, поэтому это лучшее решение для скрытия меню.
Если вы не можете получить к нему доступ, вы можете подключить функцию к admin_menu, чтобы добавить или удалить меню и подменю.
Вот пример. Мы создали тип поста ‘artist’, но не хотим, чтобы у него было админское меню. Мы хотели бы поместить его под меню ‘music’; оно будет иметь различные другие подменю.
add_action( 'admin_menu', 'adjust_admin_menu' );
function adjust_admin_menu(){
$menu_slug = 'music'; //путь меню (или путь к файлу); как ID
$post_type_artist_slug = 'artist';
$post_type_artist = get_post_type_object($post_type_artist_slug);
/////Удалить меню, сгенерированное register_post_type() для нашего пользовательского типа поста 'artist'. При регистрации типа поста, установка
$remove_menu_slug = sprintf('edit.php?post_type=%s',$post_type_artist_slug); //путь меню (здесь, путь к файлу); как ID
//удалить меню
remove_menu_page( $remove_menu_slug );
/*
//ИЛИ удалить подменю 'добавить новый'
remove_submenu_page(
$remove_menu_slug,
sprintf('post-new.php?post_type=%s',$post_type_artist_slug) //путь подменю (здесь, путь к файлу); как ID
);
*/
/////Создать наше пользовательское меню
$this->menu_page = add_menu_page(
__( 'Музыка', 'music-plugin' ), //название страницы - я никогда не понимал, зачем нужен этот параметр. Поставьте что угодно?
__( 'Музыка', 'music-plugin' ), //название меню
'manage_options', //возможности
$menu_slug,
array($this,'settings_page'), //эта функция выведет содержимое страницы 'Музыка'.
'dashicons-album', // изображение будет 'plugins_url( 'myplugin/images/icon.png' )'; но для иконок ядра см. https://developer.wordpress.org/resource/dashicons
6
);
////Добавить подменю
add_submenu_page(
$menu_slug,
$post_type_artist->labels->name, //название страницы - я никогда не понимал, зачем нужен этот параметр. Поставьте что угодно?
$post_type_artist->labels->name, //название подменю
'edit_posts',
sprintf('edit.php?post_type=%s',$post_type_artist_slug) //путь подменю (здесь, путь к файлу); как ID
);
add_submenu_page(
$menu_slug,
$post_type_artist->labels->add_new_item,
$post_type_artist->labels->add_new_item,
'edit_posts',
sprintf('post-new.php?post_type=%s',$post_type_artist_slug) //путь подменю (здесь, путь к файлу); как ID
);
}
.
Ответ или решение
Перемещение подменю администраторов в меню WordPress
В процессе разработки нового плагина для WordPress, который регистрирует несколько новых типов записей, возникает необходимость организовать административное меню более эффективно, объединив группы записей под единой родительской категорией. В этой статье мы подробно обсудим, как создать новое меню и переместить подменю в его структуру, используя функционал WordPress.
Шаг 1: Скрытие стандартного меню
Первоначально, чтобы скрыть стандартное меню для вашего типа записи, необходимо использовать параметр show_in_menu
в функции register_post_type()
. Установив его значение в false
, мы предотвращаем создание отдельного пункта меню для нового типа записи.
'register_post_type' => array(
'show_in_menu' => false,
// Остальные параметры регистрации...
);
Шаг 2: Использование хука admin_menu
Затем нужно использовать хук admin_menu
для удаления уже существующего меню и добавления нового. В данном примере мы создадим меню "Музыка", в котором будет находиться подменю для типа записи "Artist".
Пример кода
add_action('admin_menu', 'adjust_admin_menu');
function adjust_admin_menu() {
$menu_slug = 'music'; // слаг нового меню
$post_type_artist_slug = 'artist'; // слаг типа записи "Artist"
$post_type_artist = get_post_type_object($post_type_artist_slug);
// Удаляем стандартное меню для типа записи "Artist"
$remove_menu_slug = sprintf('edit.php?post_type=%s', $post_type_artist_slug);
remove_menu_page($remove_menu_slug);
// Создаем новое меню "Музыка"
add_menu_page(
__('Музыка', 'music-plugin'), // Заголовок страницы
__('Музыка', 'music-plugin'), // Заголовок меню
'manage_options', // возможности
$menu_slug,
'music_page_content', // функция, генерирующая содержимое страницы
'dashicons-album', // Иконка
6
);
// Добавляем подменю для типа записи "Artist"
add_submenu_page(
$menu_slug,
$post_type_artist->labels->name, // Заголовок подменю
$post_type_artist->labels->name, // Название подменю
'edit_posts',
sprintf('edit.php?post_type=%s', $post_type_artist_slug)
);
// Добавляем подменю для добавления новой записи "Artist"
add_submenu_page(
$menu_slug,
$post_type_artist->labels->add_new_item, // Заголовок подменю
$post_type_artist->labels->add_new_item, // Название подменю
'edit_posts',
sprintf('post-new.php?post_type=%s', $post_type_artist_slug)
);
}
// Функция, генерирующая содержимое страницы "Музыка"
function music_page_content() {
echo '<h1>Добро пожаловать в раздел Музыка</h1>';
}
Объяснение кода
-
Удаление меню: Функция
remove_menu_page($remove_menu_slug)
убирает стандартный пункт меню, связанный с типом записи "Artist". -
Создание меню: Используется функция
add_menu_page()
для создания нового родительского меню "Музыка". Здесь важно правильно указать параметры, такие как заголовок страницы, название меню, права доступа и функцию, которая будет генерировать контент страницы. -
Добавление подменю: Функции
add_submenu_page()
добавляют соответствующие подменю для просмотра и добавления записей типа "Artist".
Заключение
Реализация перемещения администраторских пунктов меню в WordPress — это мощный инструмент для упрощения навигации в админке, особенно при разработке плагинов с множеством типов записей. С использованием встроенных функций WordPress и правильного применения хуков, таких как admin_menu
, вы сможете создать интуитивно понятную структуру меню для ваших пользователей.
Следуя приведенным рекомендациям, вы сможете оптимизировать административную панель вашего плагина, сделав её более удобной и понятной.