Walker personnalisé: comment obtenir l'ID dans la fonction start_lvl


14

Je fais mon premier déambulateur personnalisé pour créer un menu accordéon. Pour commencer, j'ai utilisé cet exemple: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

Il y a deux fonctions. Commencez par start_lvl puis start_el.

Dans start_el, l'ID est implémenté par $ item-> ID. Est-ce que quelqu'un sait aussi comment je peux faire ça dans start_lvl? Je dois donner à (la navigation de niveau inférieur environnant) un identifiant afin que je puisse le déclencher pour s'effondrer dans le menu accordéon.

Ce que j'essaye de générer est quelque chose comme ceci:

<a href="#collapse2">Titel 2</a>
<ul id="collapse2">Lower Level Menu 2</ul>
<a href="#collapse3">Titel 3</a>
<ul id="collapse3">Lower Level Menu  3</ul>

Mon code pour la fonction start_lvl:

// add id's and classes to ul sub-menus
function start_lvl( &$output, $depth, $item ) {
    // depth dependent classes
    $indent = ( $depth > 0  ? str_repeat( "\t", $depth ) : '' ); // code indent
    $display_depth = ( $depth + 1); // because it counts the first submenu as 0
    $pgid = ; // How to get ID in here??
    $classes = array(
        'sub-menu',
        ( $display_depth == 1  ? 'accordion-body collapse' : '' ),
        ( $display_depth % 2  ? 'menu-odd' : 'menu-even' ),
        ( $display_depth >=2 ? 'sub-sub-menu' : '' ),
        'menu-depth-' . $display_depth
        );
    $ids = array(
        'collapse' . $pgid
        );
    $class_names = implode( ' ', $classes );
    $id_name = implode( ' ', $ids );

    // build html
    $output .= "\n" . $indent . '<ul id="' . $id_name . '" class="' . $class_names . '">' . "\n";
}

Réponses:


37

Je devais juste le faire dans l'un de mes thèmes ... Puisque vous n'avez pas accès à la variable $ item à ce stade du Walker, vous voudriez stocker votre article actuel dans une portée plus globale au moment où vous y ont accès. Le code suivant aura plus de sens ... note: J'ai tout supprimé sauf le code correspondant.

class ThemeTruck_Nav_Walker extends Walker_Nav_Menu {
   private $curItem;

  // retrieve the curItem
  function start_lvl(&$output, $depth = 0, $args = array()) {
    var_dump($this->curItem );
  }

  // store the curItem
  function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
    $this->curItem = $item;
  }

 }

3
C'est la solution la plus élégante présentée dans ce fil. Merci Lane!
Kevin C.

1
En effet une approche très propre qui fonctionne bien. Merci beaucoup.
Isaac Gregson

1
Je ne suis pas sûr mais dois-je ajouter tout le code par défaut à start_el pour le faire fonctionner?
GDY

4
Ok vous pouvez simplement utiliser parent :: start_el ($ output, $ item, $ depth, $ args, $ id); dans le start_el ...
GDY

Brillant, cela voulait dire depuis des siècles et cela a fonctionné tout de suite. Je vous remercie.
cfx

3

J'ai eu un problème similaire et l'ai résolu en utilisant une variable statique à l'intérieur de la classe:

static protected $menu_lvl; 

Et puis dans le "display_element" j'ai incrémenté la variable:

self::$menu_lvl++;

Dans mon code, j'ai ensuite référencé dans la fonction start_lvl quelque chose comme ceci:

$output .= "<ul id='level". self::$menu_lvl ."'>";

Cela n'utilise pas l'ID de page, mais il utilise un ID unique pour les instructions UL qui peuvent être référencées par le javascript.

BTW - C'est vraiment juste utile pour les accordéons imbriqués ou les listes déroulantes imbriquées cliquables dans le thème Roots à l'aide de Bootstrap pour les applications mobiles.


2

Vous pouvez utiliser le filtre suivant dans votre start_elfonction et supprimer votre argument dans la start_lvlfonction.

apply_filters( 'walker_nav_menu_start_lvl', $item_output, $item, $depth, $args->myarg=$item->title );

Veuillez me faire savoir si cela fonctionne.


Merci d'avoir posté! J'espère trouver du temps pour travailler dans les prochains jours, mais je suis vraiment occupé avec mon étude en ce moment. Je reviendrai vers vous avec le résultat!
Robert Bouten

0

Vous pouvez simplement ajouter $ page à l'argument du marcheur personnalisé:

class My_Custom_Walker extends Walker_page {
    function start_el(&$output, $page, $depth, $args, $current_page) {
        if ( $depth )
            $indent = str_repeat("\t", $depth);
        else
            $indent = '';

        extract($args, EXTR_SKIP);

        $output .= $indent . 
            '<li>
            <a style="color:red" href="' . get_page_link($page->ID) . '" title="' . 
            esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '">' . 
            $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';

Essayez ce qui précède, puis avant d'appeler wp_list_pages (), ajoutez la classe walker personnalisée:

$MyWalker = new My_Custom_Walker();

Ensuite, dans les arguments de wp_list_pages:

wp_list_pages ('walker' => $ MyWalker)

Vérifiez et voyez si la sortie du déambulateur est rouge.


C'est dans la fonction start_el, mais c'est apparemment différent dans start_lvl parce que je ne peux pas y mettre les mêmes variables. Ou du moins pas le même ordre.
Robert Bouten

Qu'essayez-vous de faire avec start_lvl?
AlxVallejo

J'essaie de donner au <ul> un id = "collapse102" avec 102 l'ID de page généré. De cette façon, je peux le déclencher pour le réduire dans mon menu accordéon.
Robert Bouten

L'ajout de l'id = "collapse" fonctionne, mais je ne peux pas le faire fonctionner pour ajouter également l'ID de page.
Robert Bouten

Voulez-vous dire que vous souhaitez que seuls des ID spécifiques soient réduits? J'ai un arbre d'accordéon pour wp_list_pages et je n'ai pas du tout besoin de modifier start_lvl.
AlxVallejo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.