Пользовательский Уокер: как получить идентификатор в функции start_lvl

Я создаю свой первый пользовательский ходок для создания меню аккордеона. Для начала я использовал этот пример: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

Есть две функции. Сначала start_lvl, а затем start_el.

В start_el ID get реализуется с помощью $ item-> ID. Кто-нибудь знает, как я могу это сделать в start_lvl? Мне нужно дать (окружающий навигацию нижнего уровня) идентификатор, чтобы я мог заставить его свернуть в меню аккордеона.

То, что я пытаюсь создать, выглядит примерно так:

<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> 

Мой код для функции 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"; } 

Я просто должен был сделать это в одной из моих тем … Поскольку у вас нет доступа к переменной $ item на этом этапе Walker, вы хотели бы сохранить ваш текущий элемент в более глобальной области на тот момент, когда вы иметь доступ к нему. Следующий код будет иметь больше смысла … примечание: я раздели все, кроме соответствующего кода.

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

У меня была аналогичная проблема, и я решил ее, используя статическую переменную внутри класса:

 static protected $menu_lvl; 

А затем в «display_element» я увеличил переменную:

 self::$menu_lvl++; 

В моем коде я тогда ссылался в функции start_lvl примерно так:

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

Это не использует идентификатор страницы, но использует уникальный идентификатор для операторов UL, на которые может ссылаться javascript.

BTW – это действительно полезно для вложенных аккордеонов или кликабельных вложенных выпадающих списков в теме Roots, используя Bootstrap для мобильных приложений.

Вы можете использовать следующий фильтр в своей функции start_el и start_el ваш аргумент в функции start_lvl .

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

Пожалуйста, дайте мне знать, если это сработает.

Вы можете просто добавить $ page к аргументу пользовательского ходока:

 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>'; 

Попробуйте выше, а затем перед вызовом wp_list_pages () добавьте пользовательский класс walker:

 $MyWalker = new My_Custom_Walker(); 

Затем в аргументах для wp_list_pages:

wp_list_pages ('walker' => $ MyWalker)

Проверьте и проверьте, красный ли выход выходного сигнала.