Возможно ли добавить меню произвольного типа записи как подменю другого произвольного типа записи
В настоящее время я разрабатываю плагин WordPress, который использует два произвольных типа записей. Я хочу узнать: возможно ли добавить меню одного произвольного типа записи как подменю другого произвольного типа записи?
Да. При регистрации вашего типа записи необходимо установить параметр show_in_menu
для страницы, на которой вы хотите его отображать.
Добавление пользовательского типа записи в качестве подменю для "Записей"
Здесь мы устанавливаем тип записи "movies" для включения в подменю под "Записи".
register_post_type( 'movies',
array(
'labels' => array(
'name' => __( 'Фильмы' ),
'singular_name' => __( 'Фильм' )
),
'public' => true,
'has_archive' => true,
'show_in_menu' => 'edit.php'
)
);
Если у вас есть таксономия, зарегистрированная для пользовательского типа записи, её также нужно добавить на страницу.
В функции add_submenu_page()
первый аргумент — это страница, к которой нужно прикрепить подменю, а последний — ярлык меню.
add_action('admin_menu', 'my_admin_menu');
function my_admin_menu() {
add_submenu_page('edit.php', 'Жанры', 'Жанры', 'manage_options', 'edit-tags.php?taxonomy=genre');
}
Добавление пользовательского типа записи в качестве подменю другого пользовательского типа записи
Для добавления страниц к другому пользовательскому типу записи укажите параметр строки запроса типа записи вместе с именами страниц.
Чтобы добавить тип записи Movies и его таксономию Genre под тип записи Entertainment, измените код следующим образом.
edit.php
становится edit.php?post_type=entertainment
edit-tags.php
становится edit-tags.php?taxonomy=genre&post_type=entertainment
register_post_type( 'movies',
array(
'labels' => array(
'name' => __( 'Фильмы' ),
'singular_name' => __( 'Фильм' )
),
'public' => true,
'has_archive' => true,
'show_in_menu' => 'edit.php?post_type=entertainment'
)
);
add_action('admin_menu', 'my_admin_menu');
function my_admin_menu() {
add_submenu_page('edit.php?post_type=entertainment', 'Жанры', 'Жанры', 'manage_options', 'edit-tags.php?taxonomy=genre&post_type=entertainment');
}

Привет, спасибо! Я уже нашел способ сделать это! Но возможно твой вариант даст лучший результат!

Извините за повторение. Чтобы подсветка подменю и родительского меню работала корректно, нужно передать WordPress дополнительную информацию. Параметр 'show_in_menu' делает подменю активным/подсвеченным, когда на экране отображается 'my_post_type'. Теперь нам нужно добавить еще одно действие, которое подсветит родительское меню. Попробуйте это: add_filter( 'parent_file', 'menu_highlight' )); function menu_highlight( $parent_file ){ global $plugin_page, $post_type; if ('my_post_type' == $post_type) { $plugin_page = 'edit.php?post_type=my_post_type'; // название хука подменю } return $parent_file; }

Наш пользовательский тип записи:
$args['show_in_menu'] = false;
register_post_type('custom_plugin_post_type', $args);
Добавляем его к существующему пользовательскому типу записи (например, "product"):
$existing_CPT_menu = 'edit.php?post_type=product';
$link_our_new_CPT = 'edit.php?post_type=custom_plugin_post_type';
add_submenu_page($existign_CPT_menu, 'SubmenuTitle', 'SubmenuTitle', 'manage_options', $link_our_new_CPT);
Или добавляем в меню нашего плагина:
// Создаем меню плагина
add_menu_page('MyPlugin', 'MyPlugin', 'manage_options', 'myPluginSlug', 'callback_render_plugin_menu');
// Создаем подменю со ссылкой на просмотр custom_plugin_post_type
$link_our_new_CPT = 'edit.php?post_type=custom_plugin_post_type';
add_submenu_page('myPluginSlug', 'SubmenuTitle', 'SubmenuTitle', 'manage_options', $link_our_new_CPT);

Вот что сработало у меня
add_action('admin_menu', 'vrodos_plugin_menu');
function vrodos_plugin_menu(){
add_menu_page( 'Страница плагина VRodos',
'VRodos',
'manage_options',
'vrodos-plugin',
'vrodos_plugin_main_page');
add_submenu_page('vrodos-plugin',
'Игры',
'Игры',
'manage_options',
'edit.php?post_type=vrodos_game'
);
}
Когда я регистрирую пользовательский тип записи 'vrodos_game', я указываю
'show_ui' => true,
'show_in_menu' => false,
