फ़िल्टर wp_nav_menu ()


9

मैं अपने नेविगेशन को 3 सिंगल नेविगेशन बार (स्तर 1, स्तर 2 और स्तर 3 +) में विभाजित करने का प्रयास करता हूं। तीन क्योंकि वे साइट पर अलग हो गए हैं और उन्हें केवल वर्तमान पृष्ठ पर निर्भर होना चाहिए।

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

पहला नम्बर 1 स्तर वाला हमेशा दिखाई देता है। दूसरा नौबत (स्तर 2) केवल जब वर्तमान में इसी मूल पृष्ठ पर im। वही तीसरे नेवबार (स्तर 3+, प्लस के लिए जाता है क्योंकि इस नावबार में उप पृष्ठ और स्तर 3 के उप पृष्ठ ...) भी शामिल होंगे।

संक्षेप में: मैं सभी मूल मेनू को उनके नावबार और केवल वर्तमान पृष्ठ के प्रत्यक्ष बच्चों को प्रदर्शित करना चाहता हूं।

मैंने क्या कोशिश की:

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

मेरे शीर्षलेख में इसे कॉल करना। <?php my_nav_menu( array( 'echo' => false , 'navlevel' => 1 ) ); ?>

हालाँकि $args, डिफ़ॉल्ट मानों पर सेट है और मेरा कस्टम प्रविष्टि navlevelफ़िल्टर में नहीं दिखाया गया है।

वर्णित के रूप में मैं अपने नौबार को कैसे विभाजित कर सकता हूं? मैं अपनी रीति-नीति कैसे निर्धारित करूं $args?


2
अच्छे दिन और WPSE में आपका स्वागत है। मुझे पहले टाइमर के लिए एक महाकाव्य निर्मित प्रश्न पर बधाई देना चाहिए। अच्छी तरह से निर्मित प्रश्न जो स्पष्ट हैं वे हमेशा अच्छे उत्तरों के साथ बहुत अधिक ध्यान आकर्षित करते हैं। +1
पीटर गोएन्च

3
इसका जवाब एक कस्टम वॉकर वर्ग शामिल है, शायद यह किसी भी संभावित answerers सहायता करेगा
टॉम जम्मू नॉवेल

धन्यवाद। मैं php / wp में केवल इस सप्ताह के अंत में खुदाई करता हूं ताकि यह परिचित न हो। मैंने एक कस्टम वॉकर की कोशिश की, हालाँकि वॉकर एक समय में केवल एक ही वस्तु को संभालता है, इसलिए मैं इसकी तुलना वर्तमान वस्तु से नहीं कर सकता। और एक फ़िल्टर मेरे कस्टम तर्क को स्वीकार नहीं करता है।
हम्मम

जवाबों:


3

मुझे लगता है कि मुझे जवाब मिला:

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

यह चाल करता है: मुझे मेनूइट को बदलने और कस्टम आर्ग अभी भी उपलब्ध हैं। मैंने गलती से फ़िल्टर को wp_get_nav_menu_itemsइसके बजाय झुका दिया wp_nav_menu_objects। मुझे अभी भी फ़िल्टर करने में समस्या आ रही है, हालाँकि ये शायद कुछ तार्किक बग हैं ..

संपादित करें: मैं अपनी समस्या को navbar स्तर 2 और navbar स्तर 3+ को एक में जोड़कर और css के साथ अलग करके हल करूँगा

मौजूदा php हिस्सा पाषंड:

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

पहली नज़र में मुझे अच्छा लगता है। क्या आपको उस कोड से समस्या है? सिडेनोट: आप अपने पहले कथन को छोटा कर सकते हैं:$echo = ! isset( $args['echo'] ) ?: $args['echo'];
kaiser

1

यह मुझे लगता है कि आप इसे सीएसएस के माध्यम से संभाल सकते हैं जिसमें आप डिफ़ॉल्ट रूप से निचले स्तर के मेनू विकल्प छिपा सकते हैं , और फिर उन्हें दिखा सकते हैं कि क्या उनके ऊपर कुछ कक्षाएं हैं।

पर इस कोडेक्स पेज , आप मेनू वर्गों देख सकते हैं (और अपने पेज पर ही)। तो आपके द्वारा वर्णित "दूसरे स्तर" के लिए, पहले स्तर के मेनू को स्तर 1 मान लिया गया है - 0 नहीं।

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

और फिर अगले स्तर नीचे के लिए कुछ इसी तरह:

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

स्पष्ट रूप से "इनलाइन-ब्लॉक" के साथ "ब्लॉक" या अपने मेनू को सामान्य रूप से सेट करने के लिए बदलें।

आपको कक्षाओं का सही संयोजन खोजने के लिए चारों ओर खेलने की आवश्यकता हो सकती है, लेकिन मुझे इस पद्धति से पहले सौभाग्य मिला है। WP वहां एक टन कक्षाएं गिराता है, साथ ही उनका उपयोग भी कर सकता है।


धन्यवाद, मैं अपने नौसेना सलाखों के लिए सीएसएस में कुछ वर्गों का इस्तेमाल करेंगे! :)
बकवास

यदि आपने इस समाधान का उपयोग किया, तो क्या आप मेरे जवाब को स्वीकार कर सकते हैं? धन्यवाद।
अमांडा गाइल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.