WordPress Admin: при размещении пользовательского типа сообщения в качестве подменю родительского меню ссылка родительского меню переопределяется CPT

Я регистрирую пользовательский тип сообщения, и я не хочу, чтобы у него было свое собственное меню, вместо этого я хочу поместить его в качестве подменю существующего элемента меню администратора, называемого my-custom-parent-page .

Вот мой код:

 register_post_type('my_custom_post_type', array( 'labels' => array( 'name' => __('Books', 'mcpt'), 'singular_name' => __('Book', 'mcpt'), ), 'supports' => array('title', 'editor'), 'show_ui' => true, 'show_in_nav_menus' => false, 'show_in_menu' => 'my-custom-parent-page', ) ); 

Он работает, что означает, что он правильно расположен в меню my-custom-parent-page , однако теперь, когда я нажимаю на родительское меню (то есть my-custom-parent-page ), он указывает мне на страницу my_custom_post_type

Любая помощь?

Поместите Custom-Post-Type в подменю существующей родительской страницы

Согласно Кодексу, это известное и ожидаемое поведение:

Примечание. При использовании «некоторой строки» для отображения в качестве подменю страницы меню, созданной плагином, этот элемент станет первым элементом подменю и заменит местоположение ссылки верхнего уровня .

Источник: https://codex.wordpress.org/Function_Reference/register_post_type#Arguments (см. Раздел «show_in_menu»)

Вот конец цитаты, которая предлагает решение:

Если это нежелательно, плагин, который создает страницу меню, должен установить приоритет add_action для admin_menu до 9 или ниже.

Так что это довольно просто решить. Однако в моем случае я не мог изменить приоритет родительской страницы, потому что она генерируется сторонней библиотекой. Поэтому я придумал это решение:

 // Move the "example_cpt" Custom-Post-Type to be a submenu of the "example_parent_page_id" admin page. add_action('admin_menu', 'fix_admin_menu_submenu', 11); function fix_admin_menu_submenu() { // Add "Example CPT" Custom-Post-Type as submenu of the "Example Parent Page" page add_submenu_page('example_parent_page_id', 'Example CPT', 'Example CPT', 'edit_pages' , 'edit.php?post_type=example_cpt'); } 

Обратите внимание на приоритет 11, а также при регистрации Custom-Post-Type I установите для параметра show_in_menu значение false , поэтому мы можем добавить его в меню вручную с помощью add_submenu_page как показано выше.


Правильно установите запись подменю Custom-Post-Type как «активная»,

Теперь это решение прекрасно работает, однако при создании / редактировании сообщения типа «example_cpt» Custom-Post-Type он не устанавливается как активный, и подменю не разворачивается. Вот как убедиться, что он установлен как активный, а также подменю, в котором он находится, правильно настроен как активный при создании / редактировании сообщения типа example_cpt Custom-Post-Type:

 // Set the "example_parent_page_id" submenu as active/current when creating/editing a "example_cpt" post add_filter('parent_file', 'fix_admin_parent_file'); function fix_admin_parent_file($parent_file){ global $submenu_file, $current_screen; // Set correct active/current menu and submenu in the WordPress Admin menu for the "example_cpt" Add-New/Edit/List if($current_screen->post_type == 'example_cpt') { $submenu_file = 'edit.php?post_type=example_cpt'; $parent_file = 'example_parent_page_id'; } return $parent_file; } 

Тонкая настройка: переименуйте первую запись подменю

Кроме того, я также хотел, чтобы первая запись в меню моего подменю называлась иначе, чем родительское имя. По умолчанию и используя приведенный выше код, это то, что у нас есть:

 - Example Parent Page -- Example Parent Page -- Example CPT 

Итак, как вы можете видеть, первая запись в меню подменю является дубликатом родительского меню, и это поведение WordPress по умолчанию. Я хотел переименовать эту повторяющуюся запись в нечто иное, как WordPress с меню по умолчанию (например, «Сообщения» и подменю «Все сообщения», которые указывают на одну и ту же страницу, но называются по-разному).

Вот как переименовать первую запись подменю:

 add_action('admin_menu', 'rename_first_submenu_entry', 11); function rename_first_submenu_entry() { // Rename first submenu entry (duplicate of parent menu) from "Example Parent Page" to "Submenu Text" add_submenu_page('example_parent_page_id', 'Example Parent Page', 'Submenu Text', 'edit_pages' , 'example_parent_page_id'); } 

Обратите внимание на приоритет 11, поэтому он будет переименован после его создания. И теперь у нас есть:

 - Example Parent Page -- Submenu Text -- Example CPT 

Обратите внимание: «Текст подменю» указывает на то же место, что и «Пример родительской страницы».

не могу сказать, в чем причина, но кажется, что wordpress перенаправляет на первый подменю.

Поэтому вам нужно создать новый элемент подменю с тем же содержимым вашего родительского меню.

 add_action('admin_menu', 'my_admin_menu'); function my_admin_menu() { global $submenu; add_menu_page('My Menu', 'My Menu', 'administrator', 'my-menu', 'callback_func'); $parent = array('My Menu', 'administrator', 'my-menu', 'My Menu'); // new submenu-itm $submenu['my-menu'] = fix_menu($submenu['my-menu'], $parent); // adds the new submenu-item at beginning of 'my-menu'-item } function fix_menu($submenu) { array_unshift ($submenu, $parent); return $submenu; } 

Надеюсь, это сработает для вас.

Вы также можете просто установить 'show_in_menu' в пользовательских типах сообщений типа $menu_slug которые вы установили в add_menu_page() которые вы хотите установить CPT в качестве подменю и установить приоритет функции admin_menu равным 9 или ниже. Например:

Во-первых, создайте новую страницу меню верхнего уровня, с приоритетом, установленным в 9 или ниже (это обязательно):

 add_action( 'admin_menu', 'settings_menu' ), 9 ); function settings_menu() { add_menu_page( __( 'Page Title' ), 'Menu Title', 'manage_options', 'menu_slug', show_page_callback() ); } function show_page_callback() { // show the settings page, plugin homepage, etc. } 

Затем создайте собственный тип сообщения с параметром 'show_in_menu', установленным в menu_slug который мы просто установили в функции settings_menu() .

 add_action( 'init', 'create_post_type' ); function create_post_type() { register_post_type('my_custom_post_type', array( 'labels' => array( 'name' => __('Books', 'mcpt'), 'singular_name' => __('Book', 'mcpt'), ), 'supports' => array('title', 'editor'), 'public' => true, 'show_in_menu' => 'menu_slug', ); } 

Надеюсь, поможет.