it-swarm.com.de

So fügen Sie Navigationsmenüelemente zu einer bestimmten Position in einem Menü hinzu

Ich füge einem Navigationsmenü Anmelde-/Abmeldelinks mit folgendem Code hinzu:

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

Da es sich bei $items um eine Zeichenfolge handelt, kann ich die Links zur Liste nur ganz einfach voranstellen oder anhängen. Ich brauche diesen Link, um vor einem bestimmten Menüpunkt in der Liste zu erscheinen, es wäre der dritte Punkt vom Ende. Gibt es einen anderen Filter oder eine andere Methode, um dies zu erreichen?

Ich habe versucht, mit strpos das gesuchte Navigationselement zu finden und die Zeichenfolge $items zu bearbeiten, konnte sie jedoch nicht mit dem Menüelement HTML in Übereinstimmung bringen.

1
jjeaton

Es hat sich herausgestellt, dass es einen wp_nav_menu_objects-Filter gibt, mit dem Sie das Array der Navigationsmenüelemente ändern können, bevor sie zu einer Zeichenfolge zusammengefügt werden. Mit der folgenden Funktion konnte ich das erreichen, was ich brauchte:

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