Je fais mon premier walker personnalisé pour construire un menu en 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'identifiant get est implémenté par $ item-> ID. Est-ce que quelqu'un sait comment je peux faire cela dans start_lvl également? Je dois donner un identifiant à la navigation (niveau inférieur environnant) pour que je puisse le déclencher pour qu'il s'effondre dans le menu accordéon.
Ce que j'essaie de générer ressemble à 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";
}
Il me suffisait de faire cela dans l’un de mes thèmes ... Puisque vous n’avez pas accès à la variable $ item à ce stade du Walker, vous voudrez peut-être stocker votre article actuel dans un champ plus global. y avoir accès. Le code suivant aura plus de sens ... Remarque: j'ai tout dépouillé 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;
}
}
J'ai eu un problème similaire et je l'ai résolu en utilisant une variable statique dans la classe:
static protected $menu_lvl;
Et puis dans l'élément "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 un identifiant unique pour les instructions UL pouvant être référencées par javascript.
BTW - Ceci est vraiment utile pour les accordéons imbriqués ou les menus déroulants imbriqués cliquables dans le thème Roots utilisant Bootstrap pour les applications mobiles.
Vous pouvez utiliser le filtre suivant dans votre fonction start_el
et grub votre argument dans la fonction start_lvl
.
apply_filters( 'walker_nav_menu_start_lvl', $item_output, $item, $depth, $args->myarg=$item->title );
S'il vous plaît laissez-moi savoir si cela fonctionne.
Vous pouvez simplement ajouter $ page à l'argument du walker 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 de promeneur 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.