我注册了一个自定义帖子类型,我不希望它有自己的菜单,而是想将它作为一个名为 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 页面...
有什么帮助吗?
最佳答案
根据 Codex,这是已知的预期行为:
Note: When using 'some string' to show as a submenu of a menu page created by a plugin, this item will become the first submenu item, and replace the location of the top level link.
来源:https://codex.wordpress.org/Function_Reference/register_post_type#Arguments (参见“show_in_menu”部分)
这是提供解决方案的报价的结尾:
If this isn't desired, the plugin that creates the menu page needs to set the add_action priority for admin_menu to 9 or lower.
所以这很容易解决。但是在我的例子中,我无法更改父页面的优先级,因为它是由第三方库生成的。因此我想出了这个解决方案:
// 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
请注意,“子菜单文本”指向与“示例父页面”相同的位置。
关于php - WordPress Admin : When placing a Custom Post Type as a submenu of a parent menu, 父菜单链接被 CPT 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21927445/