Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wordpress wp_导航_菜单更改子菜单类名?_Wordpress - Fatal编程技术网

Wordpress wp_导航_菜单更改子菜单类名?

Wordpress wp_导航_菜单更改子菜单类名?,wordpress,Wordpress,有没有办法将WordPress自身生成的子菜单更改为自定义类名 我知道父级您可以使用'menu\u class'=>'newname'删除或更改名称 我找不到答案。Itried“子菜单\u类”=>“自定义名称”。在我看来,这似乎合乎逻辑,但显然这不是正确的 有什么想法吗?没有这个选项,但是您可以扩展WordPress用于创建菜单HTML的“walker”对象。只需重写一个方法: class My_Walker_Nav_Menu extends Walker_Nav_Menu { functi

有没有办法将WordPress自身生成的子菜单更改为自定义类名

我知道父级
您可以使用
'menu\u class'=>'newname'
删除或更改名称

我找不到答案。Itried
“子菜单\u类”=>“自定义名称”
。在我看来,这似乎合乎逻辑,但显然这不是正确的


有什么想法吗?

没有这个选项,但是您可以扩展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";
  }
}

以下是Richard所做的更新,添加了一个“深度”指示器。输出为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";
  }
}
class UL\u class\u Walker扩展了Walker\u导航菜单{
函数启动(和$output,$depth){
$indent=str\u repeat(“\t”,$depth);
$output.=“\n$indent
    \n”; } }
就像往常一样,在写东西到网站之前找了很长时间,在我发布到这里一分钟后,我找到了我的解决方案

它以为我会在这里分享,这样别人就能找到它

//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 );
//将“父”类添加到具有子页面的页面,更改子菜单类名称,添加深度类
类Prio_Walker扩展了Walker_导航菜单{
函数显示元素($element,&$children_elements,$max_depth,$depth=0,$args,&$output){
$GLOBALS['dd_children']=(isset($children_elements[$element->ID])?1:0;
$GLOBALS['dd_depth']=(int)$depth;
父元素::显示元素($element、$children\u elements、$max\u depth、$depth、$args、$output);
}
函数启动(和$output,$depth){
$indent=str\u repeat(“\t”,$depth);
$output.=“\n$indent
    \n”; } } 添加过滤器(“导航菜单”css类“,“添加父级css”,10,2); 函数add\u parent\u css($classes,$item){ 全球$dd_深度,$dd_儿童; $classes[]=“depth”。$dd_depth; 如果($dd_儿童) $classes[]=“父级”; 返回$classes; } //将类添加到父页面以显示它们有子页面(仅适用于自动wp_导航_菜单) 函数add\u parent\u class($css\u class、$page、$depth、$args) { 如果(!empty($args['has_children'])) $css_class[]=“父级”; 返回$css_类; } 添加过滤器('page\u css\u class','add\u parent\u class',10,4);
这就是我找到解决方案的地方:

在上述情况下,我需要一个小的改动,我正在尝试放置,但我无法做到这一点, 您的输出将如下所示

<ul>
<li id="menu-item-13" class="depth0 parent"><a href="#">About Us</a>
<ul class="children level-0">
    <li id="menu-item-17" class="depth1"><a href="#">Sample Page</a></li>
    <li id="menu-item-16" class="depth1"><a href="#">About Us</a></li>
</ul>
</li>
</ul> 
我在找什么

<ul>
<li id="menu-item-13" class="depth0"><a class="parent" href="#">About Us</a>
<ul class="children level-0">
    <li id="menu-item-17" class="depth1"><a href="#">Sample Page</a></li>
    <li id="menu-item-16" class="depth1"><a href="#">About Us</a></li>
</ul>
</li>
</ul> 
在上面的一个示例中,我将父类放置在父锚链中,该锚链
  • 替换类:

    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>' 
      ) )
    );
    
    echo str_替换('sub-menu','menu-menu_-sub',wp_-nav_-menu(数组(
    “echo”=>错误,
    “主题位置”=>“侧边栏菜单”,
    “项目包装”=>“
      %3$s
    ” ) ) );
    我建议将cutomclass css类名替换为子菜单。 使用查找和替换:即查找:。customclass替换为。子菜单, 适合我。

    我必须改变:

    function start\u lvl(&$output,$depth)

    致:

    函数启动\u lvl(&$output,$depth=0,$args=array())

    因为我遇到了一个不兼容错误:

    严格标准:My_Walker_Nav_Menu::start_lvl()的声明应与Walker_Nav_Menu::start_lvl(&$output,$depth=0,$args=Array)兼容

    要更改默认的“子菜单”类名,有一个简单的方法。 您可以在wordpress文件中更改它

    位置:www/project_name/wp includes/nav-menu-template.php

    打开此文件,在第49行,使用自定义类更改子菜单类的名称

    也可以在子菜单旁边添加自定义类

    完成了


    我用的是wordpress-4.4.1。这可能对你有用

    如何为菜单项添加父类

    function wpdocs_add_menu_parent_class( $items ) {
    $parents = array();
    
    // Collect menu items with parents.
    foreach ( $items as $item ) {
        if ( $item->menu_item_parent && $item->menu_item_parent > 0 ) {
            $parents[] = $item->menu_item_parent;
        }
    }
    
    // Add class.
    foreach ( $items as $item ) {
        if ( in_array( $item->ID, $parents ) ) {
            $item->classes[] = 'menu-parent-item';
        }
    }
    return $items;
     }
    add_filter( 'wp_nav_menu_objects', 'wpdocs_add_menu_parent_class' );
    
    /**
     * Add a parent CSS class for nav menu items.
     * @param array  $items The menu items, sorted by each menu item's menu order.
     * @return array (maybe) modified parent CSS class.
    */
    
    向菜单项添加条件类

    function wpdocs_special_nav_class( $classes, $item ) {
        if ( is_single() && 'Blog' == $item->title ) {
        // Notice you can change the conditional from is_single() and $item->title
        $classes[] = "special-class";
    }
    return $classes;
    }
    add_filter( 'nav_menu_css_class' , 'wpdocs_special_nav_class' , 10, 2 );
    

    参考:

    您可以使用WordPresspreg\u replace过滤器(在您的theme functions.php文件中) 例如:


    这是一个老生常谈的问题,我不确定我要提到的解决方案在你提问时是否可用,但我认为值得一提。您可以通过向
    nav\u menu\u子菜单\u css\u 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' );
    

    你可以用钩子

    add_filter( 'nav_menu_submenu_css_class', 'some_function', 10, 3 );
    function some_function( $classes, $args, $depth ){
        foreach ( $classes as $key => $class ) {
        if ( $class == 'sub-menu' ) {
            $classes[ $key ] = 'my-sub-menu';
        }
    }
    
    return $classes;
    }
    
    在哪里

    $classes(array) - The CSS classes that are applied to the menu <ul> element.
    $args(stdClass) - An object of wp_nav_menu() arguments.
    $depth(int) - Depth of menu item. Used for padding.
    
    $classes(array)-应用于菜单
      元素的CSS类。 $args(stdClass)-wp_nav_menu()参数的对象。 $depth(int)-菜单项的深度。用于填充。
    您不需要延长助行器。这将有助于:

    function overrideSubmenuClasses( $classes ) {
        $classes[] = 'myclass1';
        $classes[] = 'myclass2';
    
        return $classes;
    }
    add_action('nav_menu_submenu_css_class', 'overrideSubmenuClasses');
    

    我会先检查$depth是否正确。你不想有一个混乱的菜单,如果一些广告一个新的水平的自定义菜单认为我是一个工具,但我似乎无法让这工作!我已经在
    functions.php
    文件中插入了代码的
    class
    部分&第二部分作为
    wp\u nav\u menu()中
    $defaults
    数组的一部分引用。这是正确的吗?@Richard M你知道这个调试错误是否可以修复吗?我试着用下面的字符串,结果出现了问题。我如何编辑您的以上答案以符合此标准?PHP严格标准:My_Walker_Nav_Menu::start_lvl()的声明应与Walker_Nav_Menu::start_lvl兼容
    $classes(array) - The CSS classes that are applied to the menu <ul> element.
    $args(stdClass) - An object of wp_nav_menu() arguments.
    $depth(int) - Depth of menu item. Used for padding.
    
    function overrideSubmenuClasses( $classes ) {
        $classes[] = 'myclass1';
        $classes[] = 'myclass2';
    
        return $classes;
    }
    add_action('nav_menu_submenu_css_class', 'overrideSubmenuClasses');