¿Cómo le paso un argumento a mi caminante personalizado?

3

He configurado un caminante personalizado, y funciona como se desea cuando codifico mi variable.

Lo que quiero es poder llamar a mi caminante y pasarle una variable que se usa en el caminante.

Por ejemplo:

 'walker'          => new Plus_walker($refine => 'review'), 

El caminante que he ajustado para mostrar enlace con el fin de encontrar publicaciones en la categoría de revisión para este elemento del menú. Pero quiero poder usar el mismo andador para "avances", "entrevistas" y más. Hasta ahora, mis intentos de ingresar variables simplemente han roto todo, 'Error de análisis: error de sintaxis, T_DOUBLE_ARROW inesperado'.

Sé que podría simplemente reescribir el código y crear diferentes caminantes (Review_walker, Preview_walker, etc.), pero esto simplemente parece incorrecto (y creo que esto podría ser una cosa importante de saber ...)

Mi código de walker está aquí:

class plus_walker extends Walker_Nav_Menu {

    var $refine;

        function __construct($refine) {

            $this->refine = $refine;
        }


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

           $class_names = $value = '';

           $classes = empty( $item->classes ) ? array() : (array) $item->classes;

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

           $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

           $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
           $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
           $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
           $attributes .= ! empty( $item->url )       ? ' href="'   . esc_attr( $item->url     )  . '' : ''; //This is where I want the argument to live.

    $modded_url = substr($attributes,0,-1) . '+' . $refine . '"';

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

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

Y la llamada php en mis plantillas:

<?php wp_nav_menu( array(
                            'menu' => 'Handheld', 
                                'container'       => 'div', 
                                'container_class' => 'col_1', 
                                //'container_id'    => ,
                                'menu_class'      => 'menu', 
                                //  'menu_id'         => ,
                                'echo'            => true,
                                'fallback_cb'     => 'wp_page_menu',

                                'items_wrap'      => '<ul id="%1$s" class="%2$s">%3$s</ul>',
                                'depth'           => 0,
                                'walker'          => new Plus_walker(array($refine => 'review')), 


        )

        ); ?>

He probado un montón de configuraciones diferentes: 'refine' = > 'revisa, con y sin la matriz, pero aún sin alegría, solo errores (inesperado' = > 'en su mayoría).

    
pregunta josh 16.10.2011 - 12:41

3 respuestas

4

El walker nativo se activa con el método walk() y no está configurado para recibir datos en el momento de la creación. Puede definir la propiedad personalizada y el método del constructor para este propósito:

class plus_walker extends Walker_Nav_Menu {

    var $refine;

    function __construct($refine) {

        $this->refine = $refine;
    }

}

//stuff

'walker' => new plus_walker('review');

Después de esto, puedes acceder a tus datos personalizados como $this->refine en los métodos de walker.

    
respondido por el Rarst 16.10.2011 - 23:31
5

Otra forma implica agregar un argumento personalizado a la función wp_nav_menu() . Esto es útil si necesita pasar un valor desde fuera de la clase walker:

wp_nav_menu( array( 
    'theme_location' => 'secondary',
    'depth' => 1,
    'walker' => new Custom_Walker(),
    'walker_arg' => 'Custom argument value here'
) );

Desde dentro de la clase walker, puede acceder a este argumento personalizado desde la función start_el() dentro de la clase walker ( Walker_Nav_Menu::start_el() ) de esta manera:

$custom_arg = esc_attr( $args->walker_arg );

Esperemos que esto ayude, que ayude con algunos escenarios poco claros que he encontrado, que la recomendación anterior de Rarst no puede manejar bien.

    
respondido por el Kevin Leary 26.09.2012 - 17:40
1

Simplemente puede obtener el argumento personalizado con una función start_el() ligeramente modificada.

En primer lugar, llame al elemento wp_nav_menu (o cualquier otra función de uso de walker) con los argumentos especificados en la respuesta de Kevin Leary.

En la función start_el en su caminante personalizado, puede acceder a sus datos simplemente a través de $args['walker_arg'] ; observe que walker_arg puede modificarse para adaptarse a sus necesidades.

Además, con esta y en parte con la solución de Kevin Leary, ¡puede pasar más de un argumento personalizado al caminante!

    
respondido por el Jannis 26.06.2013 - 11:51

Lea otras preguntas en las etiquetas