I managed to resolve this issue using wp_list_pages, but it was not sorted according to custom menu sort order. So I made this simple custom walker and it worked.
(This link helped me in adding has_children property to menu items).
class SplitMenu_Walker_Nav_Menu extends Walker_Nav_Menu {
var $startMenu = false;
function start_lvl(&$output, $depth) {
}
function end_lvl(&$output, $depth) {
$this->startMenu = false;
}
function start_el(&$output, $item, $depth, $args) {
if(($args->has_children && $item->current) || $item->current_item_parent)
$this->startMenu = true;
if($this->startMenu && $depth > 0)
parent::start_el($output, $item, $depth, $args);
}
function end_el(&$output, $item, $depth) {
if( $this->startMenu )
parent::end_el($output, $item, $depth);
}
function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {
$id_field = $this->db_fields['id'];
if ( is_object( $args[0] ) ) {
$args[0]->has_children = ! empty( $children_elements[$element->$id_field] );
}
return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
}
}
This code is tested with single level of sub menus only.
How to use:
- Copy above code and paste into your theme's functions.php
- Pass an object of walker class to your 'wp_nav_menu' function:
wp_nav_menu(
array (
'menu' => 'main-menu',
'walker' => new SplitMenu_Walker_Nav_Menu
)
);
