WordPress menu code

Salam. Wordpress de menyu yaratmışam. menyu 4 tree dən ibarət olmalıdı. məsələn Tree1 -Tree2 --Tree3 ---Tree4 Bunu wordpressin öz menyu funksiyası ilə yaratmaq olar? Çalışdım ama html kodlar fərqlidi deyə wordpress sade kodla qaytarir ul li ile ve class vermək olur fsyo. ama məndə olan menyu strukturu fərqlidi biraz. ona görə də custom etmək istəyirem menyunu. bu kod ile [code] <?php $menu_name = 'header_menu'; 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); print_r($menu_items); } ?>[/code] bütün menyulari qaytarir mənə . 1 ci root menyunu əgər parent id 0 dirsa bilirəm. 2 ci tree ni de parent id hansi id ye aid oldugunu ayirib bilmək olar. qalir 3 cu ve 4 cu parent leri tapmaq. onları ayıra bilmirem. fikrimde tutdugum mentiq beledir ki her bir tree ni ayri ayri arraylara yiğam. Array1 Array2 Array3 Array4. ve belece istenilen formada istifade edem. və ya başqa cür sadə bir yolla necə etmək olar bunu? teşekkür edirəm.

Verilmiş cavablar və yazılan şərhlər (10 cavab var)

E. Hacı (2015-05-16 11:08:39)
İçinə girmək üçün gərək bir neçə dəfə oxuyam yazılanları, amma qısaca onu deyə bilərəm ki, problem tək budursa əlavə yollardan çəkinməyin: məsələn class içində private funksiya yaratmaq və start_lvl içində ona müraciət göndərmək, və ya cari item-i transient-də saxlamaq və ya global dəyişən elan edib ona mənimsətmək və.s. əsas odur ki həll həm işi görsün, həm də performansa təsir etməsin.

Emin Rəhmanov (2015-05-15 23:25:00)
start_el() funksiyasi icinde bu sekilde classlarin siyahisini ala bilirem. $item ile. $classes = empty( $item->classes ) ? array() : (array) $item->classes; ama start_lvl(); icinde $item yoxdu. hansisa yolla $item obyektini o methodun icine sala bilerem? ve ya bawqa hansisa yolu var start_lvl icinde hazirki menyunun subunun olub olmadigini has_sub olub olmadigini yoxlamaq?

E. Hacı (2015-05-15 17:48:08)
Belə anlamaq çətindir problemi. Gərək ki, çıxan nəticənin də kodunu yazasız və onu tutuşduram ən yuxarıda yazdığınız arzulanan html ilə.

Emin Rəhmanov (2015-05-15 17:40:44)
sorry. sehvimi tapdim ozum. depth yoxlamamiwdan evvel yuxarida $output a menimsedilmiw ul var ki oda ifden yuxarida qalib ona gore her defa join olur. bunu hell etdim. ama bawqa bir problem yaranib. demeli eger menyuda 4 cu tree varsa onnan evvel 3 cu tree nin adi adi div icinde olmalidi title kimi. yox eger 4 cu tree yoxdursa onda 3 cu tree ozu ul li icinde olur link kimi. bunu da etmek ucun start_lvl(); funksiyasinin icinde bilmeliyem ki eger subu yoxdursa ul teqini acim. varsa eger div acim. ama start_lvl(); icinde nece yoxlaya bilerem ki sub var ya yoxdu?

Emin Rəhmanov (2015-05-15 15:46:00)
Tesekkurler Elvin. dediyiniz Walker ile eledim. cox rahat bir yoldu istenilen formaya salmaq olur kodlari. ama bir wey var ki butun menyulari ul li ile verir. mene ise lazimdir ki ul li ni ozum yazim harda lazimdirsa. menim menyuda 1 ci tree de menyular li teqi arasinda ama 2-3 tree de ul yoxdu. ve 4 cu en son tree ul li iledi. Yazdigim class beledi. burda depth 1 normaldi lazimi neticeni verir. ama depth 2 olanda orda yazilan article teqi arasinda olan title sadece adice text olmalidi. bele ama indi li teqleri arasina salir article di. articleden evvele li teqleri elave edir. nece etmek olar ki bunu etmesin o teqi? [code] class Header_Menu_Walker extends Walker_Nav_Menu { public function start_lvl( &$output, $depth = 0, $args = array() ) { $output .= "\n

    \n"; } public function end_lvl( &$output, $depth = 0, $args = array() ) { $output .= "
\n"; } public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $output .= $indent . '
  • '; $atts = array(); $atts['title'] = ! empty( $item->attr_title ) ? $item->attr_title : ''; $atts['target'] = ! empty( $item->target ) ? $item->target : ''; $atts['rel'] = ! empty( $item->xfn ) ? $item->xfn : ''; $atts['href'] = ! empty( $item->url ) ? $item->url : ''; $atts['class'] = $depth == 0 && in_array('menu-item-has-children', $classes) ? 'sub' : ''; $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth ); $attributes = ''; foreach ( $atts as $attr => $value ) { if ( ! empty( $value ) ) { $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); $attributes .= ' ' . $attr . '="' . $value . '"'; } } if($depth == 0) { $item_output = $args->before; $item_output .= ''; $item_output .= $args->link_before .($depth == 0 && in_array('menu-item-has-children', $classes) ? '' : ''). apply_filters( 'the_title', $item->title, $item->ID ).($depth == 0 && in_array('menu-item-has-children', $classes) ? '' : '') . $args->link_after; $item_output .= ''; $item_output .= $depth == 0 && in_array('menu-item-has-children', $classes) ? '' : ''; } else if($depth == 1) { $output .= ''; } else if($depth == 2) { } else if($depth == 3) { } $output .= "
  • \n"; } }[/code]

    E. Hacı (2015-05-14 18:05:05)
    Sizin kodda custom html kodlar var çoxlu. Ona görə də nav menu yazıq onu edə bilməz axı. 2 həlli var bunun. 1. Hər ul-ə uyğun bir menyu yaratmaq və bu html-in dinamik olmayan hissələrini koda statik olaraq daxil edib yalnız ul hissələrin yerində həmin yaradılan menyuları wp_nav_menu ilə çağırmaq - bu asan və tezbazar həlldir ki sizin işinizi tam görür. 2. wp_nav_menu üçün Walker class yazmaq. Bu işin profesional və effektiv həllidir, amma bir az dərin wp codex biliyi tələb edir.

    Emin Rəhmanov (2015-05-14 12:41:35)
    sizin yazdiginiz kimi netice verdi mene. menyunu cixarir ama tam bawqa formatda. mene lazim olan struktur yuxarida qeyd etdiyim kimidir html kodlar. ama wp_nav_menu() ise mene bunu qaytardi. mendeki menu kodunda struktur ferqlidi bundan.ona gore ne qeder caliwdim wp_nav_menu ile hell ede bilmedim. [code]

    [/code]

    E. Hacı (2015-05-14 10:25:52)
    Menyunun adını düz yazmırsız. wp_nav_menu funksiyası ad qəbul etmir. Belə yazmaq lazımdır: wp_nav_menu(array('menu'=>'menyunun deqiq adi'));

    Emin Rəhmanov (2015-05-13 17:49:09)
    Dediyiniz kimi etmisem wp adminden. drag drop ile. sadece menyunu gostermek isteyende mene istediyim neticeni vermir wp_nav_menu('header_menu'); bele yazanda. sade

    • menu
    bele qaytarir html olaraq. ama menim menyu kodum tam bawqa strukturdadi. bu menyunu hemen siz yazdiginiz kodla nece elde ede bilerem? wp adminde elave etmisem her weyi drag drop ile. mene lazim olan netice kod ise bele olmalidi. [code] [/code]

    E. Hacı (2015-05-13 16:19:29)
    Salam. Niyə drag&drop ilə istədiyiniz custom menunu wp-admin/appearance/menus bölməsindən etməyəsiz ki? Sonra da sadəcə o kodu wp_nav_menu('menyunun adı'); çağırırsız vəssalam