Custom Walker: cara mendapatkan ID di fungsi start_lvl

14

Saya membuat custom walker pertama saya untuk membangun menu akordeon. Untuk mulai dengan saya menggunakan contoh ini: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

Ada dua fungsi. Pertama start_lvl dan kemudian start_el.

Di start_el ID dapat diimplementasikan oleh $ item-> ID. Adakah yang tahu bagaimana saya bisa melakukan ini di start_lvl juga? Saya perlu memberikan (mengelilingi navigasi level bawah) ID sehingga saya dapat memicunya runtuh di menu akordeon.

Apa yang saya coba hasilkan adalah seperti ini:

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

Kode saya untuk fungsi 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";
}
Robert Bouten
sumber

Jawaban:

37

Saya hanya perlu melakukan ini di salah satu tema saya ... Karena Anda tidak memiliki akses ke variabel $ item pada tahap Walker itu, Anda ingin menyimpan item Anda saat ini dalam lingkup yang lebih global pada saat Anda memiliki akses ke sana. Kode berikut akan lebih masuk akal ... catatan: Saya telah menghapus semuanya kecuali kode yang relevan.

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

 }
Jalur
sumber
3
Ini adalah solusi paling elegan yang disajikan di utas ini. Lane terima kasih!
Kevin C.
1
Memang pendekatan yang sangat bersih itu bekerja dengan baik. Terimakasih banyak.
Isaac Gregson
1
Saya tidak yakin tetapi apakah saya harus menambahkan seluruh kode default ke start_el untuk membuatnya berfungsi?
GDY
4
Oke, Anda bisa menggunakan parent :: start_el ($ output, $ item, $ depth, $ args, $ id); di start_el ...
GDY
Cemerlang, sudah berarti untuk mencari tahu ini selama berabad-abad dan ini berhasil segera. Terima kasih.
cfx
3

Saya memiliki masalah yang sama dan menyelesaikannya dengan menggunakan variabel statis di dalam kelas:

static protected $menu_lvl; 

Dan kemudian di "display_element" saya menambahkan variabel:

self::$menu_lvl++;

Dalam kode saya, saya kemudian direferensikan dalam fungsi start_lvl sesuatu seperti ini:

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

Ini tidak menggunakan ID halaman, tetapi ia menggunakan ID unik untuk pernyataan UL yang dapat dirujuk oleh javascript.

BTW - Ini benar-benar hanya berguna untuk akordeon bersarang, atau dropdown bersarang yang dapat diklik di Tema Roots menggunakan Bootstrap untuk aplikasi seluler.

Sean Donovan
sumber
2

Anda dapat menggunakan filter berikut ini di start_elfungsi Anda dan grub argumen Anda di start_lvlfungsi.

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

Tolong beri tahu saya jika itu berhasil.

Roy Nabajit
sumber
Terima kasih untuk posting! Saya berharap dapat menemukan waktu untuk menyelesaikannya dalam beberapa hari ke depan tetapi saya benar-benar sibuk dengan studi saya sekarang. Saya akan kembali kepada Anda dengan hasilnya!
Robert Bouten
0

Anda cukup menambahkan $ page ke argumen custom walker:

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

Coba yang di atas dan kemudian sebelum Anda menelepon wp_list_pages (), tambahkan kelas custom walker:

$MyWalker = new My_Custom_Walker();

Kemudian, dalam argumen untuk wp_list_pages:

wp_list_pages ('walker' => $ MyWalker)

Periksa dan lihat apakah output walker berwarna merah.

AlxVallejo
sumber
Itu ada di fungsi start_el, tetapi tampaknya berbeda di start_lvl karena saya tidak bisa memasukkan variabel yang sama di sana. Atau setidaknya bukan urutan yang sama.
Robert Bouten
Apa yang Anda coba lakukan dengan start_lvl?
AlxVallejo
Saya mencoba memberi <ul> id = "collapse102" dengan 102 ID halaman yang dihasilkan. Dengan cara ini saya dapat memicunya untuk menutupnya di menu akordeon saya.
Robert Bouten
Menambahkan id = "collapse" berfungsi, tetapi saya tidak bisa membuatnya berfungsi untuk menambahkan pageID juga.
Robert Bouten
Apakah maksud Anda bahwa Anda hanya ingin ID tertentu diciutkan? Saya memiliki pohon akordeon untuk wp_list_pages dan saya tidak perlu mengubah start_lvl sama sekali.
AlxVallejo