web-dev-qa-db-fra.com

wp_nav_menu ajoute quelque chose avant la fermeture du conteneur et après le dernier élément de la liste

J'ai cherché un moyen de coder en dur une balise <div> avant la balise de conteneur de fermeture d'un menu particulier:

$footer_nav = array(
    'menu'              => 'footer-menu',
    'menu_class'        => 'foobar',
    'container'         => 'ul',
    'theme_location'    => 'footer',
    'menu_id'           => 'footer_menu',
    'echo'              => true,
    'depth'             => 1,
);
wp_nav_menu( $footer_nav );

Cependant, lorsque j'essaie d'ajouter:

'after' => '<div class="foo">bar</div>',

il l'ajoute après chaque élément de la liste. Lorsque j'ai recherché une solution, j'ai rencontré Je veux supprimer en dernier après wp_nav_menu et Fonctions Wordpress - Comment utiliser Replace String func. ajouter du code mais quand j'essaye:

function foobar_the_menu($items,$args) {
    if ($args->theme_location == 'footer') {
        $footer_pattern     = '</li></ul>';
        $footer_replacement = '</li><div class="foo">bar</div></ul>';
        return substr_replace( $footer_pattern, $footer_replacement, $items, 1 );
    }
}
add_filter( 'wp_nav_menu', 'foobar_the_menu', 10, 2 );

Il supprime tous les menus. Après avoir référencé quelques autres questions, j'ai vu wp_nav_menu_items et preg_replace, mais je ne sais pas quelle est la bonne approche pour cibler un menu particulier afin de coder en dur un div, car vous ne pouvez pas le modifier dans le tableau de menus?

Je pense que vous pouvez utiliser:

'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s <div class="foo">bar</div> </ul>',

comme argument wp_nav_menu().

Nous utilisons cette partie de la fonction wp_nav_menu():

$nav_menu .= sprintf( 
    $args->items_wrap, 
    esc_attr( $wrap_id ), 
    esc_attr( $wrap_class ), 
    $items 
);

où l'argument items_wrap contient la sprintf spécificateurs :

  • %1$s pour correspondre à wrap id
  • %2$s pour correspondre à la classe wrap
  • %3$s pour correspondre au code HTML généré pour les items .
2
birgire