কাস্টম ওয়াকার: ফাংশন স্টার্ট_এলভিএল-এ কীভাবে আইডি পাবেন


15

অ্যাকর্ডিয়ান মেনুটি তৈরি করতে আমি আমার প্রথম কাস্টম ওয়াকার তৈরি করছি। শুরু করার জন্য আমি এই উদাহরণটি ব্যবহার করেছি: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

দুটি কাজ আছে। প্রথমে start_lvl এবং তারপরে start_el।

শুরুতে আইডিটি আইটেম-> আইডি দ্বারা প্রয়োগ করা হয়। কেউ কি জানেন যে আমি কীভাবে start_lvl এ এটি করতে পারি? আমাকে (আশেপাশের নিম্ন স্তরের নেভিগেশন) একটি আইডি দেওয়া দরকার যাতে আমি এ্যাকর্ডিয়ন মেনুতে ধসে পড়তে এটি ট্রিগার করতে পারি।

আমি যা উত্পন্ন করার চেষ্টা করছি তা হ'ল:

<a href="#collapse2">Titel 2</a>
<ul id="collapse2">Lower Level Menu 2</ul>
<a href="#collapse3">Titel 3</a>
<ul id="collapse3">Lower Level Menu  3</ul>

Start_lvl ফাংশনের জন্য আমার কোড:

// add id's and classes to ul sub-menus
function start_lvl( &$output, $depth, $item ) {
    // depth dependent classes
    $indent = ( $depth > 0  ? str_repeat( "\t", $depth ) : '' ); // code indent
    $display_depth = ( $depth + 1); // because it counts the first submenu as 0
    $pgid = ; // How to get ID in here??
    $classes = array(
        'sub-menu',
        ( $display_depth == 1  ? 'accordion-body collapse' : '' ),
        ( $display_depth % 2  ? 'menu-odd' : 'menu-even' ),
        ( $display_depth >=2 ? 'sub-sub-menu' : '' ),
        'menu-depth-' . $display_depth
        );
    $ids = array(
        'collapse' . $pgid
        );
    $class_names = implode( ' ', $classes );
    $id_name = implode( ' ', $ids );

    // build html
    $output .= "\n" . $indent . '<ul id="' . $id_name . '" class="' . $class_names . '">' . "\n";
}

উত্তর:


38

আমাকে কেবল আমার থিমগুলির একটিতে এটি করতে হয়েছিল ... যেহেতু ওয়াকারের সেই পর্যায়ে আপনার কাছে $ আইটেম ভেরিয়েবলের অ্যাক্সেস নেই, আপনি এই মুহুর্তে আপনার বর্তমান আইটেমটিকে আরও বৈশ্বিক পরিসরে সংরক্ষণ করতে চাইবেন এটি অ্যাক্সেস আছে। নিম্নলিখিত কোডটি আরও অর্থবোধ তৈরি করবে ... দ্রষ্টব্য: আমি প্রাসঙ্গিক কোড বাদে সবকিছু ছিনিয়ে নিয়েছি।

class ThemeTruck_Nav_Walker extends Walker_Nav_Menu {
   private $curItem;

  // retrieve the curItem
  function start_lvl(&$output, $depth = 0, $args = array()) {
    var_dump($this->curItem );
  }

  // store the curItem
  function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
    $this->curItem = $item;
  }

 }

3
এটি এই থ্রেডে উপস্থাপন করা সবচেয়ে মার্জিত সমাধান। ধন্যবাদ লেন!
কেভিন সি।

1
সত্যই একটি খুব পরিষ্কার পদ্ধতির যে ভাল কাজ করে। অনেক ধন্যবাদ.
আইজাক গ্রেগসন

1
আমি নিশ্চিত নই তবে এটিকে কাজ করার জন্য কি আমাকে পুরো ডিফল্ট কোডটি স্টার্ট_এলে যুক্ত করতে হবে?
জিডিওয়াই

4
ঠিক আছে আপনি কেবল প্যারেন্ট :: স্টার্ট_েল ($ আউটপুট, $ আইটেম, $ গভীরতা, gs আরগস, $ আইডি) ব্যবহার করতে পারেন; শুরুতে
জিডিওয়াই

উজ্জ্বল, যুগে যুগে এটি বের করার অর্থ এবং এখনই এটি কাজ করেছে। ধন্যবাদ.
সিএফএক্স

3

আমার একই রকম সমস্যা হয়েছিল এবং ক্লাসের অভ্যন্তরে স্ট্যাটিক ভেরিয়েবল ব্যবহার করে এটি সমাধান করা হয়েছে:

static protected $menu_lvl; 

এবং তারপরে "ডিসপ্লে_ইলেমেন্ট" এ আমি ভেরিয়েবলটি বাড়িয়েছি:

self::$menu_lvl++;

আমার কোডে আমি তখন start_lvl ফাংশনটিতে এরকম কিছু উল্লেখ করেছি:

$output .= "<ul id='level". self::$menu_lvl ."'>";

এটি পৃষ্ঠার আইডি ব্যবহার করে না তবে এটি উল স্টেটমেন্টের জন্য একটি অনন্য আইডি ব্যবহার করে যা জাভাস্ক্রিপ্ট দ্বারা উল্লেখ করা যেতে পারে।

বিটিডাব্লু - মোবাইল অ্যাপ্লিকেশনগুলির জন্য বুটস্ট্র্যাপ ব্যবহার করে রুটস থিমের নেস্টেড অ্যাকর্ডেন্সগুলি বা ক্লিকযোগ্য নেস্টেড ড্রপডাউনগুলির জন্য এটি সত্যিই কার্যকর।


2

আপনি আপনার start_elফাংশনে নীচের ফিল্টারটি ব্যবহার করতে পারেন এবং আপনার যুক্তিটি start_lvlফাংশনে গ্রাব করতে পারেন ।

apply_filters( 'walker_nav_menu_start_lvl', $item_output, $item, $depth, $args->myarg=$item->title );

এটি কাজ করে কিনা দয়া করে আমাকে জানান।


পোস্ট করার জন্য ধন্যবাদ! আমি আশা করি আগামী কয়েক দিনের মধ্যে এটি কার্যকর করার জন্য কিছু সময় খুঁজে পাব তবে আমি এখনই আমার পড়াশুনায় ব্যস্ত। আমি ফল নিয়ে আপনার কাছে ফিরে আসব!
রবার্ট বাউটেন

0

আপনি কেবল কাস্টম ওয়াকারের যুক্তিতে $ পৃষ্ঠা যুক্ত করতে পারেন:

class My_Custom_Walker extends Walker_page {
    function start_el(&$output, $page, $depth, $args, $current_page) {
        if ( $depth )
            $indent = str_repeat("\t", $depth);
        else
            $indent = '';

        extract($args, EXTR_SKIP);

        $output .= $indent . 
            '<li>
            <a style="color:red" href="' . get_page_link($page->ID) . '" title="' . 
            esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '">' . 
            $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';

উপরের চেষ্টা করুন এবং তারপরে আপনি wp_list_pages () কল করার আগে কাস্টম ওয়াকার শ্রেণি যুক্ত করুন:

$MyWalker = new My_Custom_Walker();

তারপরে, wp_list_pages এর জন্য যুক্তিগুলিতে:

wp_list_pages ('ওয়াকার' => $ মাইওয়াকার)

ওয়াকারের আউটপুট লাল কিনা তা পরীক্ষা করে দেখুন।


এটি ফাংশন স্টার্ট_এলে রয়েছে তবে এটি শুরু_এলভিএলে দৃশ্যত ভিন্ন কারণ কারণ আমি সেখানে একই ভেরিয়েবলগুলি রাখতে পারি না। বা কমপক্ষে একই আদেশ না।
রবার্ট বাউটেন

আপনি start_lvl দিয়ে কী করার চেষ্টা করছেন?
অ্যালেক্সভ্যালিজো

আমি 102 টি উত্পন্ন পৃষ্ঠার আইডি সহ <ul> একটি আইডি = "পতন 102" দেওয়ার চেষ্টা করছি। এইভাবে এটি আমার অ্যাকর্ডিয়ান মেনুতে এটি ভেঙে ফেলার জন্য এটি ট্রিগার করতে পারি।
রবার্ট বাউটেন

আইডি = "বিপর্যয়" যোগ করা কাজ করে, তবে পেজআইডি যুক্ত করার জন্য এটি কাজ করতে পারছি না।
রবার্ট বাউটেন

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