ফিল্টার করুন wp_nav_menu ()


9

আমি আমার নেভিগেশনকে তিনটি একক নেভিগেশন বারগুলিতে বিভক্ত করার চেষ্টা করি (স্তর 1, স্তর 2 এবং স্তর 3 +)। তিনটি কারণ তারা সাইটের উপর বিচ্ছিন্ন এবং তারা কেবল বর্তমান পৃষ্ঠার উপর নির্ভর করে উপস্থিত হওয়া উচিত appear

-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) কেবলমাত্র যখন বর্তমানে সম্পর্কিত প্যারেন্ট পৃষ্ঠায় থাকে। তৃতীয় নববারের ক্ষেত্রেও এটি একই রকম হয় (স্তর 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;
}

এটিকে আমার শিরোনামে ডেকে আছি ph পিপিপি: <?php my_nav_menu( array( 'echo' => false , 'navlevel' => 1 ) ); ?>

তবে $argsডিফল্ট মানগুলিতে সেট করা আছে এবং আমার কাস্টম এন্ট্রি navlevelফিল্টারটিতে প্রদর্শিত হয় না।

বর্ণিত হিসাবে আমি কীভাবে আমার নাবারকে বিভক্ত করতে পারি? আমি কীভাবে আমার কাস্টম- $argsকেন্দ্র স্থাপন করব ?


2
শুভ দিন এবং WPSE এ স্বাগতম। আমি আপনাকে প্রথম টাইমার জন্য একটি মহাকাব্য নির্মিত প্রশ্নে অভিনন্দন জানাতে হবে। সুনির্দিষ্টভাবে নির্মিত প্রশ্নগুলি ভাল উত্তরগুলির সাথে সর্বদা মনোযোগ আকর্ষণ করে। +1
পিটার গুজন

3
এর উত্তরে একটি কাস্টম ওয়াকার ক্লাস জড়িত, সম্ভবত এটি কোনও সম্ভাব্য উত্তরদাতাদের সহায়তা করবে
টম জে নওয়েল

ধন্যবাদ. আমি কেবল এই সপ্তাহান্তে পিএইচপি / ডাব্লুপিপি খনন করেছি তাই আমি এই পরিচিত না। আমি একটি কাস্টম ওয়াকার চেষ্টা করেছিলাম, তবে ওয়াকার একবারে কেবল একটি একক আইটেম পরিচালনা করে, তাই আমি এটি বর্তমান আইটেমটির সাথে তুলনা করতে পারি না। এবং একটি ফিল্টার আমার কাস্টম যুক্তি গ্রহণ করে না।
হুম

উত্তর:


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পরিবর্তে ookুকিয়ে দিয়েছি wp_nav_menu_objects। ফিল্টারিং নিয়ে আমার এখনও সমস্যা আছে তবে এটি সম্ভবত কিছু লজিক্যাল বাগ ...

সম্পাদনা করুন: আমি ন্যাভবার স্তর 2 এবং নাবার বার স্তর 3+ কে এক করে মিশিয়ে এবং সিএসএস দিয়ে আলাদা করে আমার সমস্যার সমাধান করব

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

প্রথম নজরে আমার কাছে ভাল লাগছে। আপনার কি সেই কোড নিয়ে সমস্যা আছে? সিডনোট: আপনি আপনার প্রথম বিবৃতিটি সংক্ষিপ্ত করতে পারেন:$echo = ! isset( $args['echo'] ) ?: $args['echo'];
কায়সার

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

স্পষ্টতই "ব্লক" কে "ইনলাইন-ব্লক" বা আপনার মেনুগুলিতে সাধারণত সেট করা আছে তার সাথে প্রতিস্থাপন করুন।

ক্লাসের সঠিক সংমিশ্রণটি পেতে আপনার চারপাশে খেলার প্রয়োজন হতে পারে তবে এই পদ্ধতির সাথে আমার আগে ভাগ্য ভালো ছিল। ডাব্লুপি সেখানে এক টন ক্লাস ড্রপ করে, সম্ভবত সেগুলি ব্যবহার করতে পারে।


ধন্যবাদ, আমি আমার এনএভি বারগুলির জন্য সিএসএসে কয়েকটি ক্লাস ব্যবহার করব! :)
সংবেদনহীন

আপনি যদি এই সমাধানটি ব্যবহার করে শেষ করেন তবে আপনি কি দয়া করে আমার উত্তরকে স্বীকৃত হিসাবে চিহ্নিত করতে পারেন? ধন্যবাদ.
আমন্ডা গাইলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.