web-dev-qa-db-fra.com

start_lvl ignoré dans Custom walker_nav_menu

Ceci est mon premier projet impliquant WordPress et je suis coincé en essayant de créer un marcheur personnalisé pour un menu de pied de page.

Je veux fondamentalement changer le menu de la structure <ul> <li></li> </ul> à une structure <p> <span></span> </p>.

Le menu et le contenu affichent le fichier et j'ai été capable d'ajuster les fonctions start_el et end_el sans problème, alors j'ai maintenant ceci:

<ul> <span>*link*</span> <span>*link*</span> </ul>

Ce qui est évidemment à mi-chemin, j'ai écrit les balises start_lvl() et end_lvl() comme indiqué ci-dessous mais elles sont ignorées par WordPress - rien de ce que je mets dedans (même die()) n'est exécuté (ce qui est un peu suspect) mais je sais que la classe est en cours appelé à cause de la fonction start_el().

function start_lvl(&$output, $depth = 0, $args = array()) {
    $output = "\n<p class=\"sub-menu\">\n";
}

function end_lvl(&$output, $depth = 0, $args = array()) {
    $output .= "\n</p>\n";
}

Est-ce que quelqu'un sait pourquoi cela se produit - ai-je oublié quelque chose de vraiment évident!?

J'utilise la dernière version de WordPress sur Apache avec PHP 5.3.6 si cela peut vous aider.

Merci d'avance,

Félix :)

8
fenfe1

Votre classe my_extended_walker est OK, mais lorsque vous appelez la fonction wp_nav_menu , utilisez le paramètre items_wrap .

wp_nav_menu( array( 'items_wrap' => '<p>%3$s</p>', 'walker'=>new my_extended_walker() ) );

Start_lvl est utilisé pour les éléments children.

8
stillatmylinux

Ok, je ne sais pas ce que j'ai mal lu quand j'ai posté ça, mais toute votre classe devrait ressembler à ceci:

class my_extended_walker extends Walker_Nav_Menu {
    function start_lvl(&$output, $depth = 0, $args = array()) {
        $output .= "\n<p class=\"sub-menu\">\n";
    }

    function end_lvl(&$output, $depth = 0, $args = array()) {
        $output .= "\n</p>\n";
    }
}

Et passez ensuite le 'walker' en paramètre lorsque vous appelez wp_nav_menu

wp_nav_menu( array( 'walker'=>new my_extended_walker() ) );

Si vous avez ça, ça devrait aller. Je regarde le code de travail qui fait exactement cela. Je ne sais pas comment y mettre des balises <p>. Vous pouvez obtenir un balisage invalide.

3
s_ha_dum

Avez-vous pensé à récupérer tous les éléments du menu de navigation à l'aide de la fonction intégrée: wp_get_nav_menu_items(); et à en extraire manuellement le contenu?

Exemple :: Construction d'une liste de menus simples

    // Get the nav menu based on $menu_name (same as 'theme_location' or 'menu' arg to wp_nav_menu)
    // This code based on wp_nav_menu's code to get Menu ID from menu slug

    $menu_name = 'custom_menu_slug';

    if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );

    $menu_items = wp_get_nav_menu_items($menu->term_id);

    $menu_list = '<ul id="menu-' . $menu_name . '">';

    foreach ( (array) $menu_items as $key => $menu_item ) {
        $title = $menu_item->title;
        $url = $menu_item->url;
        $menu_list .= '<li><a href="' . $url . '">' . $title . '</a></li>';
    }
    $menu_list .= '</ul>';
    } else {
    $menu_list = '<ul><li>Menu "' . $menu_name . '" not defined.</li></ul>';
    }
    // $menu_list now ready to output
2
Michael Ecklund