Nếu bạn nhìn vào việc thực hiện WP_Nav_Menu_Widget
lớ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_menu
triể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_menu
hà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' );
'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.