我注册了自定义帖子类型,我不希望它有自己的菜单,而是希望将其作为现有管理菜单项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
页面。 。
任何帮助?
答案 0 :(得分:7)
根据食典委的说法,这是一种已知的预期行为:
注意:使用'某些字符串'要显示为插件创建的菜单页面的子菜单,此项目将成为第一个子菜单项,并替换顶级链接的位置。
来源:https://codex.wordpress.org/Function_Reference/register_post_type#Arguments(参见" show_in_menu"部分)
这是报价的结尾,它提供了一个解决方案:
如果不需要,创建菜单页面的插件需要将admin_menu的add_action优先级设置为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
手动将其添加到菜单中,如上所示。
现在,上面的解决方案工作正常,但是在创建/编辑" example_cpt" Custom-Post-Type,未设置为活动且子菜单未展开。以下是如何确保将其设置为活动状态,以及在创建/编辑" example_cpt"的帖子时将其所在的子菜单正确设置为活动状态。定制后类型:
// 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
请注意"子菜单文字"指向与#34;示例父页面相同的位置"。
答案 1 :(得分:1)
您也可以将自定义帖子类型参数中的'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”arg设置为我们在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',
);
}
希望它有所帮助。
答案 2 :(得分:0)
不能说,究竟是什么原因,但似乎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;
}
希望它适合你。