WordPress管理界面:将自定义文章类型作为父菜单的子菜单时,父菜单链接被自定义文章类型覆盖。

6
我注册了一个自定义文章类型,但我不想让它有自己的菜单,相反我想把它放在现有的名为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页面……

需要帮助吗?

3个回答

14

将自定义文章类型放置在现有父页面的子菜单中

根据Codex文档,这是已知且预期的行为:

注意:当使用“某个字符串”作为插件创建的菜单页的子菜单时,此项将成为第一个子菜单项,并替换顶级链接的位置

来源: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,并且在注册自定义文章类型时,我将“show_in_menu”参数设置为false,因此我们可以按照上面所示,通过“add_submenu_page”手动将其添加到菜单中。

将自定义文章类型子菜单条目正确设置为“active”

现在,上述解决方案运行良好,但是当创建/编辑“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
请注意,“子菜单文本”指向与“示例父页面”相同的位置。

5

您还可以在自定义文章类型参数中简单设置'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.
}

然后,创建自定义文章类型,并将 'show_in_menu' 参数设置为我们刚刚在 settings_menu() 函数中设置的 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',
    );
}

希望这能有所帮助。

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;
}

希望它对你有用。

感谢您的回答!我没有测试过,但是看着代码,它可能有效。但是我选择了另一种方法,并在单独的答案中详细说明了它。我还包括了一个链接到WordPress Codex,描述了这个问题/行为,并提供了解决方案。再次感谢您分享您的解决方案!;) - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接