start_lvl ignoré dans walker_nav_menu personnalisé

8

C'est mon premier projet impliquant WordPress et je suis coincé à essayer de créer un marcheur personnalisé pour un menu de pied de page.

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

Le menu et les trucs affichent un fichier et j'ai pu ajuster les fonctions start_elet end_elsans problème, donc j'obtiens 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 que je mets dedans (même die()) n'est exécuté (ce qui est un peu suspect) mais je sais que la classe est appelée à cause de la start_el()fonction.

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 raté quelque chose de vraiment évident!?

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

Merci d'avance,

Felix :)

fenfe1
la source
1
Sur la base de ce que vous avez montré, tout ce qui est évident semble correct.
totels

Réponses:

8

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 enfants.

stillatmylinux
la source
2
Start_lvl est utilisé pour les éléments enfants. vous venez de sauver beaucoup de choses dans ma vie
ashutosh
3

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' comme paramètre lorsque vous appelez wp_nav_menu

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

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

s_ha_dum
la source
Salut, oui, je l'ai fait ci-dessous est la classe complète,
fenfe1
classe BB_Nav_Footer_Walker étend Walker_Nav_Menu {fonction start_lvl (& $ output, $ depth = 0, $ args = array ()) {$ output = "\ n <p class = \" sub-menu \ "> \ n"; } fonction end_lvl (& $ output, $ depth = 0, $ args = array ()) {$ output. = "\ n </p> \ n"; }}
fenfe1
J'ai essayé d'utiliser <div>au lieu de <p>simplement voir si je peux obtenir ces fonctions pour faire quoi que ce soit, mais jusqu'à présent, pas de joie :(
fenfe1
Le <div>et <p>ne doit pas casser le Walker mais peut entraîner un balisage invalide. Vous avez $output =et non $output .=dans votre start_lvl. Cela pourrait causer des problèmes. Est-ce le Walker complet que vous avez publié?
s_ha_dum
Salut ouais j'ai corrigé le .=bit c'est maintenant la classe complète (j'ai supprimé les fonctions start_lvl()et end_lvl()pour voir si elles ont fait une différence) - pastebin.com/zfcBxHd8
fenfe1
2

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 à sortir manuellement le contenu?

Exemple :: Création d'une liste de menus simple

    // 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
Michael Ecklund
la source