WordPress管理员:将自定义帖子类型作为父菜单的子菜单放置时,CPT会覆盖父菜单链接

Com*_*ity 3 php wordpress wordpress-theming wordpress-plugin

我注册了自定义帖子类型,我不希望它有自己的菜单,而是我想把它作为现有管理菜单项的子菜单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',
    )
);
Run Code Online (Sandbox Code Playgroud)

它的工作原理,意味着它正确地位于菜单下my-custom-parent-page,但是现在当我点击父菜单(即my-custom-parent-page)它指向my_custom_post_type页面时......

有帮助吗?

Com*_*ity 7

将Custom-Post-Type放置在现有父页面的子菜单中

根据食典委的说法,这是一种已知的预期行为:

注意:当使用"some string"作为插件创建的菜单页面的子菜单时,此项目将成为第一个子菜单项,并替换顶级链接的位置.

来源: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');
}
Run Code Online (Sandbox Code Playgroud)

请注意优先级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;
}
Run Code Online (Sandbox Code Playgroud)

微调:重命名第一个子菜单条目

此外,我还希望我的子菜单的第一个菜单条目的名称与父名称不同.默认情况下,使用上面的代码,这就是我们所拥有的:

- Example Parent Page
-- Example Parent Page
-- Example CPT
Run Code Online (Sandbox Code Playgroud)

如您所见,子菜单的第一个菜单项是父菜单的副本,这是默认的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');

}
Run Code Online (Sandbox Code Playgroud)

请注意优先级11,因此在创建重命名.现在我们有:

- Example Parent Page
-- Submenu Text
-- Example CPT
Run Code Online (Sandbox Code Playgroud)

请注意,"子菜单文本"指向与"示例父页面"相同的位置.


mau*_*srx 5

您还可以简单地'show_in_menu'在自定义帖子类型参数中设置$menu_slugadd_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.
}
Run Code Online (Sandbox Code Playgroud)

然后创建自定义帖子类型,并将“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',
    );
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。