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