如何将顶级菜单指向二级菜单并使顶级菜单具有唯一名称?

时间:2013-10-07 05:44:00

标签: php wordpress menu admin submenu

目标

在Wordpress中,我试图让 Admin Menus 自动创建,如果它们位于“外观 - >菜单”中的菜单中。这个,我能够发展。

我遇到麻烦的部分是由于它的特殊性。我正在尝试将顶级菜单直接指向二级菜单并让顶级菜单保持其原始名称。

代码

在“外观 - >菜单”中设置

Callsigns
    -> Alpha
    -> Bravo
    -> Charlie

顶级菜单“Callsigns”已修改选项。 导航标签是“Alpha”,标题属性是“Callsigns”。

functions.php

add_action('init', 'register_my_menus' );
function register_my_menus() {
    register_nav_menus( array('admin-menus' => 'Admin Menus'));
}

add_action('admin_menu', 'my_admin_menus');
function my_admin_menus() {
    $locations = get_nav_menu_locations();
    $menu = wp_get_nav_menu_object($locations['admin-menus']);
    $pages = wp_get_nav_menu_items($menu->term_id);

    foreach ($pages as $page) {
        if ($page->menu_item_parent == 0)
            add_menu_page(
                $page->title,
                $page->attr_title ? $page->attr_title : $page->title,
                'read',
                sanitize_title($page->title),
                'admin_page_format'
            );
        else
            add_submenu_page(
                sanitize_title($page->menu_item_parent->title),        // ISSUE
                $page->title,
                $page->attr_title ? $page->attr_title : $page->title,
                'read',
                sanitize_title($page->title),
                'admin_page_format'
            );
    }
}

我标记的行是我相当自信的问题。最初,我没有尝试使用“ - >”到目前为止,我相信不可能使用“ - >”像我上面那样连续两次。

不正确的解决方案

sanitize_title($page->menu_item_parent->title)

顶级菜单有效。它具有正确的名称并指向正确的第二级菜单。但是,二级菜单根本不会显示为管理菜单。

sanitize_title(get_the_title($page->menu_item_parent))

与上述错误解决方案相同的结果。

1 个答案:

答案 0 :(得分:0)

functions.php

add_action('init', 'register_my_menus' );
function register_my_menus() {
    register_nav_menus( array('admin-menus' => 'Admin Menus'));
}

add_action('admin_menu', 'my_admin_menus');
function my_admin_menus() {
    $locations = get_nav_menu_locations();
    $menu = wp_get_nav_menu_object($locations['admin-menus']);
    $pages = wp_get_nav_menu_items($menu->term_id);

    function get_menu_page($pages, $id) {
        foreach ($pages as $page)
            if ($page->ID == $id) return $page;
    }

    foreach ($pages as $page) {
        if ($page->menu_item_parent == 0)
            add_menu_page(
                $page->title,
                $page->attr_title ? $page->attr_title : $page->title,
                'read',
                sanitize_title($page->title),
                'admin_page_format'
            );
        else
            add_submenu_page(
                sanitize_title(get_menu_page($pages, $page->menu_item_parent)->title),
                $page->title,
                $page->attr_title ? $page->attr_title : $page->title,
                'read',
                sanitize_title($page->title),
                'admin_page_format'
            );
    }
}

解决方案是创建一个再次进入菜单循环的函数来返回页面对象。

我怀疑这是最干净的方式,但这是我唯一能想到的。