Как в стандартном Walker в Wordpress заменить sub menu на другой класс в более глубоких уровнях вложениях

Есть необходимость второго class'a подменю. То есть на 3-4 и более глубоких уровнях class sub-menu заменить на другой типо sub-sub-menu.


Ответы (1 шт):

Автор решения: Darth KYL

для этого не обязательно использовать walker вы можете сделать это через фильтр nav_menu_submenu_css_class. Если нужно проставить класс глубины вложения для определенного меню вы можете использовать проверку на локацию меню используя параметры из переменной $args

add_filter( 'nav_menu_submenu_css_class', 'change_sub_menu_class_list', 10, 3 );

function change_sub_menu_class_list( $classes, $args, $deps ) {
    if ( $args->menu_location == 'menu-1' ) { 
        $classes[] = "menu-depth-{$deps}";
    }

    $classes[] = "menu-depth-{$deps}";

    return $classes;
}

либо если вы используете walker вам нужно переопределить метод start_lvl

public function start_lvl( &$output, $depth = 0, $args = null ) {
    if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
        $t = '';
        $n = '';
    } else {
        $t = "\t";
        $n = "\n";
    }
    $indent = str_repeat( $t, $depth );

    $classes = [ 'sub-menu' ];

    $classes[] = "menu-depth-{$depth}";

    $class_names = implode( ' ', apply_filters( 'nav_menu_submenu_css_class', $classes, $args, $depth ) );
    $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';

    $output .= "{$n}{$indent}<ul$class_names>{$n}";
} 
→ Ссылка