wp_nav_menu更改子菜单类名?

Cam*_*Cam 62 wordpress

有没有办法将<ul class="sub-menu">Wordpress本身生成的子项更改为自定义类名?

我知道你可以删除或更改名称的父级ul <ul>

我找不到......试过了'menu_class' => 'newname' :D对我来说似乎是合乎逻辑的,但显然这不是正确的......

有任何想法吗?

Ric*_*d M 92

没有选项,但你可以扩展Wordpress用来创建菜单HTML的'walker'对象.只需要覆盖一个方法:

class My_Walker_Nav_Menu extends Walker_Nav_Menu {
  function start_lvl(&$output, $depth) {
    $indent = str_repeat("\t", $depth);
    $output .= "\n$indent<ul class=\"my-sub-menu\">\n";
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你只需将你的助行器实例作为参数传递给wp_nav_menu:

'walker' => new My_Walker_Nav_Menu()
Run Code Online (Sandbox Code Playgroud)

  • @Drai我也得到了这个警告并通过这个小调整解决了.`class My_Walker_Nav_Menu扩展了Walker_Nav_Menu {function start_lvl(&$ output,$ depth = 0,$ args = Array()){$ indent = str_repeat("\ t",$ depth); $ output.="\n $ indent <ul class = \"mp-level \"> \n"; } (7认同)
  • 我会先检查$ depth是否正确。如果某些广告在自定义菜单上出现了新的层次,则您不希望菜单混乱 (2认同)
  • 请参阅我的回答:/sf/answers/3126626471/。也许在编写最佳答案时该资源尚不可用,但我认为这是实现所要求的更简洁的方法。 (2认同)

vra*_*lle 19

替换类:

echo str_replace('sub-menu', 'menu menu_sub', wp_nav_menu( array(
    'echo' => false,
    'theme_location' => 'sidebar-menu',
    'items_wrap' => '<ul class="menu menu_sidebar">%3$s</ul>' 
  ) )
);
Run Code Online (Sandbox Code Playgroud)

  • 简单,直接,并解决问题. (3认同)

小智 14

您可以使用WordPress preg_replace过滤器(在您的主题functions.php文件中)示例:

function new_submenu_class($menu) {    
    $menu = preg_replace('/ class="sub-menu"/','/ class="yourclass" /',$menu);        
    return $menu;      
}

add_filter('wp_nav_menu','new_submenu_class'); 
Run Code Online (Sandbox Code Playgroud)


Jon*_*old 10

这是理查德所做的更新,它增加了一个"深度"指标.输出为0级,1级,2级等.

class UL_Class_Walker extends Walker_Nav_Menu {
  function start_lvl(&$output, $depth) {
    $indent = str_repeat("\t", $depth);
    $output .= "\n$indent<ul class=\"level-".$depth."\">\n";
  }
}
Run Code Online (Sandbox Code Playgroud)


Fla*_*bar 9

这是一个老问题,我不确定我提到的解决方案是否可以在您提出时提供,但我认为值得一提.您可以通过添加过滤器来实现您想要的效果nav_menu_submenu_css_class.请参阅下面的示例 - 您可以替换my-new-submenu-class所需的类:

function my_nav_menu_submenu_css_class( $classes ) {
    $classes[] = 'my-new-submenu-class';
    return $classes;
}
add_filter( 'nav_menu_submenu_css_class', 'my_nav_menu_submenu_css_class' );
Run Code Online (Sandbox Code Playgroud)


Luc*_*nte 8

您不需要扩展 Walker。这将:

function overrideSubmenuClasses( $classes ) {
    $classes[] = 'myclass1';
    $classes[] = 'myclass2';

    return $classes;
}
add_action('nav_menu_submenu_css_class', 'overrideSubmenuClasses');
Run Code Online (Sandbox Code Playgroud)


小智 5

就像它一直是这样,在我向网站写了一些东西之前已经找了很长时间,在我发布这里一分钟之后,我找到了我的解决方案.

它以为我会在这里分享它,所以其他人可以找到它.

//Add "parent" class to pages with subpages, change submenu class name, add depth class

    class Prio_Walker extends Walker_Nav_Menu {
    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ){
        $GLOBALS['dd_children'] = ( isset($children_elements[$element->ID]) )? 1:0;
        $GLOBALS['dd_depth'] = (int) $depth;
        parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }

     function start_lvl(&$output, $depth) {
    $indent = str_repeat("\t", $depth);
    $output .= "\n$indent<ul class=\"children level-".$depth."\">\n";
  }
}

add_filter('nav_menu_css_class','add_parent_css',10,2);
function  add_parent_css($classes, $item){
     global  $dd_depth, $dd_children;
     $classes[] = 'depth'.$dd_depth;
     if($dd_children)
         $classes[] = 'parent';
    return $classes;
}

//Add class to parent pages to show they have subpages (only for automatic wp_nav_menu)

function add_parent_class( $css_class, $page, $depth, $args )
{
   if ( ! empty( $args['has_children'] ) )
       $css_class[] = 'parent';
   return $css_class;
}
add_filter( 'page_css_class', 'add_parent_class', 10, 4 );
Run Code Online (Sandbox Code Playgroud)

这是我找到解决方案的地方:Wordpress支持论坛中的解决 方案