WordPress管理员(将自定义帖子类型作为父菜单的子菜单时,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页面。
有什么帮助吗?
#1将自定义帖子类型放在现有父页面的子菜单中根据食品法典, 这是已知的和预期的行为:
注意:使用” 某些字符串” 显示为插件创建的菜单页面的子菜单时, 该项目将成为第一个子菜单项, 并替换顶级链接的位置。【WordPress管理员(将自定义帖子类型作为父菜单的子菜单时,CPT将覆盖父菜单链接)】来源: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时, 我将” show_in_menu” 参数设置为false, 因此我们可以通过add_submenu_page在菜单中手动添加它, 如上所示。
正确地将” 自定义帖子类型” 子菜单项设置为” 活动” 现在, 上述解决方案可以正常工作, 但是在创建/编辑” example_cpt” 自定义帖子类型的帖子时, 该帖子未设置为活动状态, 并且子菜单未展开。这是如何确保在创建/编辑” 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
请注意, “ 子菜单文本” 指向与” 示例父页面” 相同的位置。
#2你还可以简单地将自定义帖子类型args中的’ show_in_menu’ 设置为你要在add_menu_page()中设置的$ menu_slug, 你要将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.
}
然后使用将我们在settings_menu()函数中设置的” show_in_menu” arg设置为menu_slug来创建自定义帖子类型。
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', );
}
希望能帮助到你。
#3不能说, 究竟是什么原因, 但是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;
}
希望对你有效。
推荐阅读
- wordpress自定义背景主题支持
- WordPress CSS和JS版本号不起作用
- WordPress,以编程方式创建用户
- WordPress的连接被重置(错误101)
- WordPress子主题(覆盖函数)
- wordpress子主题(如何覆盖模板.php文件)
- 子目录中的WordPress子主题文件未覆盖
- WordPress子主题,添加辅助菜单
- WordPress(无法访问仪表板)