Wp_nav_menu () ব্যবহার করে মেনু গাছের একটি অংশ / শাখা প্রদর্শন করুন


109

আমার ডাব্লুপি অ্যাডমিনে একটি মেনু সংজ্ঞায়িত করা হয়েছে যা দেখতে এরকম দেখাচ্ছে:

বিকল্প পাঠ

আমি যখনই আমি কোনও প্যারেন্ট পৃষ্ঠায় থাকি তবে সমস্ত চাইল্ড লিঙ্কগুলি সাইডবারে প্রদর্শন করতে সক্ষম হতে চাই। উদাহরণস্বরূপ, যদি ব্যবহারকারী আমার "আমাদের সম্পর্কে" পৃষ্ঠায় থাকে তবে আমি সাইডবারে সবুজ হাইলাইট করা 4 টি লিঙ্কের একটি তালিকা চাই।

আমি ডাব্লিউপি_না_মেনু () এর জন্য ডকুমেন্টেশনটি দেখেছি এবং লিঙ্কগুলি উত্পন্ন করার সময় কোনও নির্দিষ্ট মেনুটির নির্দিষ্ট নোডটিকে সূচনা পয়েন্ট হিসাবে ব্যবহার করার জন্য নির্দিষ্ট করার কোনও অন্তর্নির্মিত উপায় বলে মনে হচ্ছে না।

আমি অনুরূপ পরিস্থিতির জন্য একটি সমাধান তৈরি করেছি যা পৃষ্ঠার পিতামাতার তৈরি সম্পর্কের উপর নির্ভর করে তবে আমি এমন একটি সন্ধান করছি যা মেনু সিস্টেমটি বিশেষত ব্যবহার করে। কোন সাহায্য প্রশংসা করা হবে।


2
সুতরাং আপনি কাস্টম মেনু হিসাবে পুরো মেনুটি বজায় রাখতে চান, তবে একটি কাস্টম ওয়াকার তৈরি করুন যা এটি কেবল সক্রিয় সাবট্রির প্রসারিত প্রদর্শন করে? এই কোডটি পছন্দ করুন তবে wp_list_pages এর পরিবর্তে wp_nav_menu প্রসারিত করবেন? আমি সম্প্রতি অনুরূপ কিছু করেছি এবং কোডটি পোস্ট করতে পারলে আপনি যা খুঁজছেন তা যদি হয় ...
সুবর্ণপ্লেস

1
@ গোল্ডেনাপলস, আমি ঠিক এই পরে রয়েছি। আপনি যদি উত্তর হিসাবে আপনার কোড পোস্ট করতে আপত্তি না করেন আমি খুব কৃতজ্ঞ হবে।
jessegavin

1
আমি অবাক হই যে এরূপ সুস্পষ্ট কার্যকর কার্যকারিতা ইতিমধ্যে এটি নির্মিত হয়নি। "সিএমএস" করে এমন কোনও সাইটের জন্য এটি সামগ্রিকভাবে দরকারী।
hakre

আমি উপরের সমস্যা বা অনুরূপ কিছু সমাধান করার চেষ্টা করছি। : একটি বিকল্প হিসাবে আমি একটি সিএসএস সমাধান এখানে নিয়ে এসেছেন stackoverflow.com/q/7640837/518169
hyperknot

উত্তর:


75

এটি এখনও আমার মনে ছিল তাই আমি এটি পুনর্বিবেচনা করেছি এবং এই সমাধানটি একসাথে রেখেছি, যা প্রসঙ্গে নির্ভর করে না অনেকটা:

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

ব্যবহার

$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 );

সুদৃ technique় কৌশল! আমি সম্ভবত এটি সম্পর্কে কিছু জিজ্ঞাসা করতে পারি: আপনি কীভাবে টেম্পলেটে তালিকাভুক্ত সাবমেনু পৃষ্ঠাগুলির সামগ্রী প্রদর্শন করবেন?
daniel.tosaba

2
@ daniel.tosaba আপনার Walker_Nav_Menuক্লাসে সাবক্লাস বা ফিল্টার ব্যবহার করতে হবে । মন্তব্যের জন্য সমস্ত মেনু স্টাফ পছন্দ করুন - এটি সম্পর্কে নতুন প্রশ্ন জিজ্ঞাসা করুন?


3
এরকম দুর্দান্ত উত্তর তোমাকে অনেক ধন্যবাদ. ওয়ার্ডপ্রেসের মধ্যে এটি সত্যই একটি ডিফল্ট বিকল্প হওয়া উচিত।
বিন্দু

3
সত্যিই ঝরঝরে। যদি কেউ আগ্রহী হন তবে একই কাজটি করতে কিন্তু পেজ আইডি দিয়ে, wp_filter_object_listলাইনটি পরিবর্তন করুনwp_filter_object_list( $items, array( 'object_id' => $args->submenu ), 'and', 'ID' );
বেন

14

@ গোল্ডেন্যাপলস: আপনার ওয়াকার ক্লাস কাজ করে না। তবে ধারণাটি সত্যিই ভাল। আমি আপনার ধারণার ভিত্তিতে একটি ওয়াকার তৈরি করেছি:

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

এখন আপনি ব্যবহার করতে পারেন:

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

আউটপুটটি বর্তমানের মূল উপাদান ধারণকারী একটি তালিকা এবং এটি শিশুরা (তাদের সন্তান নয়)। Def: রুট উপাদান: = শীর্ষ পৃষ্ঠার মেনু আইটেম যা বর্তমান পৃষ্ঠার সাথে সম্পর্কিত বা একটি বর্তমান পৃষ্ঠার পিতামাতা বা পিতামাতার একজন ...

এটি মূল প্রশ্নের সঠিক উত্তর দেয় না তবে প্রায়, যেহেতু এখনও শীর্ষ স্তরের আইটেম রয়েছে। এটি আমার পক্ষে ঠিক আছে, কারণ আমি সাইডবারের শিরোনাম হিসাবে শীর্ষ স্তরের উপাদানটি চাই। আপনি যদি এ থেকে পরিত্রাণ পেতে চান তবে আপনাকে প্রদর্শন_ এলিমেন্টকে ওভাররাইড করতে হতে পারে বা একটি HTML-পার্সার ব্যবহার করতে হবে।


12

হাই @ জেসেগাভিন :

ন্যাভ মেনুগুলি কাস্টম পোস্ট ধরণের এবং কাস্টম ট্যাক্সনোমির সংমিশ্রণে সংরক্ষণ করা হয়। প্রতিটি মেনু একটি কাস্টম ট্যাক্সনোমির টার্ম হিসাবে (যেমন "মেনু সম্পর্কে" পাওয়া যায় wp_terms) হিসাবে সংরক্ষণ করা হয় (যেমন nav_menu, এটি পাওয়া যায় wp_term_taxonomy))

প্রতিটি এনএভি মেনু আইটেম একটি পদে যেমন সংরক্ষণ করা হয় post_type=='nav_menu_item'(যেমন "ফার্ম সম্পর্কে" , পাওয়া wp_posts) এটিকে সাথে (পরবর্তী মেটা হিসাবে সংরক্ষিত বৈশিষ্ট্যাবলী wp_postmeta) একটি ব্যবহার meta_keyউপসর্গ _menu_item_*যেখানে _menu_item_menu_item_parentআপনার মেনু আইটেমের পিতা বা মাতা এনএভি মেনু আইটেম পোস্টের আইডি নয়।

মেনু ও মেনু আইটেম মধ্যে সম্পর্ক মধ্যে সংরক্ষিত হয় wp_term_relationshipsযেখানে object_idসম্পর্কিত $post->IDএনএভি মেনু আইটেম এবং $term_relationships->term_taxonomy_idমেনুতে সম্মিলিতভাবে সংজ্ঞায়িত সম্পর্কিত wp_term_taxonomyএবং wp_terms

আমি নিশ্চিত যে উভয়কেই আটকানো সম্ভব হবে 'wp_update_nav_menu'এবং 'wp_update_nav_menu_item'প্রকৃত মেনুগুলি তৈরি করা সম্ভব হবে wp_termsএবং সম্পর্কের একটি সমান্তরাল সেট তৈরি হবে wp_term_taxonomyএবং wp_term_relationshipsযেখানে প্রতিটি ন্যাভ মেনু আইটেম যা উপ-এনএভি মেনু আইটেমগুলি রয়েছে এটিও নিজস্ব ন্যাভ মেনু হয়ে যায়।

আপনি যে হুক করতে চান 'wp_get_nav_menus' (যা আমি কয়েক মাস আগে করছিলাম এমন কিছু অনুরূপ কাজের উপর ভিত্তি করে ডাব্লুপি ৩.০-এ যুক্ত করার পরামর্শ দিয়েছিলাম) যাতে আপনার উত্পন্ন নাভি মেনুগুলি প্রশাসকের ব্যবহারকারীর দ্বারা কারসাজির জন্য প্রদর্শিত না হয়, তা নাহলে তারা সত্যিই দ্রুত সিঙ্ক থেকে বেরিয়ে আসুন এবং তারপরে আপনার হাতে একটি ডেটা স্বপ্ন দেখাবে।

একটি মজাদার এবং দরকারী প্রকল্পের মতো মনে হচ্ছে, তবে এই মুহূর্তে অংশটি মোকাবিলার তুলনায় আমার সামান্য সামান্য কোড এবং টেস্টিং কারণ ডেটা সিঙ্ক্রোনাইজ করা যে কোনও কিছুই যখন সমস্ত বাগ বেরিয়ে আসে তখন (এবং কারণ) অর্থ প্রদান ক্লায়েন্টরা আমাকে কাজ শেষ করার জন্য চাপ দিচ্ছে। :) তবে উপরের তথ্যের সাথে সজ্জিত আমি বেশ প্রেরণাদায়ী ওয়ার্ডপ্রেস প্লাগইন বিকাশকারীরা চাইলে এটি কোড করতে পারে।

অবশ্যই আপনি এখন অনুধাবন করেন আপনি যদি কোডটি কোড করেন তবে আপনার এটি এখানে আবার পোস্ট করার বাধ্যবাধকতা রয়েছে যাতে আমরা সকলেই আপনার বিগ্রহ থেকে উপকৃত হতে পারি! :-)


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

@jessegavin - হ্যা, আপনি যদি কল করতে চান wp_nav_menu()তাহলে আপনি মেনু ক্লোন কারণ প্রয়োজন হবে wp_nav_menu()শক্তভাবে মেনু কাঠামো মিলিত হয় । অন্য বিকল্পটি হ'ল wp_nav_menu()কোডটি অনুলিপি করা এবং সাবমেনু হিসাবে প্রদর্শন করার জন্য প্রয়োজনীয় পরিবর্তনগুলি করা।
মাইকচিনকেলে

10

এটি একটি ওয়াকার এক্সটেনশন যা আপনাকে যা খুঁজছে তা করা উচিত:

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

}

এমফিল্ডসের কোডের ভিত্তিতে আমি আমার মন্তব্যে এর আগে উল্লেখ করেছি। বর্তমান উপাদানটি (1) বর্তমান মেনু আইটেম, বা (2) বর্তমান মেনু আইটেমের পূর্বপুরুষ কিনা তা দেখার জন্য মেনুটি হাঁটার সময় যা যা করা হয় তা যাচাই করা হয় এবং কেবলমাত্র যদি সেই শর্তগুলির মধ্যে সত্য হয় তবে তার নীচে সাবট্রিটি প্রসারিত করা হবে । আশা করি এটি আপনার পক্ষে কাজ করে।

এটি ব্যবহার করতে, আপনি মেনুটি কল করার সময় একটি "ওয়াকার" যুক্তি যুক্ত করুন, যেমন:

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

ওহ ... আমি আপনার প্রশ্নটি কেবল পুনরায় পড়েছি এবং বুঝতে পেরেছি যে আমি প্রথমে এটি ভুল বুঝেছি। এই ওয়াকার অন্য সমস্ত শীর্ষ-স্তরের মেনু আইটেমগুলি প্রদর্শন করবে, কেবল তাদের প্রসারিত করবে না। এটি আপনি যা করতে চেয়েছিলেন ঠিক তা নয়। তবুও, এই কোডটি আপনার যে কোনও উপায়ে পরিবর্তন করা যেতে পারে। $top_level_elementsকলটির আগে কেবল লুপটি দেখুন এবং নিজের পরীক্ষা যুক্ত করুন $this->display_element
সুবর্ণপ্লেস

বর্তমান সাবপেজটির গভীরতা প্রদর্শন করার জন্য এই শ্রেণিটি পাওয়া কি সম্ভব? তা হল .. যদি আমার তিন বা ততোধিক স্তরের গভীরতা থাকে তবে তৃতীয় এবং পরবর্তী স্তরগুলি বর্তমান (উপ) পৃষ্ঠার জন্য প্রদর্শিত হবে? এই মুহুর্তে, এটি কেবল এ> বি দেখায়, এবং না> সি (সি তৃতীয় (স্তর) হচ্ছে
জোলোমন

@ জোলোমন - আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি। এটি 'কারেন্ট-মেনু-আইটেম', 'কারেন্ট-মেনু-পিতামাতা', বা 'কারেন্ট-মেনু-পূর্বপুরুষ' ক্লাস সহ যে কোনও মেনু আইটেমের নীচে পুরো গাছটি প্রসারিত করা উচিত। আমি যখন এটি পরীক্ষা করি তখন এটি মেনুতে সমস্ত পৃষ্ঠার স্তরের প্রদর্শন করে। আপনি কি খুঁজছেন?
21:39

হতে পারে আপনি depthকলটিতে কোনও পরামিতিটি পাস করতে চান wp_nav_menu, যদি আপনার থিমটি কোনওভাবে 0 এর ডিফল্টটিকে অতিরিক্তভাবে চালিত করে (সমস্ত স্তর দেখায়)?
goldenapples

8

আপডেট: আমি এটি একটি প্লাগইন তৈরি করেছি। এখানে ডাউনলোড করুন


আমার নিজের এটি সমাধান করার দরকার ছিল এবং শেষ পর্যন্ত মেনু অনুসন্ধানের ফলাফলগুলিতে একটি ফিল্টার লিখে ফেললাম। এটি আপনাকে wp_nav_menuস্বাভাবিক হিসাবে ব্যবহার করতে দেয় , তবে পিতামাতার উপাদানটির শিরোনামের ভিত্তিতে মেনুটির একটি উপ-বিভাগ চয়ন করতে পারে । submenuমেনুতে এমন একটি প্যারামিটার যুক্ত করুন :

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

এমনকি স্ল্যাশগুলি রেখে আপনি কয়েকটি স্তর পর্যন্ত যেতে পারেন:

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

অথবা আপনি যদি অ্যারে দিয়ে পছন্দ করেন:

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

এটি শিরোনামের স্লাগ সংস্করণ ব্যবহার করে, যা এটি রাজধানী এবং বিরামচিহ্নের মতো জিনিসকে ক্ষমা করে দেয়।


আইডি মাধ্যমে সাবমেনু পৌঁছানো সম্ভব? মানে পৃষ্ঠা আইডি, বা পোস্ট আইডি।
ডিগার্কাম

বিভাজন () অবচয় করা হয়েছে, এর $loc = split( "/", $loc );সাথে প্লাগইনটিতে প্রতিস্থাপন করুন$loc = preg_split( "~/~", $loc );
ফ্লোরিস

আমি $ সাবমেনু optionচ্ছিক করার পরামর্শও দেব। সুতরাং আপনি প্রয়োজনের পরে পুরো মেনুটি আনতে পারেন। এটিকে ফিল্টারটিতে শীর্ষে যুক্ত করুন: `if (! Isset ($ args-> submenu)) {ফেরত $ আইটেমগুলি; } `
ফ্লোরিস

8

আমি নিজের জন্য নিম্নলিখিত ক্লাসটি একসাথে রেখেছি। এটি বর্তমান পৃষ্ঠার শীর্ষ নেভ পিতামাতার সন্ধান করবে, অথবা আপনি এটিকে ওয়াকার কনস্ট্রাক্টরে একটি টার্গেট শীর্ষ ন্যাভ আইডি দিতে পারেন।

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

নাভ কল:

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

4

@ ডেভিডন @ হ্যাক্রে হাই, আমার এইচটিএমএল-পার্সার বা ওভাররাইডিং ডিসপ্লে_ইলেট ছাড়াই একটি কুৎসিত সমাধান রয়েছে।

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

তাদের সকলের চেষ্টা করার পরেও আল্পের সমাধানটি আমার পক্ষে কাজ করেছিল। তবে এটি নিয়ে একটি সমস্যা। এটি কেবল প্রথম স্তরের শিশুদের শোতে প্রদর্শিত হয় তবে তৃতীয় বা চতুর্থ স্তরের শিশুদের প্রদর্শন করে না। এটি করার জন্য আমি কয়েকদিন ধরে চেষ্টা করেছি। যে কেউ তার সমাধানটিকে কীভাবে সংশোধন করবেন জানেন? গীত। এটি আমাকে মন্তব্য যুক্ত করতে দেবে না যাতে উত্তর হিসাবে এটি করা দরকার।
চিচিয়েরা

3

ন্যাভ মেনু আউটপুটটিতে বর্তমান আইটেম, বর্তমান আইটেম পূর্বপুরুষ ইত্যাদির জন্য প্রচুর ক্লাস রয়েছে some কেবল বর্তমান পৃষ্ঠার শিশুরা ইত্যাদি etc.


3

আমি একটি পরিবর্তিত ওয়াকার তৈরি করেছি যাতে সহায়তা করা উচিত! নিখুঁত নয় - এটি কয়েকটি খালি উপাদান রেখে দেয়, তবে এটি কৌশলটি করে। পরিবর্তনটি মূলত সেই $ কারেন্ট_ ব্র্যাঙ্ক বিট। আশা করি এটি কাউকে সাহায্য করবে!

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

আমার প্লাগইনে কোডটি দেখুন বা এটি আপনার উদ্দেশ্যে ব্যবহার করুন;)

এই প্লাগইনটি বর্ধিত "নেভিগেশন মেনু" উইজেট যুক্ত করে। এটি অনেকগুলি বিকল্প সরবরাহ করে যা উইজেটের মাধ্যমে কাস্টম মেনুটির আউটপুট কাস্টমাইজ করার জন্য সেট করা যেতে পারে।

বৈশিষ্ট্য অন্তর্ভুক্ত:

  • কাস্টম শ্রেণিবিন্যাস - "কেবলমাত্র সম্পর্কিত সাব-আইটেম" বা "কেবলমাত্র কঠোরভাবে সম্পর্কিত সাব-আইটেম"।
  • + ফ্ল্যাট ডিসপ্লে প্রদর্শনের জন্য গভীরতা এবং সর্বাধিক স্তর শুরু করা।
  • নির্বাচিতটির সাথে শুরু করে সমস্ত মেনু আইটেম প্রদর্শন করুন।
  • কেবলমাত্র বর্তমান উপাদান বা কেবল
    বাছাইকৃত আইটেমের শিশুদের জন্য সরাসরি পথ প্রদর্শন করুন (প্যারেন্ট আইটেম অন্তর্ভুক্ত করার বিকল্প)।
  • একটি উইজেট ব্লকের জন্য কাস্টম ক্লাস।
  • এবং wp_nav_menu ফাংশনের জন্য প্রায় সমস্ত পরামিতি।

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

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