Показать произвольную таксономию внутри пользовательского меню
У меня есть пользовательское меню, созданное с помощью add_menu_page
:
add_menu_page('Мое меню' , 'Некоторый текст', 'read', 'nwcm');
Под ним я показываю пункт меню произвольного типа записи;
// Создаем произвольный тип записи новостей
register_post_type('nwcm_news', array(
'labels' => array(
'name' => __('Новости для клиентов', NWCM_TEXT_DOMAIN) ,
'singular_name' => __('Новость', NWCM_TEXT_DOMAIN)
) ,
'public' => true,
'has_archive' => true,
'public' => true,
'show_ui' => true,
'show_in_menu' => 'nwcm',
'taxonomies' => array(
'nwcm_news_category'
) ,
));
Затем я добавляю произвольную таксономию, привязанную к этому типу записи "nwcm_news":
// регистрируем таксономию новостей
register_taxonomy('nwcm_news_category', 'nwcm_news', array(
'label' => __('Категории новостей') ,
'menu_name' => __('Категории новостей') ,
'rewrite' => array(
'slug' => 'nwcm_news_category'
) ,
'hierarchical' => true
));
Родительское меню и произвольный тип записи отображаются корректно... но меню таксономии не показывается :(
Как я могу это исправить? Я проверил это решение, но в ответе не хватает полного примера кода..
У вас есть некорректный код.
Я отформатировал ваш код так, чтобы он действительно работал.
Следующее решение позволяет задать произвольное название меню для вашего пользовательского типа записи. Просто измените метку "menu_name".
ТИП ЗАПИСИ
// Создаем пользовательский тип записи "Новости"
register_post_type('nwcm_news', array(
'labels' => array(
'name' => __('Новости для клиентов', 'NWCM'),
'singular_name' => __('Новость', 'NWCM'),
'menu_name' => __('NWCM', 'NWCM'),
'all_items' => __('Просмотреть статьи', 'NWCM'),
),
'public' => true,
'has_archive' => true,
'show_ui' => true,
'show_in_menu' => true,
'taxonomies' => array(
'nwcm_news_category'
)
));
ТАКСОНОМИЯ
// Регистрируем таксономию для новостей
register_taxonomy('nwcm_news_category', 'nwcm_news', array(
'label' => 'Категории новостей',
'labels' => array(
'menu_name' => __('Категории новостей', 'NWCM')
),
'rewrite' => array(
'slug' => 'nwcm-news-category'
),
'hierarchical' => true
));
Я не совсем уверен, хотите ли вы создать собственное меню в админке для ваших элементов или просто изменить название меню для пользовательского типа записи.
Я добавил параметр menu_name
со значением "NWCM" в метки вашего пользовательского типа записи.
Настоятельно рекомендую вам внимательно изучить и полностью понять параметры и аргументы для регистрации пользовательских типов записей и таксономий.
ОБНОВЛЕНИЕ: 09/05/2014
Если вы хотите полностью создать собственное меню в админке и добавить туда пользовательские типы записей, таксономии и другие страницы, следующий пример работает. Обратите внимание, это лишь отправная точка, и вы можете модифицировать решение под свои нужды.
Хук для init
- регистрация типов записей и таксономий
if ( ! function_exists( 'mbe_init' ) ) {
function mbe_init() {
# Создаем пользовательский тип записи "Новости"
register_post_type( 'nwcm_news', array(
'labels' => array(
'name' => __( 'Новости для клиентов', 'NWCM' ),
'singular_name' => __( 'Новость', 'NWCM' ),
),
'public' => true,
'has_archive' => true,
'show_ui' => true,
'show_in_menu' => false, // добавляем в меню вручную
'taxonomies' => array(
'nwcm_news_category'
)
) );
# Создаем таксономию "Категории новостей"
register_taxonomy( 'nwcm_news_category', 'nwcm_news', array(
'label' => 'Категории новостей',
'labels' => array(
'menu_name' => __( 'Категории новостей', 'NWCM' )
),
'rewrite' => array(
'slug' => 'nwcm-news-category'
),
'hierarchical' => true
) );
}
add_action( 'init', 'mbe_init' );
}
Хук для admin_menu
- создание меню и подменю
if ( ! function_exists( 'mbe_add_admin_menu' ) && ! function_exists( 'mbe_display_admin_page' ) ) {
function mbe_add_admin_menus() {
# Настройки для меню
$page_title = 'Новости для клиентов';
$menu_title = 'NWCM';
$capability = 'post';
$menu_slug = 'nwcm';
$function = 'mbe_display_admin_page'; // Функция вывода контента
$icon_url = 'dashicons-admin-page';
$position = 0;
# Добавляем меню
add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
$submenu_pages = array(
# Главная страница меню
array(
'parent_slug' => 'nwcm',
'page_title' => 'Обзор новостей',
'menu_title' => 'Обзор',
'capability' => 'read',
'menu_slug' => 'nwcm',
'function' => 'mbe_display_admin_page',
),
# Подменю: Просмотр новостей
array(
'parent_slug' => 'nwcm',
'page_title' => '',
'menu_title' => 'Просмотр новостей',
'capability' => '',
'menu_slug' => 'edit.php?post_type=nwcm_news',
'function' => null,
),
# Подменю: Добавить новость
array(
'parent_slug' => 'nwcm',
'page_title' => '',
'menu_title' => 'Добавить новость',
'capability' => '',
'menu_slug' => 'post-new.php?post_type=nwcm_news',
'function' => null,
),
# Подменю: Категории новостей
array(
'parent_slug' => 'nwcm',
'page_title' => '',
'menu_title' => 'Категории новостей',
'capability' => '',
'menu_slug' => 'edit-tags.php?taxonomy=nwcm_news_category&post_type=nwcm_news',
'function' => null,
),
);
# Добавляем подменю
foreach ( $submenu_pages as $submenu ) {
add_submenu_page(
$submenu['parent_slug'],
$submenu['page_title'],
$submenu['menu_title'],
$submenu['capability'],
$submenu['menu_slug'],
$submenu['function']
);
}
}
add_action( 'admin_menu', 'mbe_add_admin_menus', 1 );
# Функция вывода контента для страницы меню
function mbe_display_admin_page() {
echo '<div class="wrap">' . PHP_EOL;
echo '<h2>Моя страница в админке</h2>' . PHP_EOL;
echo '<p>Это пользовательская страница, созданная через меню.</p>' . PHP_EOL;
echo '</div><!-- end .wrap -->' . PHP_EOL;
echo '<div class="clear"></div>' . PHP_EOL;
}
}
Хук для подсветки активного меню
if ( ! function_exists( 'mbe_set_current_menu' ) ) {
function mbe_set_current_menu( $parent_file ) {
global $submenu_file, $current_screen, $pagenow;
# Подсветка для типа записи "Новости"
if ( $current_screen->post_type == 'nwcm_news' ) {
if ( $pagenow == 'post.php' ) {
$submenu_file = 'edit.php?post_type=' . $current_screen->post_type;
}
if ( $pagenow == 'edit-tags.php' ) {
$submenu_file = 'edit-tags.php?taxonomy=nwcm_news_category&post_type=' . $current_screen->post_type;
}
$parent_file = 'nwcm';
}
return $parent_file;
}
add_filter( 'parent_file', 'mbe_set_current_menu' );
}
Если вам нужно больше информации о том, как это работает, изучите следующие материалы:
- Добавление пользовательских меню в админке
- Добавление пользовательских подменю
- Роли и права в WordPress
- Регистрация пользовательских типов записей
- Регистрация пользовательских таксономий
- API плагинов WordPress: Справочник действий
- API плагинов WordPress: Действие
init
- API плагинов WordPress: Действие
admin_menu
- API плагинов WordPress: Справочник фильтров
- Полный список хуков WordPress

К сожалению, это не то, что мне нужно :( Я уже проверил кодекс, и там нет информации о моем случае: добавление меню таксономии в меню, созданное с помощью "add_menu_page". В приведенном вами примере не используется "add_menu_page", а просто создается новое меню верхнего уровня.. Именно поэтому я использовал 'show_in_menu' => 'nwcm'
; мне нужно, чтобы мой пользовательский тип записи и связанная таксономия отображались под меню, созданным с помощью add_menu_page
.. Это немного сложно, и я не уверен, возможно ли это реализовать.

@numediaweb Я долго пытался передать строку в аргумент show_in_menu
для register_post_type();
, например admin.php?page=nwcm
... Но это просто не работало. Однако мое решение дает немного больше гибкости и свободы при разработке админки WordPress. Вы можете комбинировать пользовательские страницы админки, страницы пользовательских типов записей и страницы пользовательских таксономий. Посмотрите правку в моем ответе. :)

Спасибо, Майкл, за время, потраченное на ответ :) Хотя ваше решение будет работать, у него есть недостаток: вы теряете "хук" или связь WordPress между пользовательским типом записи и созданным меню. Это означает, что при клике, например, на "Добавить новость", вы попадете на нужную страницу, но меню слева не будет выделено, потому что WordPress не знает связи между пользовательским типом записи "nwcm_news" и пунктом "submenu_page".. Думаю, то, что я пытаюсь сделать, невозможно.. изменю подход! Спасибо.

@numediaweb Другой вариант — зарегистрировать ваш пользовательский тип записи (Custom Post Type) и пользовательскую таксономию (Custom Taxonomy), автоматически привязав их к одному меню. Затем вы сможете добавлять и настраивать административные страницы как подпункты меню вашего пользовательского типа записи. По сути, это обратная логика по сравнению с тем, что вы хотите сделать. Но это позволит правильно подсвечивать пункты подменю.

@numediaweb Я добавил исправление для правильного подсвечивания пунктов подменю вашего пользовательского типа записи и пользовательской таксономии в связке с вашей пользовательской родительской административной страницей/меню.

Вот как я реализовал это: Внутри действия admin_menu я добавил подменю к родительскому пункту меню ('nwcm'), установив параметр menu_slug в URL страницы редактирования таксономии.
add_submenu_page('nwcm', 'Категории новостей', 'Категории новостей', 'edit_posts', 'edit-tags.php?taxonomy=nwcm_news&post_type=nwcm_news',false );

Очень наглядно показано, что можно использовать переменную $menu_slug
для указания любого нужного места. Я зарегистрировался здесь только чтобы проголосовать за ваш ответ.

Отлично! Именно то, что я искал! Единственный недостаток — подменю не остается раскрытым, когда вы находитесь на этой странице. Для моего случая это не критично.

Этот вариант работает! Одно замечание: при регистрации таксономии вы обычно используете хук 'init', а для редактирования функции add_submenu_page следует использовать хук 'admin_menu' - что-то вроде add_action('admin_menu', function(){ add_submenu_page() } );

Существует фильтр parent_file, который можно использовать для исправления проблемы с раскрытием меню.
