Wordpress - Retrieving a list of menu items in an array
As @vancoder mentions, wp_get_nav_menu_items()
is the way to go, however I think a better detailed answer would be more helpful for people in the future.
Said function returns an array of WP_Post Object
objects (so you access the values with an arrow, eg. $item->title
).
For a basic setup, you could use the following:
$menuLocations = get_nav_menu_locations(); // Get our nav locations (set in our theme, usually functions.php)
// This returns an array of menu locations ([LOCATION_NAME] = MENU_ID);
$menuID = $menuLocations['primary']; // Get the *primary* menu ID
$primaryNav = wp_get_nav_menu_items($menuID); // Get the array of wp objects, the nav items for our queried location.
Then you can just loop over that $primaryNav
variable, for example:
foreach ( $primaryNav as $navItem ) {
echo '<li><a href="'.$navItem->url.'" title="'.$navItem->title.'">'.$navItem->title.'</a></li>';
}
wp_get_nav_menu_items would appear to be exactly what you require. It returns an array of menu objects.
Modified version of above with recursive loops.
Add To Functions.php
function wp_get_menu_array($current_menu='Main Menu') {
$menu_array = wp_get_nav_menu_items($current_menu);
$menu = array();
function populate_children($menu_array, $menu_item)
{
$children = array();
if (!empty($menu_array)){
foreach ($menu_array as $k=>$m) {
if ($m->menu_item_parent == $menu_item->ID) {
$children[$m->ID] = array();
$children[$m->ID]['ID'] = $m->ID;
$children[$m->ID]['title'] = $m->title;
$children[$m->ID]['url'] = $m->url;
unset($menu_array[$k]);
$children[$m->ID]['children'] = populate_children($menu_array, $m);
}
}
};
return $children;
}
foreach ($menu_array as $m) {
if (empty($m->menu_item_parent)) {
$menu[$m->ID] = array();
$menu[$m->ID]['ID'] = $m->ID;
$menu[$m->ID]['title'] = $m->title;
$menu[$m->ID]['url'] = $m->url;
$menu[$m->ID]['children'] = populate_children($menu_array, $m);
}
}
return $menu;
}