start_lvl Bỏ qua trong walker_nav_menu tùy chỉnh


8

Đây là dự án đầu tiên của tôi liên quan đến WordPress và tôi đã gặp khó khăn khi cố gắng tạo một walker tùy chỉnh cho menu chân trang.

Về cơ bản tôi muốn thay đổi menu từ <ul> <li></li> </ul>cấu trúc sang <p> <span></span> </p>cấu trúc.

Menu và công cụ đang hiển thị tập tin và tôi đã có thể điều chỉnh các chức năng start_elend_elchức năng mà không gặp sự cố vì vậy bây giờ tôi nhận được điều này:

<ul> <span>*link*</span> <span>*link*</span> </ul>

Rõ ràng là cách đó một nửa, tôi đã viết start_lvl()end_lvl()các thẻ như hình bên dưới nhưng chúng bị WordPress bỏ qua - không có gì tôi đưa vào (thậm chí die()) được thực thi (điều này hơi đáng ngờ) nhưng tôi biết rằng lớp đang được gọi vì các start_el()chức năng.

function start_lvl(&$output, $depth = 0, $args = array()) {
    $output = "\n<p class=\"sub-menu\">\n";
}

function end_lvl(&$output, $depth = 0, $args = array()) {
    $output .= "\n</p>\n";
}

Có ai biết tại sao điều này xảy ra không - tôi đã bỏ lỡ điều gì đó thực sự rõ ràng!?

Tôi đang chạy phiên bản WordPress mới nhất trên Apache với PHP 5.3.6nếu nó giúp.

Cảm ơn trước,

Felix :)


1
Dựa trên những gì bạn đã thể hiện tất cả những thứ rõ ràng có vẻ chính xác.
totels

Câu trả lời:


8

Lớp my_extends_walker của bạn là OK, nhưng khi bạn gọi hàm wp_nav_menu, hãy sử dụng tham số items_wrap .

wp_nav_menu( array( 'items_wrap' => '<p>%3$s</p>', 'walker'=>new my_extended_walker() ) );

Start_lvl được sử dụng cho các phần tử con.


2
Start_lvl được sử dụng cho các phần tử con. bạn vừa cứu được rất nhiều thứ trong cuộc đời tôi
ashutosh

3

Ok, không chắc những gì tôi đọc sai khi tôi đăng bài này, nhưng cả lớp của bạn nên là một cái gì đó như thế này:

class my_extended_walker extends Walker_Nav_Menu {
    function start_lvl(&$output, $depth = 0, $args = array()) {
        $output .= "\n<p class=\"sub-menu\">\n";
    }

    function end_lvl(&$output, $depth = 0, $args = array()) {
        $output .= "\n</p>\n";
    }
}

Và sau đó vượt qua 'walker' làm tham số khi bạn gọi wp_nav_menu

wp_nav_menu( array( 'walker'=>new my_extended_walker() ) );

Nếu bạn đã có rằng bạn sẽ ổn. Tôi đang xem mã làm việc mà chỉ cần điều đó. Tôi không biết về việc đặt <p>các thẻ trong đó mặc dù. Bạn có thể nhận được đánh dấu không hợp lệ.


Xin chào, vâng tôi đã thực hiện bên dưới là lớp đầy đủ,
fenfe1

class BB_Nav_Footer_Walker mở rộng Walker_Nav_Mothy {function start_lvl (& $ output, $ height = 0, $ args = mảng ()) {$ output = "\ n <p class = \" menu phụ \ "> \ n"; } hàm end_lvl (& $ output, $ height = 0, $ args = mảng ()) {$ output. = "\ n </ p> \ n"; }}
fenfe1

Tôi đã thử sử dụng <div>thay vì <p>chỉ để xem liệu tôi có thể làm cho các chức năng đó làm được gì không nhưng cho đến nay không có niềm vui nào :(
fenfe1

Việc <div><p>không nên phá Walker nhưng có thể dẫn đến đánh dấu không hợp lệ. Bạn có $output =và không có $output .=trong của bạn start_lvl. Điều đó có thể gây rắc rối. Đó có phải là Walker hoàn chỉnh mà bạn đã đăng không?
s_ha_dum

Xin chào. Tôi đã sửa lỗi .=bit này bây giờ là lớp hoàn chỉnh (Tôi đã xóa start_lvl()và các end_lvl()hàm để xem chúng có tạo ra sự khác biệt không) - pastebin.com/zfcBxHd8
fenfe1

2

Bạn đã nghĩ đến việc tìm nạp tất cả các mục menu điều hướng bằng cách sử dụng chức năng tích hợp: wp_get_nav_menu_items();và xuất nội dung thủ công chưa?

Ví dụ :: Xây dựng danh sách menu đơn giản

    // Get the nav menu based on $menu_name (same as 'theme_location' or 'menu' arg to wp_nav_menu)
    // This code based on wp_nav_menu's code to get Menu ID from menu slug

    $menu_name = 'custom_menu_slug';

    if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );

    $menu_items = wp_get_nav_menu_items($menu->term_id);

    $menu_list = '<ul id="menu-' . $menu_name . '">';

    foreach ( (array) $menu_items as $key => $menu_item ) {
        $title = $menu_item->title;
        $url = $menu_item->url;
        $menu_list .= '<li><a href="' . $url . '">' . $title . '</a></li>';
    }
    $menu_list .= '</ul>';
    } else {
    $menu_list = '<ul><li>Menu "' . $menu_name . '" not defined.</li></ul>';
    }
    // $menu_list now ready to output
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.