Recuperare un elenco di voci di menu in un array
Attualmente sto lavorando su un tema personalizzato. In questo tema, ho un menu che ho registrato usando register-nav-menu
, e poi lo visualizzo nella mia pagina web utilizzando la funzione wp_nav_menu
.
Tuttavia, vorrei recuperare solo l'elenco delle voci di menu (solo i nomi effettivi delle voci di menu utilizzati nell'area wp-admin per creare il menu, e senza HTML), e vorrei salvare quell'elenco di elementi in un array (cioè, non visualizzarlo).
Quindi, uno pseudo codice sarebbe così:
$menu_items = get_list_of_items($name_of_menu); // $name_of_menu è il risultato di register-nav-menu, e get_list_of_items è la funzione pseudo
foreach ($menu_items as $item) {
// fai qualcosa con l'elemento
}
C'è un modo per farlo? Grazie.

Come menzionato da @vancoder, wp_get_nav_menu_items()
è la funzione da utilizzare, tuttavia penso che una risposta più dettagliata possa essere più utile per le persone in futuro.
Questa funzione restituisce un array di oggetti WP_Post Object
(quindi puoi accedere ai valori con la freccia, ad es. $item->title
).
Per un setup base, potresti usare il seguente codice:
$menuLocations = get_nav_menu_locations(); // Ottiene le posizioni dei menu (impostate nel tema, di solito in functions.php)
// Restituisce un array di posizioni dei menu ([NOME_POSIZIONE] = ID_MENU);
$menuID = $menuLocations['primary']; // Ottiene l'ID del menu *primario*
$primaryNav = wp_get_nav_menu_items($menuID); // Ottiene l'array di oggetti wp, gli elementi del menu per la posizione specificata.
Poi puoi semplicemente iterare sulla variabile $primaryNav
, ad esempio:
foreach ( $primaryNav as $navItem ) {
echo '<li><a href="'.$navItem->url.'" title="'.$navItem->title.'">'.$navItem->title.'</a></li>';
}

wp_get_nav_menu_items sembra essere esattamente ciò di cui hai bisogno. Restituisce un array di oggetti menu.

Versione modificata della precedente con loop ricorsivi.
Aggiungi al file Functions.php
function wp_get_menu_array($current_menu='Menu Principale') {
$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;
}

Ottieni un array semplice del menu.
Aggiungi 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;
}
Vai nel tuo Header e chiama la funzione
<?php
$a = wp_get_menu_array('top-menu-header');
print_r($a); exit;
?>
