কাস্টম এনএভি ওয়াকার বর্তমান মেনু আইটেম বাচ্চাদের বা কোনও সন্তানের ভাইবোনদের প্রদর্শন করে


14

আমি ঘন্টাখানেক ঘোরাফেরা করছি / অনুসন্ধান করেছি এবং এখনও এটি কাজ করতে পারি না, তাই অবশেষে আমি দিয়ে যাচ্ছি এবং কিছু সহায়তা চাইছি।

আমি একটি কাস্টম ওয়াকার লেখার চেষ্টা করছি যা কেবলমাত্র বর্তমান পৃষ্ঠাগুলির বাচ্চাদের দেখায় বা যদি কোনও শিশু নেই তবে পৃষ্ঠাগুলি ভাইবোন প্রদর্শন করে।

উদাহরণস্বরূপ, নিম্নলিখিত মেনু ট্রিটি নিন:

  • 1.0
    • 1.2.0
      • 1.3.0
      • 1.3.1
      • 1.3.2
    • 1.2.1
    • 1.2.2
  • 2.0

আসুন ধরে নেওয়া যাক আমি বর্তমান পৃষ্ঠায় ২.২.০। এই পৃষ্ঠায় আমি এটির শিশুদের প্রদর্শন করতে চাই (1.3.0, 1.3.1, 1.3.2)

যাইহোক, আমি যদি এই পৃষ্ঠাটিতে ১.২.২ এ আছি, যেহেতু এটির কোনও সন্তান নেই, এটি বর্তমান স্তরের ভাইবোনদের প্রদর্শন করা উচিত, সুতরাং এটি আমাকে দেখানো উচিত (১.২.০, ১.২.১, ১.২.২)


4
দয়া করে আপনার সমাধানটিকে একটি উত্তরের দিকে নিয়ে যান যাতে এটি অন্যের জন্য আরও স্পষ্ট হয় এবং প্রশ্নগুলি সাইটটিকে অনুতৃত্ত হিসাবে ভাবি না।
বিরল

@ রর্স্ট কি বলেছে! আমি প্রায় মিস করেছি যে আপনি একটি সমাধান নিয়ে এসেছেন।
ক্রিস ক্রাইচো

Necro উত্তর। আমি প্রায় 2 বছর আগে খুব ভাল উত্তর দিয়ে এসও-তে কম-বেশি একই প্রশ্নটি জিজ্ঞাসা করেছি। stackoverflow.com/questions/5826609/…
Stoosh

প্রশ্নের উত্তর পৃথক উত্তর সরানো হয়েছে। ওপি: দয়া করে সেখানে অনুসরণ করুন।
কায়সার

উত্তর:


4

এটি হ'ল ওয়াকার আমি বর্তমান মেনু আইটেমের কেবলমাত্র শিশুদের প্রদর্শন করতে ব্যবহার করি। অথবা মেনুটি ভাইবোনদের আইটেম দেয় যদি এটির নিজস্ব কোনও সন্তান না থাকে।

প্রতিটি বিভাগে ব্যাখ্যা করে ক্লাস জুড়ে মন্তব্য রয়েছে

<?php

class SH_Child_Only_Walker extends Walker_Nav_Menu {

private $ID;
private $depth;
private $classes = array();
private $child_count = 0;
private $have_current = false;


// Don't start the top level
function start_lvl(&$output, $depth=0, $args=array()) {

    if( 0 == $depth || $this->depth != $depth )
        return;

    parent::start_lvl($output, $depth,$args);
}

// Don't end the top level
function end_lvl(&$output, $depth=0, $args=array()) {
    if( 0 == $depth || $this->depth != $depth )
        return;

    parent::end_lvl($output, $depth,$args);
}

// Don't print top-level elements
function start_el(&$output, $item, $depth=0, $args=array()) {

    $is_current = in_array('current-menu-item', $this->classes);

    if( 0 == $depth || ! $is_current )
        return;

    parent::start_el($output, $item, $depth, $args);
}

function end_el(&$output, $item, $depth=0, $args=array()) {
    if( 0 == $depth )
        return;

    parent::end_el($output, $item, $depth, $args);
}

// Only follow down one branch
function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {

    // Check if element is in the current tree to display
    $current_element_markers = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor' );
    $this->classes = array_intersect( $current_element_markers, $element->classes );

    // If element has a 'current' class, it is an ancestor of the current element
    $ancestor_of_current = !empty($this->classes);

    // check if the element is the actual page element we are on.
    $is_current = in_array('current-menu-item', $this->classes);

    // if it is the current element
    if($is_current) {

        // set the count / ID / and depth to use in the other functions.
        $this->child_count = ( isset($children_elements[$element->ID]) ) ? count($children_elements[$element->ID]) : 0;
        $this->ID = $element->ID;
        $this->depth = $depth;
        $this->have_current = true;

        if($this->child_count > 0) {

            // if there are children loop through them and display the kids.
            foreach( $children_elements[$element->ID] as $child ) {
                parent::display_element( $child, $children_elements, $max_depth, $depth, $args, $output );
            }

        } else {
            // no children so loop through kids of parent item.
            foreach( $children_elements[$element->menu_item_parent] as $child ) {
                parent::display_element( $child, $children_elements, $max_depth, $depth, $args, $output );
            }

        }
    }

    // if depth is zero and not in current tree go to the next element
    if ( 0 == $depth && !$ancestor_of_current)
        return;

    // if we aren't on the current element proceed as normal
    if(! $this->have_current )
        parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
}
}

এটি কোনও wp_nav_menu- এ অন্য কোনও কাস্টম ওয়াকারের সাথে সংযুক্ত করুন

<?php
wp_nav_menu( array(
    'menu' => 'primary-menu'
    ,'container' => 'nav'
    ,'container_class' => 'subpages'
    ,'depth' => 0
    ,'walker' => new SH_Child_Only_Walker()
 ));
?>

আমি এখানে @ স্টুশের মন্তব্যকে নির্দেশ করে বলতে চাই। stackoverflow.com/questions/5826609/... হিসাবে এই অন্য ভাল সমাধান
jchamb

0

আমি একটি অনুরূপ অভিজ্ঞতা ছিল। আপনি পৃষ্ঠাগুলি যুক্তিকে ওয়াকার থেকে সরিয়ে নিয়ে যাওয়ার বিষয়ে ভাবতে চাইতে পারেন। মূলত, বর্তমান পৃষ্ঠার শ্রেণিবিন্যাসকে একটি অবজেক্ট হিসাবে সংকলন করুন। তারপরে wp_nav_menu ফাংশনে 'বাদ দিন' প্যারামিটারটি ব্যবহার করুন। এখন বাদ দেওয়া পৃষ্ঠাগুলি যদি বর্তমান পৃষ্ঠায় শিশু থাকে তবে তার উপর নির্ভর করবে। যদি কোন সন্তান ভাইদের না দেখায়; যদি বাচ্চাদের && শিশুরা যদি লাইনটির শেষ হয় তবে ভাই ও বাচ্চারা দেখায়; যদি বাচ্চাদের && এবং নাতি-নাতনিদের উপস্থিত থাকে তবে ভাইদেরকে বাদ দিন এবং শিশু এবং নাতি-নাতনিদের দেখান।


আপনি যে excludeপরামিতিটি উল্লেখ করেছেন তা কী? আমি নথিটি দেখছি এবং এর কোনও রেফারেন্স দেখতে পাচ্ছি না।
ক্রিস ক্র্যাচো

1
আমি ক্ষমাপ্রার্থী আমার ভুল ছিল। আপনি সঠিক যে কোনও 'বাদ' প্যারামিটার নেই। আমি "wp_list_pages" ফাংশনটি ব্যবহার করতে চাইছিলাম।
স্টিভ ফিশার

খুব ভাল, এবং কোন উদ্বেগ নেই। আমি অদ্ভুত ছিলাম যদি সেখানে অনির্ধারিত কিছু ছিল তবে পিছনের প্রান্তে — আমি এর আগে ঘটতে দেখেছি। পরিষ্কার করার জন্যে ধন্যবাদ! আমি wp_list_pages()এই প্রসঙ্গে ব্যবহার করার কথা ভাবিনি , তাই এটি একটি আকর্ষণীয় ধারণা।
ক্রিস ক্রাইচো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.