将自定义文章类型放置在现有父页面的子菜单中
根据Codex文档,这是已知且预期的行为:
注意:当使用“某个字符串”作为插件创建的菜单页的子菜单时,此项将成为第一个子菜单项,并替换顶级链接的位置。
来源:https://codex.wordpress.org/Function_Reference/register_post_type#Arguments (请参阅“show_in_menu”部分)
以下是引用结束提供解决方案的内容:
如果不希望出现这种情况,则创建菜单页面的插件需要将admin_menu的add_action优先级设置为9或更低。
因此,这很容易解决。但是在我的情况下,我无法更改父页面的优先级,因为它是由第三方库生成的。因此,我想出了以下解决方案:
add_action('admin_menu', 'fix_admin_menu_submenu', 11);
function fix_admin_menu_submenu() {
add_submenu_page('example_parent_page_id', 'Example CPT', 'Example CPT', 'edit_pages' , 'edit.php?post_type=example_cpt');
}
请注意优先级为11,并且在注册自定义文章类型时,我将“show_in_menu”参数设置为false,因此我们可以按照上面所示,通过“add_submenu_page”手动将其添加到菜单中。
将自定义文章类型子菜单条目正确设置为“active”
现在,上述解决方案运行良好,但是当创建/编辑“example_cpt”自定义文章类型的文章时,它不会被设置为活动状态,子菜单也不会展开。以下是确保它被设置为活动状态以及在创建/编辑“example_cpt”自定义文章类型的文章时将其所在的子菜单正确设置为活动状态的方法:
add_filter('parent_file', 'fix_admin_parent_file');
function fix_admin_parent_file($parent_file){
global $submenu_file, $current_screen;
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
正如您所看到的,子菜单的第一个菜单项是父级菜单的副本,这是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
请注意,“子菜单文本”指向与“示例父页面”相同的位置。