web-dev-qa-db-fra.com

Comment insérer par programme un nouvel élément de menu?

Je développe un plugin et je veux insérer des éléments de menu par programme.

Lorsque mon thème crée un menu, il utilise cet appel:

wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) );

Ce qui a abouti à quelque chose comme ceci dans le code HTML:

<div class="nav-menu"><ul>
     <li class="current_page_item"><a href="somewhere">menu-item-1</a></li>
     <li class="page_item page-item-107"><a href="somewhere-else">menu item 2</a></li>
</ul></div>

Je veux pouvoir l'intercepter d'une certaine manière et insérer mon propre code HTML par programme avant le </ul> final. Comment puis-je le brancher?

6
agro1986

Avant d'être imprimés, tous les éléments de menu sont exécutés à travers un filtre. Vous pouvez cibler le filtre wp_nav_menu_items pour ajouter des éléments au menu:

// Filter wp_nav_menu() to add additional links and other output
function new_nav_menu_items($items) {
    $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
    // add the home link to the end of the menu
    $items = $items . $homelink;
    return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items' );

Ou, pour être plus précis, vous pouvez cibler uniquement le menu souhaité en remplaçant la ligne add_filter en haut par la suivante, et en remplaçant $menu->slug par le nom réel du slug de votre menu:

add_filter( 'wp_nav_menu_{$menu->slug}_items', 'new_nav_menu_items' );

Tutoriel source

12
helgatheviking

Vous pouvez définir container sur false et utiliser l'argument items_wrap pour omettre la ul. La fonction ne produira que les balises li, vous permettant ainsi de l'envelopper comme bon vous semble.

wp_nav_menu(
    array(
        'theme_location' => 'primary',
        'items_wrap' => '%3$s',
        'container' => false
    )
);
0
Milo