0

目标

在 Wordpress 中,如果管理员菜单位于“外观 - > 菜单”的菜单中,我试图让它们自动创建。这一点,我得以发展。

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

代码

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

Callsigns
    -> Alpha
    -> Bravo
    -> Charlie

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

函数.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))

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

4

1 回答 1

0

函数.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'
            );
    }
}

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

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

于 2013-10-08T01:23:08.810 回答