J'ajoute des liens de connexion/déconnexion à un menu de navigation à l'aide du code suivant:
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 );
Puisque $items
est une chaîne, je ne peux vraiment que facilement ajouter ou ajouter des liens à la liste. J'ai besoin que ce lien apparaisse avant un certain élément de menu dans la liste, ce serait le troisième élément à partir de la fin. Existe-t-il un autre filtre ou une autre méthode que je pourrais utiliser pour accomplir cela?
J'ai essayé d'utiliser strpos
pour trouver l'élément de navigation que je cherchais et manipuler la chaîne $items
mais je ne pouvais pas le faire correspondre à l'élément de menu HTML.
En fait, il existe un filtre wp_nav_menu_objects
qui vous permet de modifier le tableau des éléments de menu de navigation avant qu'ils ne soient joints à une chaîne. J'ai été capable d'accomplir ce dont j'avais besoin en utilisant la fonction suivante:
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 );