Filtre wp_nav_menu ()


9

Gezinmemi 3 tek gezinme çubuğuna (düzey 1, düzey 2 ve düzey3 +) ayırmaya çalışıyorum. Üçü, sitenin üzerinde ayrıldığından ve yalnızca geçerli sayfaya bağlı olarak görünmeleri gerektiği için.

-0-------1--------2-------3+- level/depth
Home
 |
 |\___ Lobby
 |
 |\___ Projects
 |       |\___ Project A
 |       |       |\___ Review
 |       |       |\___ Comments
 |       |       \____ Download
 |       \____ Project B
 |               |\___ Review
 |               |\___ Comments
 |               \____ Download
 |\___ Blog
 |
 \____ About
         |\___ Legal
         \____ Contact

Seviye 1'i içeren ilk gezinme çubuğu her zaman görülebilir. İkinci gezinme çubuğu (düzey 2) yalnızca şu anda ilgili üst sayfada olduğumda. Aynı şey üçüncü gezinme çubuğu için de geçerlidir (seviye 3+, artı bu gezinme çubuğu ayrıca 3. sayfa alt sayfaları ve alt sayfalar içerecektir).

Kısacası: Tüm üst menüleri gezinme çubuklarında ve yalnızca geçerli sayfanın doğrudan alt öğelerinde görüntülemek istiyorum.

Ne denedim:

function my_nav_menu( $args = array() )
{
    $echo = isset( $args['echo'] ) ? (bool)( $args['echo'] ) : true;
    $args['echo'] = false;

    add_filter( 'wp_get_nav_menu_items' , 'my_nav_menu_filter' , 666 , 3 );

    $menu = wp_nav_menu( $args );

    remove_filter( 'wp_nav_menu_objects' , 'my_nav_menu_filter' , 666 );

    if( $echo )
        echo $menu;
    else
        return $menu;
}

function my_nav_menu_filter( $items , $menu , $args )
{
    //var_dump( $args );

    $navLevel = isset( $args['navlevel'] ) ? (int)( $args['navlevel'] ) : 0;

    //echo 'navlevel = ' . $args['navlevel'] . ' | ' . $navLevel;

    if( $navLevel == 1 )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
                unset( $items[$key] );
        }
    }
    else if( $navLevel == 2 )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
            {
                $page = get_page( $item->menu_item_parent );

                if( $page->menu_item_parent == 0 )
                    continue;
            }

            unset( $items[$key] );
        }
    }
    else if( $navLevel == 3 )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
            {
                $page = get_page( $item->menu_item_parent );

                if( $page->menu_item_parent != 0 )
                    continue;
            }

            unset( $items[$key] );
        }
    }
    else
    {
        //var_dump( $items );
    }

    return $items;
}

Bunu header.php dosyamda çağırıyorum: <?php my_nav_menu( array( 'echo' => false , 'navlevel' => 1 ) ); ?>

Ancak $argsvarsayılan değerlere ayarlanır ve özel navlevelgirişim filtrede gösterilmez.

Navbar'ımı açıklandığı gibi nasıl bölebilirim? Özel $argsgirişimi nasıl ayarlarım?


2
İyi günler ve WPSE'ye hoş geldiniz. İlk zamanlayıcı için destansı bir soru için sizi tebrik etmeliyim. İyi yapılandırılmış sorular açık cevaplarla her zaman çok dikkat çeker. +1
Pieter Goosen

3
Bunun cevabı özel bir Walker sınıfı içerir, belki de bu potansiyel cevaplayıcılara yardımcı olacaktır
Tom J Nowell

Teşekkür ederim. Ben php / wp sadece bu hafta sonu kazılmış yani im tanıdık değil. Özel bir Walker denedim, ancak Walker bir seferde sadece tek bir öğeyi işliyor, bu yüzden mevcut öğeyle karşılaştıramıyorum. Ve bir filtre benim özel argümanımı kabul etmiyor. Hmmm ...
saçmalık

Yanıtlar:


3

Sanırım cevabı aldım:

function my_nav_menu( $args = array() )
{
    $echo = isset( $args['echo'] ) ? (bool)( $args['echo'] ) : true;

    $args['echo'] = false;

    add_filter( 'wp_nav_menu_objects' , 'my_filter_nav_menu' , 100 , 2 );

    $menu = wp_nav_menu( $args );

    remove_filter( 'wp_nav_menu_objects' , 'my_filter_nav_menu' , 100, 2 );

    if( $echo )
        echo $menu;
    else
        return $menu;
}

Bu hile yapar: menü öğelerini değiştirmeme izin veriyor ve özel argümanlar hala mevcut. Filtreyi yanlışlıkla wp_get_nav_menu_itemsyerine bağladım wp_nav_menu_objects. Hala filtreleme ile ilgili sorunlar yaşıyorum, ancak bunlar muhtemelen bazı mantıksal hatalar ..

EDIT: navbar düzey 2 ve navbar düzey 3+ bir araya getirip bunları css ile ayırarak sorunumu çözeceğim

mevcut php kısmı heres:

function serthy_filter_nav_menu( $items , $args )
{
    $argArray = (array)( $args );

    if( isset( $argArray['toplevel'] ) )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
                unset( $items[$key] );
        }

        return $items;
    }

    global $post;

    $arr = array();

    foreach( $items as $key => $item )
    {
        $parentIDs = get_post_ancestors( $item->ID );

        foreach( $parentIDs as $i => $parentID )
        {
            if( $parentID == $post->ID )
            {
                array_push( $arr , $item );

                break;
            }
        }
    }

    return $arr;
}

İlk bakışta bana iyi geliyor. Bu kodla ilgili sorunlarınız mı var? Sidenote: İlk ifadenizi kısaltabilirsiniz:$echo = ! isset( $args['echo'] ) ?: $args['echo'];
kaiser

1

Bana öyle geliyor ki , varsayılan olarak alt düzey menü seçeneklerini gizleyebilmeniz ve daha sonra üzerlerinde belirli sınıflar varsa bunları göstermeyi seçebilmeniz için CSS ile başa çıkabilirsiniz .

On Bu Codex sayfasında , menü sınıfları (bkz ve sayfanın kendisinde) olabilir. Yani, tanımladığınız "ikinci seviye" için, birinci seviye menüsünün 0 değil seviye 1 olduğunu varsayalım.

ul > li > ul.sub-menu { display: none; }  /* Hide by default */
ul > li.current-menu-parent > ul.sub-menu { display: block; } /* Show menu */

Ve sonra bir sonraki seviye için benzer bir şey:

ul > li > ul.sub-menu > li > ul.sub-menu{ display: none; }  /* Hide by default */
ul > li > ul.sub-menu > li.current-menu-parent > ul.sub-menu { display: block; }

Açıkça "blok" yerine "satır içi blok" veya menüleriniz normalde ne olursa olsun.

Sınıfların doğru kombinasyonunu bulmak için oynamanız gerekebilir, ancak daha önce bu yöntemle iyi şanslar yaşadım. WP orada bir ton sınıf bırakıyor, onları da kullanabilir.


Teşekkürler, nav barlarım için css'de bazı sınıflar kullanacağım! :)
saçmalık

Eğer bu çözümü kullandığınız takdirde, lütfen cevabımı kabul edilmiş olarak işaretler misiniz? Teşekkür ederim.
Amanda Giles
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.