Apakah ada cara untuk mengambil item menu nav sebagai array multidimensi daripada array datar?
Dengan struktur seperti pohon, saya bermaksud sesuatu yang akan menjaga hubungan antara barang-barang anak dan orang tua, seperti itu (ini hanya sebuah contoh) ...
array(
array(
'post_type' => 'page',
'post_name' => 'Home',
'children' => array()
),
array(
'post_type' => 'page',
'post_name' => 'About Us',
'children' => array(
array(
'post_type' => 'page',
'post_name' => 'Our History',
'children' => array()
)
)
)
)
Ada wp_get_nav_menu_items()
fungsi tetapi mengembalikan array 1 dimensi dengan semua item pada level yang sama, yang bukan yang saya inginkan. Apakah WordPress menyertakan cara bawaan untuk mendapatkan array multidimensi untuk item menu saya? Jika tidak, apa cara terbaik untuk mendapatkan wp_get_nav_menu_items()
struktur seperti pohon ke dalam array multidimensi dalam hal kinerja?
Walker
kelas menangani kedalaman item menu nav diurutkan secara otomatis, bahkan jika array datar.Jawaban:
Masalah membangun pohon dari susunan datar telah diselesaikan di sini dengan solusi rekursif yang sedikit dimodifikasi:
tempat kami menambahkan
wpse_children
atribut awalan untuk menghindari tabrakan nama.Sekarang kita hanya perlu mendefinisikan fungsi pembantu sederhana:
Sekarang menjadi sangat mudah untuk mengubah menu navigasi menjadi struktur pohon dengan:
Untuk JSON, kita cukup menggunakan:
Untuk versi yang sedikit berbeda, di mana kami memilih sendiri atributnya, lihat revisi pertama dari jawaban ini di sini .
Pembaruan: Kelas Walker
Inilah ide yang agak samar bagaimana kita dapat mencoba menghubungkan ke bagian rekursif dari
display_element()
metodeWalker
kelas abstrak .di mana
WPSE_Nav_Menu_Tree
merupakan perluasan dariWalker_Nav_Menu
kelas:Ini mungkin memberi kita pendekatan alternatif jika berhasil.
sumber
wp_get_nav_menu_items
secara rekursif.Singkatnya fungsi di bawah ini memang membuat pohon objek dengan menempatkan anak-anak ke properti anak-anak baru di dalam objek induk.
Kode:
Pemakaian:
Keluaran:
sumber
Versi modifikasi dari jawaban yang diterima di mana ia mempertimbangkan
menu_order
properti item menu untuk mempertahankan urutan yang tepat dari susunan flat asli.menu_order
diatur secara otomatis oleh WordPress sehingga tidak perlu memeriksa apa pun:Pemakaian:
sumber
Mungkin ada kesalahpahaman di sini tentang item menu WordPress nav sebagai struktur seperti pohon.
Struktur mirip pohon di WordPress BUKANLAH ARRAY MULTIDIMENSI!
Perhatikan bahwa meskipun array item menu yang dikembalikan rata, itu tetap struktur seperti pohon karena setiap item berisi informasi tentang asal-usulnya (nilai induk adalah 0 jika item tidak memiliki induk - atau id dari item induk jika tidak).
Ketika Anda meneruskan array seperti itu ke
Walker
kelas, ia akan melewati hasil dan membuat dua array - satu berisi item tingkat atas, dan lainnya berisi item anak dalam format di$parent_id => array()
mana array berisi item menu yang merupakan anak-anak langsung dari elemen tersebut.Pejalan kaki kemudian loop melalui array item tingkat atas, memproses item itu dan kemudian memeriksa array anak-anak untuk melihat apakah ada anak-anak untuk elemen saat ini, dan memproses masing-masing dengan cara yang sama, secara rekursif.
Jika Anda ingin tahu cara mengubah struktur seperti pohon WordPress menjadi array multidimensi, itu adalah pertanyaan yang sama sekali berbeda (dan bukan secara teknis pertanyaan WordPress). Tetapi informasi yang dikembalikan oleh
wp_get_nav_menu_items()
adalah struktur seperti pohon ... dan Anda dapat menggunakanWalker
apa adanya untuk menanganinya.Jika Anda ingin melihat kode persis yang dijalankan kelas Walker WordPress untuk berjalan di array, lihat Walker-> walk () di WordPress Trac dari baris 213-258 . Anda bisa menggunakan kode apa adanya untuk membangun array multidimensi, jika itu yang Anda cari.
Pejalan kaki
WordPress dirancang untuk menggunakan
Walker
kelas untuk memproses struktur seperti pohon. Jika Anda hanya merender suatu menu, atau benar-benar hanya membutuhkan hasil akhir, Anda mungkin ingin mempertimbangkanwp_nav_menu()
untuk menggunakan untuk mengeluarkan menu Anda ...Contoh:
Anda akan memperluas kelas Walker (mis.
Your_Walker()
) Untuk mendapatkan output apa pun yang Anda butuhkan. Sebagai contoh, lihat entri ini di Codex .sumber
$sorted_menu_items
masih array "flat" dan output dari opsi B adalah string.wp_get_nav_menu_items()
mengembalikan struktur mirip pohon - yaitu, array di mana setiap item berisi data asal. Struktur ini dimaksudkan untuk diberikan denganWalker
kelas. Jika use-case di sini hanya melibatkan pengubahan array "flat" menjadi array multidimensi berdasarkan data parentage (misal'post_parent' => 123
), pertanyaan ini tidak secara teknis tentang WordPress dan harus dipindahkan ke Stack Overflow.