start_lvl Ignorado en walker_nav_menu personalizado

8

Este es mi primer proyecto con WordPress y me he quedado atascado intentando crear un andador personalizado para un menú de pie de página.

Básicamente quiero cambiar el menú de la <ul> <li></li> </ul>estructura a una <p> <span></span> </p>estructura.

El menú y otras cosas muestran el archivo y he podido ajustar las funciones start_ely end_elsin problemas, así que ahora obtengo esto:

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

Lo que obviamente está a mitad de camino, he escrito las etiquetas start_lvl()y end_lvl()como se muestra a continuación, pero WordPress las ignora: no die()se ejecuta nada (incluso ) (lo cual es un poco sospechoso) pero sé que se está llamando a la clase debido a La start_el()función.

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";
}

¿Alguien sabe por qué sucede esto? ¿Me he perdido algo realmente obvio?

Estoy ejecutando la última versión de WordPress en Apache con PHP 5.3.6si me ayuda.

Gracias por adelantado,

Felix :)

fenfe1
fuente
1
Según lo que has mostrado, todo lo obvio parece correcto.
totels
Referencia cruzada wordpress.org/support/topic/…
Ian Dunn

Respuestas:

8

Su clase my_extended_walker está bien, pero cuando llame a la función wp_nav_menu use el parámetro items_wrap .

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

Start_lvl se usa para elementos secundarios.

Stillatmylinux
fuente
2
Start_lvl se usa para elementos secundarios. acabas de salvar muchas cosas en mi vida
ashutosh
3

Ok, no estoy seguro de lo que leí mal cuando publiqué esto, pero toda su clase debería ser algo como esto:

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";
    }
}

Y luego pase el 'caminante' como parámetro cuando llame wp_nav_menu

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

Si tienes eso, deberías estar bien. Estoy mirando el código de trabajo que hace exactamente eso. Sin <p>embargo , no sé si poner etiquetas allí. Puede obtener un marcado no válido.

s_ha_dum
fuente
Hola, sí, lo he hecho a continuación es la clase completa,
fenfe1
la clase BB_Nav_Footer_Walker extiende 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"; }}
fenfe1
He intentado usar en <div>lugar de <p>solo para ver si puedo hacer que esas funciones hagan algo, pero hasta ahora no me alegro :(
fenfe1
El <div>y <p>no debería romper el Walker, pero podría provocar un marcado no válido. Tienes $output =y no $output .=en tu start_lvl. Eso podría estar causando problemas. ¿Es ese el Walker completo que publicaste?
s_ha_dum
Hola, sí, arreglé el .=bit que ahora es la clase completa ( start_lvl()end_lvl()
eliminé
2

¿Ha pensado en buscar todos los elementos del menú de navegación utilizando la función incorporada: wp_get_nav_menu_items();y generar manualmente el contenido?

Ejemplo :: Crear una lista de menú 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
fuente