เพิ่มวอล์คเกอร์ที่กำหนดเองในเมนูที่สร้างขึ้นในวิดเจ็ต


10

ฉันรู้วิธีเพิ่มวอล์คเกอร์ในเมนูที่กำหนดเองที่สร้างขึ้นโดยธีม (เมนูที่มีชื่อprimaryในตัวอย่างนี้) แต่ฉันจะกำหนดเป้าหมายเมนูที่สร้างขึ้นในวิดเจ็ตด้วยวิดเจ็ตเมนูกำหนดเอง wordpress เริ่มต้นได้อย่างไร

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()ในอาร์กิวเมนต์ของเมนูเฉพาะของฉันเพื่อแทนที่มันอีกครั้งเพื่อให้กลายเป็นวอล์คเกอร์เริ่มต้น wordpress สำหรับเมนูเดียว แต่น่าเศร้าที่นี่ไม่ได้
amy

@ ใช่ใช่มันจะเป็นค่าเริ่มต้นสำหรับทุกเมนู
Eugene Manuilov

@amy คุณสามารถใส่รหัสเพื่อตรวจสอบ args จากนั้นให้ใส่เงื่อนไขหากคุณใช้วอล์คเกอร์หรือไม่
Wayne

4

ขยายคำตอบของ @ Eugene หากคุณต้องการ จำกัด สิ่งนี้ไว้ที่เมนูเฉพาะให้ตรวจสอบ ID ของเมนู:

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

เราจะกรองตามรหัสแถบด้านข้างได้อย่างไร
Steven Vachon

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'แทนบิต strpos () ด้านบน


1

คุณสามารถเพิ่มวอล์คเกอร์ที่กำหนดเองเพื่อเมนู nav สร้างขึ้นในเครื่องมือที่ใช้เป็นwidget_nav_menu_argsตัวกรองเพิ่มเข้ามาใน 4.2.0WordPress ยอมรับข้อโต้แย้งสี่ข้อ (ดู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.