可以通过wp_NAV_MENU_ITEMS向子菜单添加动态链接吗?

时间:2019-05-02 作者:Menus

我有以下内容,它成功地插入了一个动态链接,作为指定菜单的最后一个顶级菜单项:

add_filter( \'wp_nav_menu_items\', \'example_last_nav_item\', 10, 2 );

function example_last_nav_item( $items, $args ) {
    if ( $args - > theme_location == \'account-menu\' && is_user_logged_in() ) {
        $current_user = wp_get_current_user();
        $items .= \'<li class="menu-item profile-link"><a href="https://example.com/profile/\' . strtolower( str_replace( \' \', \'-\', $current_user - > user_login ) ) . \'/">Profile</a></li>\';
    }
    return $items;
}
但是,如何访问此菜单的子菜单,并将链接作为子菜单的第一项插入?

帐户菜单顶层

-DYNAMIC LINK HERE

-子菜单项#2

-子菜单项#3

2 个回复
最合适的回答,由SO网友:nmr 整理而成

下面的代码将遍历所有项目并搜索第一个具有父项的项目。如果找到,具有相同父项的新项将作为“第一个子项”插入。

add_filter( \'wp_nav_menu_objects\', \'se336857_dynamic_submenuitem\', 20, 2 );
function se336857_dynamic_submenuitem( $items, $args )
{
    if ( !is_user_logged_in() || $args->theme_location != \'account-menu\' )
        return $items;

    $parent = false;
    $current_user = wp_get_current_user();
    $url = \'/profile/\' . strtolower(str_replace( \' \', \'-\', $current_user->user_login ));

    $item_profile = [
        \'title\' => __(\'Profile\'),
        \'url\'   => home_url( $url ),
        \'classes\' => \'menu-item profile-link\',
    ];
    $item_profile = (object)$item_profile;
    $item_profile = new WP_Post($item_profile);
    $i = -1;
    foreach ( $items as $item )
    {
        ++$i;
        if ( $item->menu_item_parent == 0 )
            continue;
        //
        // first submenu item
        $item_profile->menu_item_parent = $item->menu_item_parent;
        $new_items = [ $item_profile ];
        array_splice($items, $i, 0, $new_items );
        break;
    }
    return $items;
}

SO网友:anton

我建议您使用wp_nav_menu_objects 钩子,它允许您将菜单项作为对象而不是字符串来使用。在if语句中,可以创建任意数量的项

add_filter( \'wp_nav_menu_objects\', \'example_last_nav_item\', 10, 2 );

function example_last_nav_item( $items, $args ){

    if ( $args->theme_location==\'account-menu\' && is_user_logged_in() ){

        //parent menu item
        $parent_item = array(
            \'title\'            => __(\'Profile\'),
            \'menu_item_parent\' => 0, //PARENT ELEMENT HAS 0
            \'ID\'               => \'profile\',
            \'db_id\'            => 9999, //MAKE SURE IT\'s UNIQUE ID
            \'url\'              => \'http://google.com\',
            \'classes\'          => array( \'custom-menu-item\' )
        );

        //submenu menu item
        $submenu_item = array(
            \'title\'            => __(\'Submenu first element\'),
            \'menu_item_parent\' => 9999, //FOR SUBMENU ITEM SET PARENT\'s db_id
            \'ID\'               => \'submenu-item\',
            \'db_id\'            => 99992,
            \'url\'              => \'http://google.com\',
            \'classes\'          => array( \'custom-menu-item\' )
        );

        $items[] = (object) $parent_item;
        $items[] = (object) $submenu_item;
    }

    return $items;

}
关于您可以阅读的所有项目属性here

相关推荐

Add extra markup to WP menus

我被要求将一个HTML网站重新开发为一个WP主题,它有一个非常高级的菜单结构,我不太确定如何复制它。第二个菜单项有一个子菜单,但它不仅仅是“li”中的“ul”,还有额外的div等。。因为下拉列表有3列布局,其中2列包含子链接,第3列包含内容。这是一个示例:<ul class=\"nav navbar-nav three\"> <li class=\"dropdown yamm-fw\"> <a href=\"#\" class=\"dropdown-toggl