Obținerea unei liste de elemente de meniu într-un array
În prezent lucrez la o temă personalizată. În această temă, am un meniu pe care l-am înregistrat folosind register-nav-menu
, și apoi îl afișez pe pagina web folosind funcția wp_nav_menu
.
Cu toate acestea, aș dori să obțin doar lista elementelor de meniu (doar numele efective ale elementelor de meniu care au fost folosite în zona wp-admin pentru a crea meniul, fără HTML), și aș dori să salvez această listă într-un array (adică, nu să o afișez).
Așadar, un pseudo-cod ar arăta astfel:
$menu_items = get_list_of_items($name_of_menu); // $name_of_menu este rezultatul register-nav-menu, iar get_list_of_items este funcția pseudo
foreach ($menu_items as $item) {
// fă ceva cu elementul
}
Există vreo modalitate de a face acest lucru? Mulțumesc.

După cum menționează @vancoder, wp_get_nav_menu_items()
este soluția recomandată, însă cred că un răspuns mai detaliat ar fi mai util pentru oamenii din viitor.
Această funcție returnează un array de obiecte WP_Post Object
(astfel încât valorile se accesează folosind săgeata, de exemplu $item->title
).
Pentru o configurare de bază, puteți folosi următorul cod:
$menuLocations = get_nav_menu_locations(); // Obține locațiile de meniu (setate în tema, de obicei în functions.php)
// Returnează un array cu locațiile de meniu ([NUME_LOCATIE] = ID_MENU);
$menuID = $menuLocations['primary']; // Obține ID-ul meniului *principal*
$primaryNav = wp_get_nav_menu_items($menuID); // Obține array-ul de obiecte wp, elementele de navigare pentru locația interogată.
Apoi puteți parcurge variabila $primaryNav
, de exemplu:
foreach ( $primaryNav as $navItem ) {
echo '<li><a href="'.$navItem->url.'" title="'.$navItem->title.'">'.$navItem->title.'</a></li>';
}

wp_get_nav_menu_items pare să fie exact ceea ce ai nevoie. Returnează un tablou de obiecte de meniu.

Versiune modificată a celei de mai sus cu bucle recursive.
Adăugați în Functions.php
function wp_get_menu_array($current_menu='Meniu 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;
}

Obține un array simplu al meniului.
Adaugă în 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;
}
Mergi în Header-ul tău și apelează funcția
<?php
$a = wp_get_menu_array('top-menu-header');
print_r($a); exit;
?>
