web-dev-qa-db-ja.com

ナビゲーションメニュー項目をメニュー内の特定の位置に追加する方法

次のコードを使用して、ナビゲーションメニューにログイン/ログアウトリンクを追加します。

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は文字列なので、リストへのリンクを簡単に追加または追加することしかできません。このリンクはリスト内の特定のメニュー項目の前に表示する必要があります。最後から3番目の項目になります。これを実現するために使用できる別のフィルタまたは方法はありますか?

strposを使って探しているナビゲーションアイテムを見つけ、$items文字列を操作しようとしましたが、メニューアイテムのHTMLと一致させることができませんでした。

1
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 );
1
jjeaton