विजेट में बनाए गए मेनू में एक कस्टम वॉकर जोड़ें


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()अपने विशिष्ट मेनू के तर्कों में इसे केवल एक मेनू के लिए वर्डप्रेस डिफ़ॉल्ट वॉकर बनने के लिए फिर से ओवरराइड करने का प्रयास किया, लेकिन दुख की बात है कि यह काम नहीं करता है।
एमी

@ हाँ, यह सभी मेनू के लिए डिफ़ॉल्ट होगा।
यूजीन मनुइलोव

@ आप आर्ग की जांच करने के लिए कोड शामिल कर सकते हैं। फिर एक सशर्त डालें कि क्या आप वॉकर को लागू करते हैं या नहीं।
वेन

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(),
       ) );
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.