Supporto » Aspetto = Temi » custom wp_nav_menu

  • Risolto francesco5383

    (@francesco5383)


    Salve,

    Sto lavorando ad un semplice tema, in particolare, per quanto riguarda il menu di navigazione mi sono attenuto alle istruzione del Codex https://developer.wordpress.org/reference/functions/wp_nav_menu/ . Non mi serve niente di troppo particolare, vorrei solo evitare che il menu sia organizzato in <ul> e <li>. Per ottenere questo risultato, inizialmente, ho provato così:

    $menu=wp_nav_menu(array(
        'container'       => div,
        'echo'            => false,
        'items_wrap'      => '%3$s',
        'before'          => '<span>',
        'after'           => '</span> | ',
        'depth'           => 0,
       )
    );
    
    $menu=strip_tags($menu, '<div><span><a>' );
    
    echo $menu;

    per qualche motivo, però, gli <span> non vengono inseriti fuori dagli <a> come riportato nel Codex, anzi… non vengono inseriti affatto! Invece i parametri link_before e link_after funzionano come previsto, ma io voglio inserire del testo fuori dagli <a> e non al loro interno. Data la situazione ho usate le maniere spicce:

    $menu=wp_nav_menu(array(
        'container'       => div,
        'echo'            => false,
        'items_wrap'      => '%3$s',
        'depth'           => 0,
       )
    );
    
    $orig=array('<a','</a>');
    $sost=array('<span><a', '</a></span> | ');
    
    $menu=str_replace($orig, $sost, $menu);
    $menu=strip_tags($menu, '<div><span><a>' );
    
    echo $menu;

    ok, funziona come voglio, ma mi sembra un metodo molto brute force, c’è una soluzione più elegante? Se possibile, eviterei di estendere la classe walker_nav_menu.

    • Questo topic è stato modificato 7 anni, 5 mesi fa da francesco5383.
    • Questo topic è stato modificato 7 anni, 5 mesi fa da francesco5383.
Stai visualizzando 1 risposte (di 1 totali)
  • Salve,

    in realtà usare Walker_Nav_Menu è molto più semplice ed elegante di quanto possa sembrare oltre che essere potenzialmente compatibile con eventuali modifiche future. Modificare l’output direttamente di una funzione invece non è sempre garantito ne ottimizzato.

    class My_Walker_Nav_Menu extends Walker_Nav_Menu {
            // personalizza il tag che sostuisce il tag li
    	function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
    		if (array_search('menu-item-has-children', $item->classes)) {
    			$output .= sprintf("\n<span class='dropdown %s'><a href='%s' class=\"dropdown-toggle\" data-toggle=\"dropdown\" >%s</a>\n", ( array_search('current-menu-item', $item->classes) || array_search('current-page-parent', $item->classes) ) ? 'active' : '', $item->url, $item->title
    			);
    		} else {
    			$output .= sprintf("\n<span %s><a href='%s'>%s</a>\n", ( array_search('current-menu-item', $item->classes) ) ? '' : '', $item->url, $item->title
    			);
    		}
    	}
            // personalizza il tag che sostuisce il tag ul
    	function start_lvl(&$output, $depth) {
    		$indent = str_repeat("\t", $depth);
    		$output .= "\n$indent<div class=\"dropdown-menu\" role=\"menu\">\n";
    	}
    }

    Lo richiami con

    $defaults = array(
            'theme_location'  => 'primary',
            'container'       => 'div',
            'menu_class'      => 'nav navbar-nav main-nav',
            'walker'          => new My_Walker_Nav_Menu()
    );
    
    wp_nav_menu( $defaults );

    Saluti,
    Diego

Stai visualizzando 1 risposte (di 1 totali)
  • Il topic ‘custom wp_nav_menu’ è chiuso a nuove risposte.