I would lean very much towards a custom walker for this but I think I’ve managed to make it work using part of that code and some of my own.
function add_position_classes_wpse_100781($classes, $item, $args) {
static $fl;
if (0 == $item->menu_item_parent) {
$fl = (empty($fl)) ? 'first' : 'middle';
$classes[] = $fl.'-menu-item';
}
return $classes;
}
add_filter('nav_menu_css_class','add_position_classes_wpse_100781',1,3);
function replace_class_on_last_occurance_wpse_100781($output) {
$output = substr_replace(
$output,
'last-menu-item ',
strripos($output, 'middle-menu-item'),
strlen('middle-menu-item')
);
return $output;
}
add_filter('wp_nav_menu', 'replace_class_on_last_occurance_wpse_100781');
What I did was add first-menu-item
and middle-menu-item
to top level items only with the first filter on nav_menu_css_class
. Then with the second filter I replaced the last occurrence of middle-menu-item
with last-menu-item
.
It works for the few test cases I tried.