将自定义沃克添加到小部件中创建的菜单


10

我知道如何将Walker添加到由主题创建的自定义菜单(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 );

}

Answers:


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默认行进器,但遗憾的是这不起作用。
艾米2012年

@amy是,它将是所有菜单的默认设置。
尤金·马努洛夫

@amy您可以包括检查args的代码。然后将是否应用助步器作为前提条件。
韦恩

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

我们将如何通过侧边栏ID进行过滤?
史蒂文·瓦雄

1

这是按菜单定位菜单的一种替代方法term_id,我认为它可能对某人有用,因为它可以修改多个菜单而无需查找其ID。

通过添加print_r($args)到过滤器,我注意到这$args['menu']是预定义主题位置WP_Term_Object中的菜单和侧边栏中的自定义菜单小部件的字符串。

我用它来以slug定位菜单,并向其容器添加一个类。通过在子菜单中包含通用字符串,可以定位许多菜单。注意:菜单项来自中的阵列键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

您可以使用widget_nav_menu_args在wordpress中添加的过滤器,将自定义行者添加到在小部件中创建的导航菜单中4.2.0。它接受四个参数(请参阅参考资料wp-includes/widgets/class-wp-nav-menu-widget.php)。但是,仅添加一个自定义walker,您只需要使用第一个参数即可,就像使用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(),
       ) );
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.