Custom Walker: cách lấy ID trong hàm start_lvl


14

Tôi đang thực hiện walker tùy chỉnh đầu tiên của mình để xây dựng một menu accordion. Để bắt đầu, tôi đã sử dụng ví dụ này: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-theme

Có hai chức năng. Đầu tiên start_lvl và sau đó start_el.

Trong start_el, ID được triển khai bởi $ item-> ID. Có ai biết làm thế nào tôi có thể làm điều này trong start_lvl không? Tôi cần cung cấp cho một (điều hướng cấp thấp hơn xung quanh) một ID để tôi có thể kích hoạt nó để thu gọn trong menu accordion.

Những gì tôi đang cố gắng tạo ra là một cái gì đó như thế này:

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

Mã của tôi cho hàm 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";
}

Câu trả lời:


37

Tôi chỉ phải thực hiện điều này trong một trong các chủ đề của mình ... Vì bạn không có quyền truy cập vào biến $ item ở giai đoạn đó của Walker, bạn sẽ muốn lưu trữ mục hiện tại của mình trong phạm vi toàn cầu hơn tại thời điểm bạn có quyền truy cập vào nó. Đoạn mã sau sẽ có ý nghĩa hơn ... lưu ý: Tôi đã tước mọi thứ trừ mã có liên quan.

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
Đây là giải pháp thanh lịch nhất được trình bày trong chủ đề này. Cảm ơn ngõ!
Kevin C.

1
Quả thực là một cách tiếp cận rất sạch sẽ hoạt động tốt. Cảm ơn nhiều.
Isaac Gregson

1
Tôi không chắc chắn nhưng tôi có phải thêm toàn bộ mã mặc định vào start_el để làm cho nó hoạt động không?
GDY

4
Ok, bạn chỉ có thể sử dụng Parent :: start_el ($ output, $ item, $ height, $ args, $ id); trong start_el ...
GDY

Rực rỡ, có ý nghĩa để tìm ra điều này từ lâu và điều này đã làm việc ngay lập tức. Cảm ơn bạn.
cfx

3

Tôi đã có một vấn đề tương tự và giải quyết nó bằng cách sử dụng một biến tĩnh bên trong lớp:

static protected $menu_lvl; 

Và sau đó trong "display_element", tôi đã tăng biến:

self::$menu_lvl++;

Trong mã của tôi, sau đó tôi đã tham chiếu trong hàm start_lvl giống như thế này:

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

Điều này không sử dụng ID trang, nhưng nó sử dụng một ID duy nhất cho các câu lệnh UL có thể được tham chiếu bởi javascript.

BTW - Điều này thực sự hữu ích cho các hiệp ước lồng nhau hoặc thả xuống lồng nhau có thể nhấp trong Chủ đề gốc bằng cách sử dụng Bootstrap cho các ứng dụng di động.


2

Bạn có thể sử dụng bộ lọc sau trong start_elhàm của mình và ghi lại đối số trong start_lvlhàm.

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

Xin vui lòng cho tôi biết nếu nó hoạt động.


Cảm ơn vì đăng! Tôi hy vọng sẽ tìm thấy một chút thời gian để giải quyết nó trong vài ngày tới nhưng tôi thực sự bận rộn với việc học của mình. Tôi sẽ lấy lại cho bạn với kết quả!
Robert Bouten

0

Bạn chỉ có thể thêm trang $ vào đối số của walker tùy chỉnh:

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

Hãy thử ở trên và trước khi bạn gọi wp_list_pages (), thêm lớp walker tùy chỉnh:

$MyWalker = new My_Custom_Walker();

Sau đó, trong các đối số cho wp_list_pages:

wp_list_pages ('walker' => $ MyWalker)

Kiểm tra và xem đầu ra của walker có màu đỏ không.


Đó là trong hàm start_el, nhưng rõ ràng nó khác với start_lvl vì tôi không thể đặt cùng một biến trong đó. Hoặc ít nhất là không cùng thứ tự.
Robert Bouten

Bạn đang cố gắng làm gì với start_lvl?
AlxVallejo

Tôi đang cố gắng cung cấp cho <ul> id = "sụp đổ" với 102 ID trang được tạo. Bằng cách này tôi có thể kích hoạt nó để thu gọn nó trong menu accordion của mình.
Robert Bouten

Thêm id = "thu gọn" hoạt động, nhưng tôi cũng không thể làm cho nó hoạt động để thêm pageID.
Robert Bouten

Bạn có nghĩa là bạn chỉ muốn ID cụ thể được thu gọn? Tôi có một cây accordion cho wp_list_pages và tôi không cần phải thay đổi start_lvl.
AlxVallejo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.