Thêm một walker tùy chỉnh vào một menu được tạo trong một widget


10

Tôi biết cách thêm Walker vào menu tùy chỉnh được tạo bởi chủ đề (menu có tên primarytrong ví dụ này), nhưng làm cách nào tôi có thể nhắm mục tiêu menu được tạo trong tiện ích với tiện ích menu tùy chỉnh wordpress mặc định?

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

}

Câu trả lời:


14

Nếu bạn nhìn vào việc thực hiện WP_Nav_Menu_Widgetlớp, bạn sẽ thấy đoạn mã sau:

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'];
}

Nó có nghĩa là không có bất kỳ cơ hội để móc một menu. Vì vậy, bạn cần xem qua wp_nav_menutriển khai chức năng, nơi bạn có thể tìm thấy các dòng mã sau:

$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;

Ở đây bạn có thể thấy rằng tất cả các đối số được truyền cho wp_nav_menuhàm có thể được thay thế. Vì vậy, những gì bạn cần là tạo trình xử lý hook của riêng bạn sẽ thêm walker của bạn vào menu điều hướng. Nó có thể đơn giản như:

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

Điều này là rất tốt, cảm ơn bạn. Có vẻ như điều này làm mặc định cho tất cả các menu. Tôi có đúng không khi cho rằng khi tôi sử dụng cái này, tôi bị kẹt với tất cả các menu có máy tập đi này? bởi vì tôi đã cố gắng 'walker' => new Walker_Nav_Menu()trong các đối số của menu cụ thể của mình để ghi đè lại nó để trở thành walker mặc định wordpress cho chỉ một menu, nhưng thật đáng buồn là điều này không hoạt động.
amy

@amy vâng, nó sẽ được mặc định cho tất cả các menu.
Eugene Manuilov

@amy bạn có thể bao gồm mã để kiểm tra các đối số. Sau đó đặt một nếu có điều kiện cho dù bạn áp dụng xe tập đi hay không.
Wayne

4

Mở rộng câu trả lời của @ Eugene, nếu bạn muốn giới hạn điều này trong một menu cụ thể, chỉ cần kiểm tra ID thuật ngữ của menu:

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

Làm thế nào chúng ta sẽ lọc theo id thanh bên?
Steven Vachon

1

Đây là một thay thế để nhắm mục tiêu một menu bằng cách term_id và tôi nghĩ rằng nó có thể được sử dụng cho ai đó như là một cách sửa đổi một số menu mà không cần phải tìm id của họ.

Bằng cách thêm print_r($args)vào bộ lọc, tôi nhận thấy đó $args['menu']là một chuỗi cho các menu ở các vị trí chủ đề được xác định trước vàWP_Term_Object cho một tiện ích menu tùy chỉnh trong một thanh bên.

Tôi đã sử dụng điều này để nhắm mục tiêu các menu bằng cách sên và thêm một lớp vào thùng chứa của chúng. Một số menu có thể được nhắm mục tiêu bằng cách bao gồm một chuỗi chung trong sên của chúng. Lưu ý: slug menu xuất phát từ phím mảng trong 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' );

Đối với một menu đơn, bạn chỉ cần kiểm tra xem $args['menu']->{slug} == 'your-slug'thay vì bit strpose () ở trên.


1

Bạn có thể thêm một walker tùy chỉnh vào menu nav được tạo trong widget bằng widget_nav_menu_argsbộ lọc được thêm vào trong wordpress 4.2.0. Nó chấp nhận bốn đối số (xem wp-includes/widgets/class-wp-nav-menu-widget.php). Nhưng để chỉ thêm một walker tùy chỉnh, bạn chỉ cần sử dụng đối số đầu tiên, giống như cách bạn sử dụng wp_nav_menu_argsbộ lọc.

    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(),
       ) );
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.