web-dev-qa-db-fra.com

Comment passer une dispute à mon marcheur personnalisé?

J'ai mis en place un programme personnalisé, et cela fonctionne comme souhaité lorsque je code dur ma variable.

Ce que je veux, c'est pouvoir appeler mon marcheur et lui transmettre une variable utilisée dans le marcheur.

Par exemple:

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

Le lecteur que j'ai modifié pour afficher http: // URL/review afin de rechercher les publications dans la catégorie de révision de cet élément de menu. Mais je veux pouvoir utiliser le même marcheur pour des "previews", des "interviews" et plus encore. Jusqu'ici, mes tentatives de saisie de variables venaient de rompre le tout, "Erreur d'analyse: erreur de syntaxe, T_DOUBLE_ARROW inattendu".

Je sais que je pourrais simplement réécrire le code et créer quelques lecteurs différents (Review_walker, Preview_walker, etc.), mais cela semble tout simplement faux (et je pense que cela pourrait être une chose importante à savoir ...)

Mon code de marcheur est ici:

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

Et l'appel php dans mes templates:

<?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')), 


        )

        ); ?>

J'ai essayé différentes configurations: 'refine' => 'review, avec et sans le tableau, mais toujours pas de joie, juste des erreurs (inattendues' => 'pour la plupart).

3
josh

Les marcheurs natifs sont déclenchés avec la méthode walk() et ne sont pas configurés pour recevoir des données lors de la création. Vous pouvez définir une propriété personnalisée et une méthode constructeur à cette fin:

class plus_walker extends Walker_Nav_Menu {

    var $refine;

    function __construct($refine) {

        $this->refine = $refine;
    }

}

//stuff

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

Ensuite, vous pouvez accéder à vos données personnalisées en tant que $this->refine dans les méthodes de Walker.

4
Rarst

Une autre façon consiste à ajouter un argument personnalisé à la fonction wp_nav_menu(). C'est pratique si vous devez passer une valeur en dehors de la classe de promeneur:

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

À partir de la classe walker, vous pouvez ensuite accéder à cet argument personnalisé à partir de la fonction start_el() à l'intérieur de la classe walker (Walker_Nav_Menu::start_el()), comme suit:

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

Espérons que cela aide, cela aide avec quelques obscurs scénarios que j'ai rencontrés que la recommandation de Rarst ci-dessus peut ne pas bien gérer.

5
Kevin Leary

Vous pouvez simplement obtenir l'argument personnalisé avec une fonction start_el() légèrement modifiée.

Tout d’abord, appelez l’élément wp_nav_menu (ou tout autre marcheur utilisant une fonction) avec les arguments spécifiés dans la réponse de Kevin Leary.

Dans la fonction start_el de votre lecteur personnalisé, vous pouvez accéder à vos données simplement via $args['walker_arg']; remarquez que walker_arg peut être modifié pour répondre à vos besoins.

De plus, avec cela et en partie avec la solution de Kevin Leary, vous pouvez transmettre plus d'un argument personnalisé au marcheur!

1
Jannis