Wp_nav_menu () işlevini kullanarak menü ağacının bir bölümünü / dalını görüntüleme


109

WP Admin'de tanimlanmis bir menüye sahibim:

alt metin

Üst sayfada olduğumda kenar çubuğundaki tüm alt bağlantıları görüntüleyebilmek istiyorum. Örneğin, kullanıcı "Hakkımızda" sayfamdaysa, kenar çubuğunda yeşil renkle vurgulanmış 4 bağlantının bir listesini istiyorum.

Wp_nav_menu () belgelerine baktım ve bağlantıları oluştururken başlangıç ​​noktası olarak kullanmak için belirli bir menünün belirli bir düğümünü belirtmek için herhangi bir yerleşik yöntem görünmüyor.

Sayfa ebeveyni tarafından oluşturulan ilişkilere dayanan benzer bir durum için bir çözüm yarattım, ancak menü sistemini özel olarak kullanan birini arıyorum. Herhangi bir yardım takdir edilecektir.


2
Yani tüm menüyü özel bir menü olarak korumak istiyor, ancak yalnızca aktif alt ağacı genişleten bir özel yürüteç oluşturmak istiyor musunuz? Gibi bu kod , ancak bunun yerine wp_list_pages ait wp_nav_menu uzanan? Son zamanlarda benzer bir şey yaptım ve eğer aradığın buysa kodunu gönderebilirdim ...
goldenapples

1
@goldenapples, ben de tam olarak bunun peşindeyim. Kodunuzu cevap olarak göndermekten sakıncası yoksa çok minnettar olurum.
jessegavin

1
Böyle bariz bir kullanışlı fonksiyonun zaten onu inşa etmediğini merak ediyorum. Bu "CMS" yapan herhangi bir site için genel olarak çok faydalıdır.
hakre

Yukarıdaki problemi veya benzer bir şeyi çözmeye çalışıyorum. Alternatif olarak, burada bir CSS çözümü
buldum

Yanıtlar:


75

Bu hala aklımdaydı, bu yüzden onu tekrar ziyaret ettim ve bu çözümü bir araya getirdim, bu bağlamda pek güvenmiyor:

add_filter( 'wp_nav_menu_objects', 'submenu_limit', 10, 2 );

function submenu_limit( $items, $args ) {

    if ( empty( $args->submenu ) ) {
        return $items;
    }

    $ids       = wp_filter_object_list( $items, array( 'title' => $args->submenu ), 'and', 'ID' );
    $parent_id = array_pop( $ids );
    $children  = submenu_get_children_ids( $parent_id, $items );

    foreach ( $items as $key => $item ) {

        if ( ! in_array( $item->ID, $children ) ) {
            unset( $items[$key] );
        }
    }

    return $items;
}

function submenu_get_children_ids( $id, $items ) {

    $ids = wp_filter_object_list( $items, array( 'menu_item_parent' => $id ), 'and', 'ID' );

    foreach ( $ids as $id ) {

        $ids = array_merge( $ids, submenu_get_children_ids( $id, $items ) );
    }

    return $ids;
}

kullanım

$args = array(
    'theme_location' => 'slug-of-the-menu', // the one used on register_nav_menus
    'submenu' => 'About Us', // could be used __() for translations
);

wp_nav_menu( $args );

Güzel teknik! Bununla ilgili bir şey sorabilir miyim: Listelenen bu alt menü sayfalarının içeriğini şablonda nasıl görüntülersiniz?
daniel.tosaba

2
@ daniel.tosaba Walker_Nav_Menusınıfta alt sınıf veya filtre kullanmanız gerekecektir . Tüm menü öğeleri gibi yorum için çok fazla - bu konuda yeni bir soru sormak?
Rarst


3
Böyle harika bir cevap. Çok teşekkür ederim. Bu gerçekten WordPress'te varsayılan bir seçenek olmalıdır.
dotty

3
Gerçekten temiz. Herhangi biri ilgileniyorsa, aynı şeyi ancak sayfa kimliğine göre yapmak için, wp_filter_object_listsatırı şu şekilde değiştirinwp_filter_object_list( $items, array( 'object_id' => $args->submenu ), 'and', 'ID' );
Ben

14

@goldenapples: Walker Sınıfınız çalışmıyor. Fakat fikir gerçekten güzel. Fikrinize dayanarak bir yürüteç yarattım:

class Selective_Walker extends Walker_Nav_Menu
{
    function walk( $elements, $max_depth) {

        $args = array_slice(func_get_args(), 2);
        $output = '';

        if ($max_depth < -1) //invalid parameter
            return $output;

        if (empty($elements)) //nothing to walk
            return $output;

        $id_field = $this->db_fields['id'];
        $parent_field = $this->db_fields['parent'];

        // flat display
        if ( -1 == $max_depth ) {
            $empty_array = array();
            foreach ( $elements as $e )
                $this->display_element( $e, $empty_array, 1, 0, $args, $output );
            return $output;
        }

        /*
         * need to display in hierarchical order
         * separate elements into two buckets: top level and children elements
         * children_elements is two dimensional array, eg.
         * children_elements[10][] contains all sub-elements whose parent is 10.
         */
        $top_level_elements = array();
        $children_elements  = array();
        foreach ( $elements as $e) {
            if ( 0 == $e->$parent_field )
                $top_level_elements[] = $e;
            else
                $children_elements[ $e->$parent_field ][] = $e;
        }

        /*
         * when none of the elements is top level
         * assume the first one must be root of the sub elements
         */
        if ( empty($top_level_elements) ) {

            $first = array_slice( $elements, 0, 1 );
            $root = $first[0];

            $top_level_elements = array();
            $children_elements  = array();
            foreach ( $elements as $e) {
                if ( $root->$parent_field == $e->$parent_field )
                    $top_level_elements[] = $e;
                else
                    $children_elements[ $e->$parent_field ][] = $e;
            }
        }

        $current_element_markers = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor' );  //added by continent7
        foreach ( $top_level_elements as $e ){  //changed by continent7
            // descend only on current tree
            $descend_test = array_intersect( $current_element_markers, $e->classes );
            if ( !empty( $descend_test ) ) 
                $this->display_element( $e, $children_elements, 2, 0, $args, $output );
        }

        /*
         * if we are displaying all levels, and remaining children_elements is not empty,
         * then we got orphans, which should be displayed regardless
         */
         /* removed by continent7
        if ( ( $max_depth == 0 ) && count( $children_elements ) > 0 ) {
            $empty_array = array();
            foreach ( $children_elements as $orphans )
                foreach( $orphans as $op )
                    $this->display_element( $op, $empty_array, 1, 0, $args, $output );
         }
        */
         return $output;
    }
}

Şimdi kullanabilirsiniz:

<?php wp_nav_menu( 
   array(
       'theme_location'=>'test', 
       'walker'=>new Selective_Walker() ) 
   ); ?>

Çıktı, geçerli kök öğeyi içeren bir listedir ve onun çocuklarıdır (çocukları değil). Def: Root element: = Geçerli sayfaya karşılık gelen veya geçerli bir sayfanın ebeveyni veya ebeveynin ebeveyni olan üst düzey menü öğesi ...

Bu, asıl soruyu tam olarak cevaplamıyor, ancak hala üst seviye madde olduğundan neredeyse. Bu benim için sorun değil, çünkü üst seviye elemanı kenar çubuğunun başlığı olarak istiyorum. Bundan kurtulmak istiyorsanız, display_element öğesini geçersiz kılmanız veya bir HTML-Ayrıştırıcı kullanmanız gerekebilir.


12

Merhaba @jessegavin :

Nav Menüler, özel posta tipleri ve özel taksonomilerin bir kombinasyonu halinde saklanır. Her menü, bir Özel Taksonominin (yani , bulunan ) bir Terimi (yani “Hakkında Menüsü” , içinde bulunur wp_terms) olarak nav_menukaydedilir wp_term_taxonomy.

Her bir Nav Menüsü Öğesi, menü öğenizin ana Nav Menüsü öğesinin kimliğinin nerede olduğuna dair bir önek kullanılarak , post meta (inç ) olarak kaydedilmiş özniteliklerine sahip bir gönderi olarak post_type=='nav_menu_item'(yani "Firma Hakkında" , bulunur wp_posts) bulunur .wp_postmetameta_key_menu_item_*_menu_item_menu_item_parent

Menüler ve menü öğeleri arasındaki ilişki saklanır wp_term_relationshipsnerede object_idilgilidir $post->IDNav Menü öğesi için ve $term_relationships->term_taxonomy_idtopluca tanımlanan menüsüne ilgilidir wp_term_taxonomyve wp_terms.

Her ikisini de bağlamanın'wp_update_nav_menu' ve 'wp_update_nav_menu_item'gerçek menüler oluşturmanın wp_termsve buna paralel bir dizi ilişki kurmanın mümkün olacağından eminim wp_term_taxonomyve wp_term_relationshipsNav Menüsü alt öğelerine sahip olan her Nav Menüsü Öğesinin kendi Nav Menüsü olduğu yerlerde.

Ayrıca ister ki kanca 'wp_get_nav_menus' (Ben birkaç ay önce yapıyordu bazı benzer çalışmalarına dayalı WP 3.0 eklenecektir önerdi olan) aksi takdirde oluşturulan Nav Menüler yönetici kullanıcı tarafından manipülasyon için görüntülenmeyen sağlamak için onlar Senkronizasyondan gerçekten hızlı bir şekilde ayrılırsanız, elinizde bir veri kabusu göreceksiniz.

Eğlenceli ve kullanışlı bir proje gibi görünüyor, ancak şu anda kısmen ele alabileceğimden biraz daha fazla kod ve test var çünkü verileri senkronize eden herhangi bir şey tüm hataları gidermeye gelince PITA olma eğilimindedir (ve çünkü müşterilere ödeme yapmak işleri halletmek için beni zorluyorlar. :) Ama yukarıdaki bilgilerle silahlı bir motive Ben WordPress eklenti geliştirici isterlerse kodlayabilirim.

Tabii ki şimdi kodlama yaparsanız, buraya geri göndermeniz zorunludur, böylece hepiniz büyüklerinizden faydalanabiliriz! :-)


Söylediklerinizi takip ettiğimden emin değilim. Bir kullanıcının bulunduğu geçerli sayfayla ilgili "alt menüleri" görüntülemek için salt okunur bir çözüm arıyorum. Aynı şey hakkında mı konuşuyoruz? - Yine de veritabanı şeması hakkında daha derin bir açıklama yaptığınız için teşekkür ederim.
jessegavin,

@jessegavin - Evet, aramak wp_nav_menu()istiyorsanız menüleri klonlamanız gerekir, çünkü wp_nav_menu()menü yapısına sıkıca bağlıdır . Diğer seçenek, wp_nav_menu()kodu kopyalamak ve alt menü olarak görüntülemek için gereken değişiklikleri yapmaktır.
MikeSchinkel

10

Bu, aradığınızı yapması gereken bir yürüteç uzantısıdır:

class Selective_Walker extends Walker_Nav_Menu
{

    function walk( $elements, $max_depth) {

        $args = array_slice(func_get_args(), 2);
        $output = '';

        if ($max_depth < -1) //invalid parameter
            return $output;

        if (empty($elements)) //nothing to walk
            return $output;

        $id_field = $this->db_fields['id'];
        $parent_field = $this->db_fields['parent'];

        // flat display
        if ( -1 == $max_depth ) {
            $empty_array = array();
            foreach ( $elements as $e )
                $this->display_element( $e, $empty_array, 1, 0, $args, $output );
            return $output;
        }

        /*
         * need to display in hierarchical order
         * separate elements into two buckets: top level and children elements
         * children_elements is two dimensional array, eg.
         * children_elements[10][] contains all sub-elements whose parent is 10.
         */
        $top_level_elements = array();
        $children_elements  = array();
        foreach ( $elements as $e) {
            if ( 0 == $e->$parent_field )
                $top_level_elements[] = $e;
            else
                $children_elements[ $e->$parent_field ][] = $e;
        }

        /*
         * when none of the elements is top level
         * assume the first one must be root of the sub elements
         */
        if ( empty($top_level_elements) ) {

            $first = array_slice( $elements, 0, 1 );
            $root = $first[0];

            $top_level_elements = array();
            $children_elements  = array();
            foreach ( $elements as $e) {
                if ( $root->$parent_field == $e->$parent_field )
                    $top_level_elements[] = $e;
                else
                    $children_elements[ $e->$parent_field ][] = $e;
            }
        }

        $current_element_markers = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor' );

        foreach ( $top_level_elements as $e ) {

            // descend only on current tree
            $descend_test = array_intersect( $current_element_markers, $e->classes );
            if ( empty( $descend_test ) )  unset ( $children_elements );

            $this->display_element( $e, $children_elements, $max_depth, 0, $args, $output );
        }

        /*
         * if we are displaying all levels, and remaining children_elements is not empty,
         * then we got orphans, which should be displayed regardless
         */
        if ( ( $max_depth == 0 ) && count( $children_elements ) > 0 ) {
            $empty_array = array();
            foreach ( $children_elements as $orphans )
                foreach( $orphans as $op )
                    $this->display_element( $op, $empty_array, 1, 0, $args, $output );
         }

         return $output;
    }

}

Gevşek olarak mfields koduna dayanarak daha önce yorum yazdım. Tek yapmanız gereken, geçerli öğenin (1) geçerli menü öğesi veya (2) geçerli menü öğesinin bir atası olup olmadığını görmek için menüde yürürken kontrol etmek ve altının yalnızca bu koşullardan herhangi birinin doğru olması durumunda genişletilmesidir. . Umarım bu sizin için çalışır.

Kullanmak için, menüyü aradığınızda bir "yürüteç" argümanı eklemeniz yeterlidir:

<?php wp_nav_menu( 
   array(
       'theme_location'=>'test', 
       'walker'=>new Selective_Walker() ) 
   ); ?>

Oh ... Sadece sorunuzu tekrar okudum ve ilk başta yanlış anladığımı anladım. Bu yürüteç, diğer tüm üst düzey menü öğelerini gösterir, bunları genişletmez. Bu tam olarak yapmak istediğin şey değildi. Yine de, bu kod istediğiniz şekilde değiştirilebilir. Sadece döngüye bakın $top_level_elementsve aramadan önce kendi testinizi ekleyin $this->display_element.
goldenapples

Bu sınıfın mevcut alt sayfanın derinliğini göstermesi mümkün mü? Bu .. Üç veya daha fazla seviyenin derinliğine sahipsem, üçüncü ve sonraki seviyelerin geçerli (alt) sayfa için gösterildiğini mi? Şu anda, sadece A> B'yi gösteriyor ve> C'yi göstermiyor (C üçüncü (seviye)
Zolomon

@Zolomon - Sorunuzu anladığımdan emin değilim. Bu, 'current-menu-item', 'current-menu-parent' veya 'current-menu-aces' sınıfları ile herhangi bir menü öğesinin altındaki ağacın tamamını genişletmelidir. Test ettiğimde, menüdeki tüm alt sayfa seviyelerini gösterir. Ne yapmak istiyorsun?
goldenapples

Belki de temanız 0 varsayılanını aşarsa diye depthçağrıya bir parametre iletmek istersiniz wp_nav_menu(tüm seviyeleri göster).
goldenapples

8

Güncelleme: Bunu bir eklenti haline getirdim. Buradan indirin .


Bunu kendim çözmem gerekiyordu ve nihayet menü aramasının sonuçları üzerine bir filtre yazıyordum. wp_nav_menuNormal olarak kullanmanıza izin verir , ancak üst öğenin başlığına bağlı olarak menünün bir alt bölümünü seçin. submenuMenüye böyle bir parametre ekleyin :

wp_nav_menu(array(
  'menu' => 'header',
  'submenu' => 'About Us',
));

Eğik çizgiler koyarak birkaç seviyeye bile gidebilirsiniz:

wp_nav_menu(array(
  'menu' => 'header',
  'submenu' => 'About Us/Board of Directors'
));

Veya bir diziyi tercih ediyorsanız:

wp_nav_menu(array(
  'menu' => 'header',
  'submenu' => array('About Us', 'Board of Directors')
));

Başlığın ve noktalama işaretlerinin affedilmesi için başlığın sümüklü bir versiyonunu kullanır.


Alt menüye id ile ulaşmak mümkün müdür? Sayfa kimliği veya posta kimliği demek istiyorum.
Digerkam,

split () kullanımdan kaldırıldı, $loc = split( "/", $loc );eklenti ile değiştirin$loc = preg_split( "~/~", $loc );
Floris

Ayrıca $ submenu isteğe bağlı yapma öneririm. Böylece gerektiğinde tüm menüyü hala alabilirsiniz. Filtreyi üstüne ekle: `if (! İsset ($ args-> submenu)) {return $ items; } `
Floris

8

Aşağıdaki sınıfı kendim için bir araya getirdim. Geçerli sayfanın üst gezinti ebeveyni bulacak veya walker yapıcısında ona hedef üst gezinme kimliği verebilirsiniz.

class Walker_SubNav_Menu extends Walker_Nav_Menu {
    var $target_id = false;

    function __construct($target_id = false) {
        $this->target_id = $target_id;
    }

    function walk($items, $depth) {
        $args = array_slice(func_get_args(), 2);
        $args = $args[0];
        $parent_field = $this->db_fields['parent'];
        $target_id = $this->target_id;
        $filtered_items = array();

        // if the parent is not set, set it based on the post
        if (!$target_id) {
            global $post;
            foreach ($items as $item) {
                if ($item->object_id == $post->ID) {
                    $target_id = $item->ID;
                }
            }
        }

        // if there isn't a parent, do a regular menu
        if (!$target_id) return parent::walk($items, $depth, $args);

        // get the top nav item
        $target_id = $this->top_level_id($items, $target_id);

        // only include items under the parent
        foreach ($items as $item) {
            if (!$item->$parent_field) continue;

            $item_id = $this->top_level_id($items, $item->ID);

            if ($item_id == $target_id) {
                $filtered_items[] = $item;
            }
        }

        return parent::walk($filtered_items, $depth, $args);
    }

    // gets the top level ID for an item ID
    function top_level_id($items, $item_id) {
        $parent_field = $this->db_fields['parent'];

        $parents = array();
        foreach ($items as $item) {
            if ($item->$parent_field) {
                $parents[$item->ID] = $item->$parent_field;
            }
        }

        // find the top level item
        while (array_key_exists($item_id, $parents)) {
            $item_id = $parents[$item_id];
        }

        return $item_id;
    }
}

Nav araması:

wp_nav_menu(array(
    'theme_location' => 'main_menu',
    'walker' => new Walker_SubNav_Menu(22), // with ID
));

4

@ davidn @hakre Merhaba, HTML-Ayrıştırıcı veya geçersiz kılma display_element olmadan çirkin bir çözümüm var.

 class Selective_Walker extends Walker_Nav_Menu
    {
        function walk( $elements, $max_depth) {

            $args = array_slice(func_get_args(), 2);
            $output = '';

            if ($max_depth < -1) //invalid parameter
                return $output;

            if (empty($elements)) //nothing to walk
                return $output;

            $id_field = $this->db_fields['id'];
            $parent_field = $this->db_fields['parent'];

            // flat display
            if ( -1 == $max_depth ) {
                $empty_array = array();
                foreach ( $elements as $e )
                    $this->display_element( $e, $empty_array, 1, 0, $args, $output );
                return $output;
            }

            /*
             * need to display in hierarchical order
             * separate elements into two buckets: top level and children elements
             * children_elements is two dimensional array, eg.
             * children_elements[10][] contains all sub-elements whose parent is 10.
             */
            $top_level_elements = array();
            $children_elements  = array();
            foreach ( $elements as $e) {
                if ( 0 == $e->$parent_field )
                    $top_level_elements[] = $e;
                else
                    $children_elements[ $e->$parent_field ][] = $e;
            }

            /*
             * when none of the elements is top level
             * assume the first one must be root of the sub elements
             */
            if ( empty($top_level_elements) ) {

                $first = array_slice( $elements, 0, 1 );
                $root = $first[0];

                $top_level_elements = array();
                $children_elements  = array();
                foreach ( $elements as $e) {
                    if ( $root->$parent_field == $e->$parent_field )
                        $top_level_elements[] = $e;
                    else
                        $children_elements[ $e->$parent_field ][] = $e;
                }
            }

            $current_element_markers = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor' );  //added by continent7
            foreach ( $top_level_elements as $e ){  //changed by continent7
                // descend only on current tree
                $descend_test = array_intersect( $current_element_markers, $e->classes );
                if ( !empty( $descend_test ) ) 
                    $this->display_element( $e, $children_elements, 2, 0, $args, $output );
            }

            /*
             * if we are displaying all levels, and remaining children_elements is not empty,
             * then we got orphans, which should be displayed regardless
             */
             /* removed by continent7
            if ( ( $max_depth == 0 ) && count( $children_elements ) > 0 ) {
                $empty_array = array();
                foreach ( $children_elements as $orphans )
                    foreach( $orphans as $op )
                        $this->display_element( $op, $empty_array, 1, 0, $args, $output );
             }
            */

/*added by alpguneysel  */
                $pos = strpos($output, '<a');
            $pos2 = strpos($output, 'a>');
            $topper= substr($output, 0, $pos).substr($output, $pos2+2);
            $pos3 = strpos($topper, '>');
            $lasst=substr($topper, $pos3+1);
            $submenu= substr($lasst, 0, -6);

        return $submenu;
        }
    }

Hepsini denedikten sonra, Alp'in çözümü benim için çalışan tek çözümdü. Ancak bununla ilgili bir sorun var. Sadece şovdaki birinci seviye çocuklar, ancak üçüncü veya dördüncü seviye çocukları göstermiyor. Bunu yapmak için günlerdir uğraşıyorum. Çözümünü böyle değiştirmeyi bilen var mı? PS. Yorum eklememe izin vermiyor, bu yüzden cevap olarak yapmanız gerekiyor.
cchiera

3

Gezinme menüsü çıktısı, geçerli öğe, geçerli öğe atası vb. İçin çok sayıda sınıf içerir. Bazı durumlarda, tüm gezinti ağacı çıktısına izin vererek ve ardından aşağı çekmek için css kullanarak yapmak istediğiniz şeyi yapabildim. yalnızca geçerli sayfanın çocukları vb.


3

Yardımcı olması gereken değiştirilmiş bir yürüteç yaptım! Mükemmel değil - birkaç boş element bırakıyor, ancak numarayı yapıyor. Değişiklik temelde bu $ current_branch bit'dir. Birisi yardımcı olur umarım!

class Kanec_Walker_Nav_Menu extends Walker {
/**
 * @see Walker::$tree_type
 * @since 3.0.0
 * @var string
 */
var $tree_type = array( 'post_type', 'taxonomy', 'custom' );

/**
 * @see Walker::$db_fields
 * @since 3.0.0
 * @todo Decouple this.
 * @var array
 */
var $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' );

/**
 * @see Walker::start_lvl()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param int $depth Depth of page. Used for padding.
 */
function start_lvl(&$output, $depth) {
    $indent = str_repeat("\t", $depth);
    $output .= "\n$indent<ul class=\"sub-menu\">\n";
}

/**
 * @see Walker::end_lvl()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param int $depth Depth of page. Used for padding.
 */
function end_lvl(&$output, $depth) {
    global $current_branch;
    if ($depth == 0) $current_branch = false;
    $indent = str_repeat("\t", $depth);
    $output .= "$indent</ul>\n";
}

/**
 * @see Walker::start_el()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param object $item Menu item data object.
 * @param int $depth Depth of menu item. Used for padding.
 * @param int $current_page Menu item ID.
 * @param object $args
 */
function start_el(&$output, $item, $depth, $args) {
    global $wp_query;
    global $current_branch;

    // Is this menu item in the current branch?
    if(in_array('current-menu-ancestor',$item->classes) ||
    in_array('current-menu-parent',$item->classes) ||
    in_array('current-menu-item',$item->classes)) {
        $current_branch = true; 
    }

    if($current_branch && $depth > 0) {
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value = '';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = 'menu-item-' . $item->ID;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
        $class_names = ' class="' . esc_attr( $class_names ) . '"';

        $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
        $id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : '';

        $output .= $indent . '<li' . $id . $value . $class_names .'>';

        $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
        $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
        $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
        $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }

}

/**
 * @see Walker::end_el()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param object $item Page data object. Not used.
 * @param int $depth Depth of page. Not Used.
 */
function end_el(&$output, $item, $depth) {
    global $current_branch;
    if($current_branch && $depth > 0) $output .= "</li>\n";
    if($depth == 0) $current_branch = 0;
}

}


3

Eklentimdeki kodu kontrol edin veya amacınız için kullanın;)

Bu eklenti gelişmiş "Gezinme Menüsü" widget'ını ekler. Widget aracılığıyla özel menünün çıkışını özelleştirmek için ayarlanmış birçok seçenek sunar.

Özellikler:

  • Özel hiyerarşi - "Yalnızca ilgili alt öğeler" veya "Yalnızca kesinlikle ilgili alt öğeler".
  • Başlangıç ​​derinliği ve maksimum seviyesini görüntülemek için + düz ekran.
  • Seçilen ile başlayan tüm menü öğelerini göster.
  • Yalnızca geçerli öğeye doğrudan giden yolu veya yalnızca
    seçilen öğenin alt öğelerini göster (ana öğeyi dahil etme seçeneği).
  • Bir widget bloğu için özel sınıf.
  • Ve wp_nav_menu işlevi için hemen hemen tüm parametreler.

http://wordpress.org/extend/plugins/advanced-menu-widget/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.