Как вариант, можно просто зная ID меню получить массив ссылок, а потом уже делать с ним всё, что понадобится. Например: (взято из реального проэкта - ID 'top', прохожусь по всем пунктам два раза. Первый - ищу элементы первого уровня, второй - второго. Но это в случае, если мы знаем наверняка, что будет только два уровня меню. Если из много, нужно использовать рекурсию).
function render_top_menu() {
$locations = get_nav_menu_locations();
$menu = wp_get_nav_menu_object( $locations['top'] );
$menu_items = wp_get_nav_menu_items( $menu->term_id );
$display_menu = array();
foreach ( $menu_items as $menu_item ) {
if ( $menu_item->menu_item_parent == 0 ) {
$display_menu[ $menu_item->ID ] = array(
'title' => get_the_title( $menu_item->object_id ),
'url' => get_permalink( $menu_item->object_id )
);
}
}
foreach ( $menu_items as $menu_item ) {
if ( $menu_item->menu_item_parent !== '0' ) {
$display_menu[ $menu_item->menu_item_parent]['child'][] = array(
'title' => get_the_title( $menu_item->object_id ),
'url' => get_permalink( $menu_item->object_id )
);
}
}
echo '<div class="header-menu">';
foreach ( $display_menu as $display_menu_item ) {
echo '<div class="header-menu-item"><a href="' . $display_menu_item['url'] . '"class="header-menu-link"><span>' . $display_menu_item['title'] . '</span></a>';
if ( is_array( $display_menu_item['child'] ) ) {
echo '<div class="header-menu-drop"><div class="header-menu-drop-items">';
foreach ( $display_menu_item['child'] as $submenu ) {
echo '<a href="' . $submenu["url"] . '" class="header-menu-drop-item">' . $submenu["title"] . '</a>';
}
echo '</div></div>';
}
echo '</div>';
}
echo '</div>';
}