Recuperar una lista de elementos de menú en un array
Actualmente estoy trabajando en un tema personalizado. En este tema, tengo un menú que registré usando register-nav-menu
, y luego estoy mostrando el menú en mi página web usando la función wp_nav_menu
.
Sin embargo, me gustaría recuperar solo la lista de elementos del menú (solo los nombres reales de los elementos del menú que se usaron en el área de wp-admin para crear el menú, y sin ningún HTML), y me gustaría guardar esa lista de elementos en un array (es decir, no mostrarla).
Entonces, un código de ejemplo se vería así:
$menu_items = get_list_of_items($name_of_menu); // $name_of_menu es el resultado de register-nav-menu, y get_list_of_items es la función de ejemplo
foreach ($menu_items as $item) {
// hacer algo con el elemento
}
¿Hay alguna manera de hacer esto? Gracias.

Como menciona @vancoder, wp_get_nav_menu_items()
es la función a utilizar, sin embargo creo que una respuesta más detallada sería más útil para las personas en el futuro.
Dicha función retorna un array de objetos WP_Post Object
(por lo que accedes a los valores con una flecha, ej. $item->title
).
Para una configuración básica, podrías usar lo siguiente:
$menuLocations = get_nav_menu_locations(); // Obtiene nuestras ubicaciones de menú (establecidas en nuestro tema, usualmente en functions.php)
// Esto retorna un array de ubicaciones de menú ([NOMBRE_UBICACION] = ID_MENU);
$menuID = $menuLocations['primary']; // Obtiene el ID del menú *principal*
$primaryNav = wp_get_nav_menu_items($menuID); // Obtiene el array de objetos wp, los elementos del menú para nuestra ubicación consultada.
Luego puedes iterar sobre esa variable $primaryNav
, por ejemplo:
foreach ( $primaryNav as $navItem ) {
echo '<li><a href="'.$navItem->url.'" title="'.$navItem->title.'">'.$navItem->title.'</a></li>';
}

wp_get_nav_menu_items parece ser exactamente lo que necesitas. Devuelve un array de objetos del menú.

Versión modificada del código anterior con bucles recursivos.
Añadir al archivo functions.php
function wp_get_menu_array($current_menu='Menú Principal') {
$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;
}

Obtener un array simple del menú.
Añadir a Functions.php
function wp_get_menu_array($current_menu) {
$array_menu = wp_get_nav_menu_items($current_menu);
$menu = array();
foreach ($array_menu 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'] = array();
}
}
$submenu = array();
foreach ($array_menu as $m) {
if ($m->menu_item_parent) {
$submenu[$m->ID] = array();
$submenu[$m->ID]['ID'] = $m->ID;
$submenu[$m->ID]['title'] = $m->title;
$submenu[$m->ID]['url'] = $m->url;
$menu[$m->menu_item_parent]['children'][$m->ID] = $submenu[$m->ID];
}
}
return $menu;
}
Ir al Header y llamar a la función
<?php
$a = wp_get_menu_array('top-menu-header');
print_r($a); exit;
?>
