Спеціальний ходок: як отримати ідентифікатор у функції start_lvl


15

Я роблю свій перший нестандартний ходунок, щоб створити меню на гармошках. Для початку я використав цей приклад: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

Є дві функції. Спочатку start_lvl, а потім start_el.

У start_el ідентифікатор отримує $ 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";
}

Відповіді:


38

Мені просто довелося це зробити в одній із моїх тем ... Оскільки ви не маєте доступу до змінної $ 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;
  }

 }

3
Це найелегантніше рішення, представлене в цій темі. Дякую Лейн!
Кевін К.

1
Дійсно, дуже чистий підхід, який працює добре. Дуже дякую.
Ісаак Грегсон

1
Я не впевнений, але чи потрібно додати весь код за замовчуванням до start_el, щоб він працював?
GDY

4
Гаразд, ви можете просто використовувати parent :: start_el ($ output, $ item, $ глибина, $ args, $ id); у start_el ...
GDY

Блискучий, мав на увазі розібратися у віках, і це спрацювало відразу. Дякую.
cfx

3

У мене була подібна проблема і вирішено її, використовуючи статичну змінну всередині класу:

static protected $menu_lvl; 

А потім у "display_element" я збільшив змінну:

self::$menu_lvl++;

Потім у своєму коді я посилався на функцію start_lvl приблизно так:

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

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

BTW - Це дійсно просто корисно для вкладених акордеонів або натискання вкладених спадів у темі Roots за допомогою Bootstrap для мобільних додатків.


2

Ви можете використовувати наступний фільтр у своїй start_elфункції та обмацувати аргумент у start_lvlфункції.

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

Будь ласка, дайте мені знати, чи працює вона.


Дякуємо за публікацію! Я сподіваюся, що знайду деякий час, щоб це відпрацювати в найближчі кілька днів, але я справді зайнятий своїм дослідженням саме зараз. Я з вами повернуся з результатом!
Роберт Бутен

0

Ви можете просто додати сторінку $ до аргументу користувальницької ходунки:

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 (), додайте спеціальний клас ходу:

$MyWalker = new My_Custom_Walker();

Потім в аргументах для wp_list_pages:

wp_list_pages ('walker' => $ MyWalker)

Перевірте і перевірте, чи вихід ходунка червоний.


Це є у функції start_el, але він, мабуть, відрізняється від start_lvl, тому що я не можу помістити туди ж змінні. Або принаймні не той самий порядок.
Роберт Бутен

Що ви намагаєтеся зробити з start_lvl?
AlxVallejo

Я намагаюся надати <ul> id = "колапс102" із 102 згенерованим ідентифікатором сторінки. Таким чином я можу викликати його згортання в моєму гармошковому меню.
Роберт Бутен

Додавання id = "краху" працює, але я не можу змусити його також працювати, щоб додати сторінкуID.
Роберт Бутен

Ви маєте на увазі, що ви хочете згортати лише конкретні ідентифікатори? У мене є дерево акордеона для wp_list_pages, і мені зовсім не потрібно змінювати start_lvl.
AlxVallejo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.