Personalizando Walker_Nav_Menu

2

Estoy buscando una solución para ajustar la salida de wp_nav_menu solo en un menú de navegación específico. Tengo mi menú:

wp_nav_menu(
    array(
        "container"         => "nav",
        "container_class"   => "container",
        "container_id"      => "nav",
        "fallback_cb"       => false,
        "menu_class"        => "six columns omega main-nav sf-menu",
        "theme_location"    => "main-nav"
    )
);

El problema

Necesito encontrar una forma de insertar <span>[number]</span> dentro del elemento de anclaje. [number] representa el número del elemento que comienza en 1 . Aquí hay un visual:

Laestructuradelmenúsería:

<liclass="...">
    <a href="#"><span>01.</span>Home</a>
</li>
<li class="...">
    <a href="#"><span>02.</span>Services</a>
</li>
<li class="...">
    <a href="#"><span>03.</span>Portfolio</a>
</li>

Actualmente, estoy usando un hack jQuery. Esto funciona, pero no hay garantía de que el usuario pueda simplemente deshabilitar JavaScript. He mirado:

Tengo una idea de que es necesario extender la clase walker, pero mi confusión final reside en crear los enlaces manualmente y insertar información dinámica antes de se imprime el texto del enlace. La pregunta de desbordamiento de pila lo hace pero no explica cómo llegar allí.

Addendum

Para obtener el resultado exacto que quería, vea pastebin . $item->title necesitaba ser modificado para seguir la estructura HTML como se indica arriba.

    
pregunta djthoms 04.10.2013 - 04:01

1 respuesta

6

Solo necesita crear su propia clase de caminante y extender el método start_el . Este método crea el enlace a y podrás agregar tu span antes de que:

class Wpse8170_Menu_Walker extends Walker_Nav_Menu {

    var $number = 1;

    function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value = '';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = 'menu-item-' . $item->ID;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
        $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';

        $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
        $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';

        $output .= $indent . '<li' . $id . $value . $class_names .'>';

        // add span with number here
        if ( $depth == 0 ) { // remove if statement if depth check is not required
            $output .= sprintf( '<span>%02s.</span>', $this->number++ );
        }

        $atts = array();
        $atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';
        $atts['target'] = ! empty( $item->target )     ? $item->target     : '';
        $atts['rel']    = ! empty( $item->xfn )        ? $item->xfn        : '';
        $atts['href']   = ! empty( $item->url )        ? $item->url        : '';

        $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args );

        $attributes = '';
        foreach ( $atts as $attr => $value ) {
            if ( ! empty( $value ) ) {
                $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
                $attributes .= ' ' . $attr . '="' . $value . '"';
            }
        }

        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }

}

Después, podrás usar esta clase en tu llamada a la función wp_nav_menu :

wp_nav_menu(
    array(
        "container"         => "nav",
        "container_class"   => "container",
        "container_id"      => "nav",
        "fallback_cb"       => false,
        "menu_class"        => "six columns omega main-nav sf-menu",
        "theme_location"    => "main-nav",
        "walker"            => 'Wpse8170_Menu_Walker',
    )
);
    
respondido por el Eugene Manuilov 04.10.2013 - 08:28

Lea otras preguntas en las etiquetas