커스텀 워커 : start_lvl 함수에서 ID를 얻는 방법


15

아코디언 메뉴를 만드는 최초의 맞춤형 워커를 만들고 있습니다. 우선이 예제를 사용했습니다 : http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

두 가지 기능이 있습니다. 먼저 start_lvl 다음 start_el.

start_el에서 ID는 $ item-> ID로 구현됩니다. 아무도 내가 start_lvl에서 어떻게 할 수 있는지 알고 있습니까? 아코디언 메뉴에서 축소되도록 트리거 할 수 있도록 (낮은 수준의 내비게이션 둘러보기) ID를 제공해야합니다.

내가 생성하려고하는 것은 다음과 같습니다.

<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

방금 테마 중 하나 에서이 작업을 수행해야했습니다 ... Walker의 해당 단계에서 $ item 변수에 액세스 할 수 없으므로 현재 항목을보다 글로벌 범위로 저장하고 싶습니다 그것에 액세스 할 수 있습니다. 다음 코드가 더 의미가 있습니다 ... 참고 : 관련 코드를 제외한 모든 것을 제거했습니다.

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
이것은이 스레드에서 가장 우아한 솔루션입니다. 고마워 레인!
Kevin C.

1
실제로 잘 작동하는 매우 깨끗한 접근 방식입니다. 많은 감사합니다.
Isaac Gregson

1
확실하지는 않지만 전체 기본 코드를 start_el에 추가해야 작동합니까?
GDY

4
이제 부모 :: start_el ($ output, $ item, $ depth, $ 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 ."'>";

페이지 ID는 사용하지 않지만, 자바 스크립트에서 참조 할 수있는 UL 문의 고유 ID를 사용합니다.

BTW-모바일 앱용 부트 스트랩을 사용하여 루트 테마에서 중첩 된 아코디언 또는 클릭 가능한 중첩 드롭 다운에 실제로 유용합니다.


2

start_el함수 에서 다음 필터를 사용하고 함수에서 인수를 가져올 수 있습니다 start_lvl.

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

작동하는지 알려주세요.


게시 해 주셔서 감사합니다! 나는 앞으로 며칠 안에 문제를 해결할 시간을 찾기를 희망하지만 지금은 공부에 바쁘다. 결과와 함께 다시 연락 드리겠습니다!
Robert Bouten

0

커스텀 워커의 인수에 $ 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 ()를 호출하기 전에 사용자 정의 워커 클래스를 추가하십시오.

$MyWalker = new My_Custom_Walker();

그런 다음 wp_list_pages의 인수에서 다음을 수행하십시오.

wp_list_pages ( 'walker'=> $ MyWalker)

보행기의 출력이 빨간색인지 확인하십시오.


그것은 함수 start_el에 있지만 start_lvl에서는 분명히 다른 변수를 넣을 수 없기 때문에 분명히 다릅니다. 또는 적어도 같은 순서는 아닙니다.
Robert Bouten

start_lvl로 무엇을하려고합니까?
AlxVallejo

<ul>에 생성 된 페이지 ID가 102 인 id = "collapse102"를 제공하려고합니다. 이렇게하면 아코디언 메뉴에서 축소되도록 트리거 할 수 있습니다.
Robert Bouten

id = "collapse"를 추가해도 작동하지만 pageID를 추가해도 작동하지 않습니다.
Robert Bouten

특정 ID 만 축소하고 싶습니까? wp_list_pages에 대한 아코디언 트리가 있으며 start_lvl을 전혀 변경할 필요가 없습니다.
AlxVallejo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.