Remove all nav menu classes ( but keep useful ones… )

I’m trying to remove all menu-item classes (except for .current-menu-{item/parent/ancestor} and .menu-item-has-children)

function custom_nav_menu_css_class($classes) {
    $classes = preg_replace('/^((menu|page)[-_w+]+)+/', '', $classes);
    return $classes;
}
add_filter('nav_menu_css_class', 'custom_nav_menu_css_class');

This almost does the job, except it removes .menu-item-has-children? Any idea what I should change, to exclude it from being removed?

Read More

(P.S. I’d rather not use a custom walker…)

Related posts

1 comment

  1. You could work with a white-list and replace the regular expression with something more readable:

    add_filter( 'nav_menu_css_class', function( $classes ) {
    
        $allowed = [
            'menu-item-has-children',
            'current-menu-item'
        ];
    
        return array_intersect( $classes, $allowed );
    });
    

    That would make it easier to maintain the white-list too.

Comments are closed.