start_lvl Diabaikan di Custom walker_nav_menu

8

Ini adalah proyek pertama saya yang melibatkan WordPress dan saya macet mencoba membuat walker khusus untuk menu footer.

Saya pada dasarnya ingin mengubah menu dari <ul> <li></li> </ul>struktur ke <p> <span></span> </p>struktur.

Menu dan hal-hal menampilkan file dan saya telah dapat menyesuaikan start_eldan end_elfungsinya tanpa masalah jadi saya sekarang mendapatkan ini:

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

Yang jelas setengah jalan di sana, saya telah menulis start_lvl()dan end_lvl()tag seperti yang ditunjukkan di bawah ini tetapi mereka diabaikan oleh WordPress - tidak ada yang saya masukkan ke dalamnya (bahkan die()) dieksekusi (yang agak mencurigakan) tapi saya tahu kelas dipanggil karena yang start_el()fungsi.

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

Adakah yang tahu mengapa ini terjadi - pernahkah saya melewatkan sesuatu yang sangat jelas !?

Saya menjalankan versi terbaru WordPress di Apache dengan PHP 5.3.6jika itu membantu.

Terima kasih sebelumnya,

Felix :)

fenfe1
sumber
1
Berdasarkan apa yang Anda perlihatkan, semua hal yang jelas terlihat benar.
totels
Referensi silang wordpress.org/support/topic/…
Ian Dunn

Jawaban:

8

Kelas my_extended_walker Anda OK, tetapi ketika Anda memanggil fungsi wp_nav_menu gunakan parameter items_wrap .

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

Start_lvl digunakan untuk elemen anak-anak.

stillatmylinux
sumber
2
Start_lvl digunakan untuk elemen anak-anak. Anda baru saja menyelamatkan banyak hal dalam hidup saya
ashutosh
3

Ok, tidak yakin apa yang saya baca salah ketika saya memposting ini, tetapi seluruh kelas Anda harus seperti ini:

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

Dan kemudian lewati 'walker' sebagai parameter saat Anda menelepon wp_nav_menu

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

Jika Anda tahu Anda harus baik-baik saja. Saya melihat kode kerja yang melakukan hal itu. Saya tidak tahu tentang menempatkan <p>tag di sana. Anda mungkin mendapatkan markup yang tidak valid.

s_ha_dum
sumber
Hai, ya saya telah melakukan itu di bawah ini adalah kelas penuh,
fenfe1
kelas BB_Nav_Footer_Walker memperluas 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"; }}
fenfe1
Saya sudah mencoba menggunakan <div>alih-alih <p>hanya untuk melihat apakah saya bisa mendapatkan fungsi-fungsi itu untuk melakukan sesuatu tetapi sejauh ini tidak ada sukacita :(
fenfe1
Tanda <div>dan <p>tidak boleh merusak Walker tetapi dapat mengakibatkan markup tidak valid. Anda miliki $output =dan tidak ada $output .=dalam start_lvl. Itu bisa menyebabkan masalah. Apakah itu Walker lengkap yang Anda poskan?
s_ha_dum
Hai ya saya memperbaiki .=bit ini sekarang kelas lengkap (saya menghapus start_lvl()dan end_lvl()fungsinya untuk melihat apakah mereka membuat perbedaan) - pastebin.com/zfcBxHd8
fenfe1
2

Pernahkah Anda berpikir untuk mengambil semua item menu navigasi menggunakan fungsi wp_get_nav_menu_items();bawaan : dan mengeluarkan konten secara manual?

Contoh :: Membuat daftar menu sederhana

    // 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
Michael Ecklund
sumber