web-dev-qa-db-fra.com

L'argument de profondeur `start_el` dans le navigateur de navigation personnalisé est toujours égal à zéro

J'ai un programme de navigation personnalisé que j'essaie d'utiliser pour afficher uniquement le premier niveau d'un menu:

<?php wp_nav_menu( array(
    'theme_location' => 'secondary-menu',
    'depth' => 1,
    'walker' => new SecondaryNavWalker
) ); ?>

Cependant, tous les niveaux de navigation sont générés indépendamment. J'ai essayé de vérifier l'argument dans start_el, mais l'argument depth transmis est toujours zéro, même lorsque la page a un parent. Qu'est-ce que je rate?

Voici le programme de navigation personnalisé:

class SecondaryNavWalker extends Walker_Nav_Menu
{
    function start_el(&$output, $item, $depth, $args)
    {
        //var_dump($item);
        //var_dump('Args');
        //var_dump($args);

        //var_dump('depth comp');
        //var_dump($depth);
        //var_dump($args['depth']);

        if (get_post_meta( $item->ID, 'saltIsInMainNav', true ) || $depth > $args['depth']) {
            return;
        }

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

        $class_names = join(
            ' '
            ,   apply_filters(
                'nav_menu_css_class'
                ,   array_filter( $classes ), $item
            )
        );

        ! empty ( $class_names )
        and $class_names = ' class="'. esc_attr( $class_names ) . '"';

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

        $attributes  = '';

        ! empty( $item->post_title )
        and $attributes .= ' title="'  . esc_attr( $item->post_title ) .'"';
        ! empty( $item->guid )
        and $attributes .= ' href="' . esc_url( site_url('/?p='.$item->ID) ) .'"';

        $title = apply_filters( 'the_title', $item->post_title, $item->ID );

        $item_output = $args->before
            . "<a $attributes>"
            . $args->link_before
            . "$title"
            . $args->link_after
            . '</a> '
            . $args->after;

        // Since $output is called by reference we don't need to return anything.
        $output .= apply_filters(
            'walker_nav_menu_start_el'
            ,   $item_output
            ,   $item
            ,   $depth
            ,   $args
        );
    }
}

Une fois commentées, ces profondeurs var_dumps affichent ceci:

string(10) "depth comp" int(0) int(1) 
string(10) "depth comp" int(0) int(1) 
string(10) "depth comp" int(0) int(1) 
string(10) "depth comp" int(0) int(1) 
string(10) "depth comp" int(0) int(1) 
string(10) "depth comp" int(0) int(1) 
string(10) "depth comp" int(0) int(1) 
string(10) "depth comp" int(0) int(1) 
string(10) "depth comp" int(0) int(1) 
string(10) "depth comp" int(0) int(1) 
string(10) "depth comp" int(0) int(1) 
string(10) "depth comp" int(0) int(1)

EDIT: @Howdy_McGee dans la salle de discussion m'a envoyé ce code pour jouer avec lequel il a utilisé avec succès l'argument de profondeur dans la méthode start_el. Ce code ne fonctionne pas pour moi car de nombreux attributs référencés (-> classes, -> attr_title, -> cible, -> xfn, -> url) ne sont pas inclus dans les objets WP_Post que je reçois. Comment cela pourrait-il être?

EDIT 2: Voici la transcription de la conversation que j'ai eue avec @Howdy_McGee dans laquelle nous réduisons le problème et ne trouvons pas de solution.

2
Nathan Arthur

Vous transmettez un argument - 'depth' => 1,-- - qui oblige le promeneur à ne tirer que la première couche du menu afin que votre profondeur ait toujours la même valeur. Vous lui avez dit de ne mettre qu'un niveau.

1
s_ha_dum