একটি উইজেটে তৈরি মেনুতে কাস্টম ওয়াকার যুক্ত করুন


10

আমি জানি কীভাবে থিমের তৈরি কাস্টম মেনুতে এই ওয়াকারকে যুক্ত করতে হয় ( primaryএই উদাহরণে নামযুক্ত মেনু ) তবে কীভাবে আমি ডিফল্ট ওয়ার্ডপ্রেস কাস্টম মেনু উইজেটের সাহায্যে উইজেটে তৈরি মেনুটিকে লক্ষ্য করব?

if ( has_nav_menu( 'primary' ) ) {

$args = array(
    'menu' => 'main-menu',
    'menu_id' => 'main-menu',
    'theme_location' => 'primary',
    'depth' => 0,
    'container' => false,
    'menu_class' => 'nav',
    'walker' => new Myprefix_Walker_Nav_Menu(),
    'echo' => 0
);

$nav = wp_nav_menu( $args );

}

উত্তর:


14

আপনি যদি WP_Nav_Menu_Widgetশ্রেণীর প্রয়োগের দিকে লক্ষ্য করেন তবে নীচের কোডটি দেখতে পাবেন:

function widget($args, $instance) {
    // Get menu
    $nav_menu = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false;

    if ( !$nav_menu )
        return;

    $instance['title'] = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );

    echo $args['before_widget'];

    if ( !empty($instance['title']) )
        echo $args['before_title'] . $instance['title'] . $args['after_title'];

    wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu ) );

    echo $args['after_widget'];
}

এর অর্থ মেনু হুক করার কোনও সুযোগ নেই। সুতরাং আপনাকে wp_nav_menuফাংশন বাস্তবায়নের উপর নজর দেওয়া দরকার , যেখানে আপনি নীচের কোডের লাইনগুলি পেতে পারেন:

$defaults = array(
  'menu' => '',
  'container' => 'div',
  'container_class' => '',
  'container_id' => '',
  'menu_class' => 'menu',
  'menu_id' => '',
  'echo' => true,
  'fallback_cb' => 'wp_page_menu',
  'before' => '',
  'after' => '',
  'link_before' => '',
  'link_after' => '',
  'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>',
  'depth' => 0,
  'walker' => '',
  'theme_location' => ''
);

$args = wp_parse_args( $args, $defaults );
$args = apply_filters( 'wp_nav_menu_args', $args );
$args = (object) $args;

এখানে আপনি দেখতে পারেন যে wp_nav_menuফাংশনে পাস করা সমস্ত যুক্তি প্রতিস্থাপন করা যেতে পারে। সুতরাং আপনার যা প্রয়োজন তা হ'ল আপনার নিজস্ব হুক হ্যান্ডলার তৈরি করা যা আপনার ওয়াকারকে একটি নেভিগেশন মেনুতে যুক্ত করবে। এটি যেমন সহজ হতে পারে:

function myplugin_custom_walker( $args ) {
    return array_merge( $args, array(
        'walker' => new My_Custom_Walker(),
        // another setting go here ... 
    ) );
}
add_filter( 'wp_nav_menu_args', 'myplugin_custom_walker' );

এই মহান, আপনাকে ধন্যবাদ. দেখে মনে হচ্ছে এটি সমস্ত মেনুগুলির জন্য ডিফল্ট করে। আমি কি ধরে নিতে পারি যে আমি যখন এটি ব্যবহার করি তখন আমি এই ওয়াকারের সাথে সমস্ত মেনুতে আটকে আছি? কারণ আমি 'walker' => new Walker_Nav_Menu()আমার নির্দিষ্ট মেনুতে যুক্তি দিয়ে চেষ্টা করেছি এটি আবার ওভাররাইড করার জন্য মাত্র একটি মেনুতে ওয়ার্ডপ্রেস ডিফল্ট ওয়াকার হয়ে উঠেছে, তবে দুঃখের বিষয় এটি কাজ করে না।
এএম

@ হ্যাঁ হ্যাঁ এটি সমস্ত মেনুতে ডিফল্ট হবে।
ইউজিন মানুয়িলভ

@ সাময়িকভাবে আপনি আরগগুলি পরীক্ষা করার জন্য কোড অন্তর্ভুক্ত করতে পারেন। তারপরে আপনি ওয়াকার প্রয়োগ করেন কিনা তা শর্তযুক্ত রাখুন put
ওয়েইন

4

@ ইউজিনের উত্তরটি প্রসারিত করে, আপনি যদি এটি নির্দিষ্ট মেনুতে সীমাবদ্ধ রাখতে চান তবে কেবল মেনুটির আইডি শব্দটি পরীক্ষা করুন:

function custom_nav_args($args){
$menu = $args['menu'];
    if($menu->term_id === 17)  /* replace term_id with menu id, or use $menu->name to do it by menu name*/
    {
        $args['walker'] = new My_Custom_Walker();
    }
    return $args;
}
add_filter('wp_nav_menu_args', 'custom_nav_args');

আমরা কীভাবে সাইডবার আইডি দিয়ে ফিল্টার করব?
স্টিভেন ওয়াচন

1

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

যোগ করে print_r($args)একটি ফিল্টার, আমি লক্ষ্য করেছি যে, $args['menu']পূর্বনির্ধারিত থিম অবস্থানে এবং মেনু জন্য একটি স্ট্রিং WP_Term_Objectএকটি সাইডবারে একটি কাস্টম মেনু উইজেট জন্য।

আমি এটি স্লাগ দ্বারা মেনুগুলিকে টার্গেট করতে এবং তাদের ধারকটিতে একটি ক্লাস যুক্ত করতে ব্যবহার করেছি। অনেকগুলি মেনু তাদের স্লাগগুলিতে একটি সাধারণ স্ট্রিং অন্তর্ভুক্ত করে লক্ষ্যবস্তু হতে পারে। দ্রষ্টব্য: মেনু স্লাগ ইন অ্যারে কী থেকে আসে register_nav_menus()

function my_menu_thingy( $args ) {
  if( is_object($args['menu']) && strpos($args['menu']->{slug},'my-common-string') !== false ) {
    $args['walker'] = new My_Custom_Walker();
  }
  return $args;
}
add_filter( 'wp_nav_menu_args', 'my_menu_thingy' );

একটি একক মেনুর $args['menu']->{slug} == 'your-slug'জন্য আপনার উপরের স্ট্রপোস () এর চেয়ে কিছুটা উপরে গিয়ে পরীক্ষা করা দরকার ।


1

আপনি widget_nav_menu_argsওয়ার্ডপ্রেসে যুক্ত ফিল্টারটি ব্যবহার করে একটি উইজেটে তৈরি একটি এনএভি মেনুতে কাস্টম ওয়াকার যুক্ত করতে পারেন 4.2.0। এটি চারটি যুক্তি গ্রহণ করে (দেখুন wp-includes/widgets/class-wp-nav-menu-widget.php)। তবে কেবলমাত্র একটি কাস্টম ওয়াকার যুক্ত করতে আপনাকে প্রথম যুক্তিটি ব্যবহার করতে হবে, আপনি wp_nav_menu_argsফিল্টারটি একইভাবে ব্যবহার করতে পারেন ।

    add_filter('wp_nav_menu_args', 'my_args'); //for menus
    add_filter('widget_nav_menu_args', 'my_args'); //for menus in widgets
    function my_args($args) { //$args is only argument needed to add custom walker
       return array_merge( $args, array(
          'walker' => new My_Custom_Walker(),
       ) );
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.