如何将导航菜单项添加到菜单中的特定位置

时间:2013-11-07 作者:jjeaton

我使用以下代码将登录/注销链接添加到导航菜单:

function rp_add_login_logout_links( $items, $args ) {

    $link = wp_loginout( get_permalink( get_option( \'woocommerce_myaccount_page_id\' ) ), false );

    if ( \'Shop Menu\' == $args->menu ) {
        $items .= \'<li id="menu-item-login" class="menu-item menu-item-login">\' . $link . \'</li>\';
    }

    return $items;
}
add_filter( \'wp_nav_menu_items\', \'rp_add_login_logout_links\', 10, 2 );
$items 是一个字符串,我只能很容易地将链接前置或附加到列表中。我需要这个链接出现在列表中某个菜单项之前,它最终将成为从最后开始的第三个菜单项。是否有其他过滤器或方法可用于完成此任务?

我试过使用strpos 找到我要找的导航项目并操纵$items 字符串,但无法使其与菜单项HTML匹配。

1 个回复
SO网友:jjeaton

结果发现有一个wp_nav_menu_objects 过滤器,允许您在将导航菜单项加入字符串之前修改它们的数组。我能够使用以下功能完成我需要的任务:

function wpse121517_add_shop_menu_links( $items, $args ) {

    if ( \'Shop Menu\' !== $args->menu )
        return $items;

    // Where to redirect after logging in or out
    $redirect = get_permalink( get_option( \'woocommerce_myaccount_page_id\' ) );

    $new_links = array();

    if ( is_user_logged_in() ) {
        $label = \'Logout\';
        $link = wp_logout_url( $redirect );

        // Create a nav_menu_item object to hold our link
        // for My Account, only if user is logged-in
        $item = array(
            \'title\'            => \'Account\',
            \'menu_item_parent\' => 0,
            \'ID\'               => \'my-account\',
            \'db_id\'            => \'\',
            \'url\'              => get_permalink( get_option( \'woocommerce_myaccount_page_id\' ) ),
            \'classes\'          => array( \'menu-item\' )
        );

        $new_links[] = (object) $item;  // Add the new menu item to our array
        unset( $item );
    } else {
        $label = \'Login\';
        $link = wp_login_url( $redirect );
    }

    // Create a nav_menu_item object to hold our link
    // for login/out
    $item = array(
        \'title\'            => $label,
        \'menu_item_parent\' => 0,
        \'ID\'               => \'loginout\',
        \'db_id\'            => \'\',
        \'url\'              => $link,
        \'classes\'          => array( \'menu-item\' )
    );

    $new_links[] = (object) $item; // Add the new menu item to our array
    $index = count( $items ) - 2;  // Insert before the last two items

    // Insert the new links at the appropriate place.
    array_splice( $items, $index, 0, $new_links );

    return $items;
}
add_filter( \'wp_nav_menu_objects\', \'wpse121517_add_shop_menu_links\', 10, 2 );

结束

相关推荐

private functions in plugins

我开发了两个插件,其中一个功能相同(相同的名称,相同的功能)。当试图激活两个插件时,Wordpress会抛出一个错误,因为它不允许我以相同的名称定义函数两次。有没有一种方法可以使这个函数只对插件私有,而不使用面向对象编程,也不简单地重命名函数?我不想使用OOP,因为我首先要学习它。此外,我不想重命名该函数,因为我可能也想在其他插件中使用它,而重命名感觉不太合适。