Получение списка пунктов меню в массиве
В настоящее время я работаю над пользовательской темой. В этой теме у меня есть меню, которое я зарегистрировал с помощью register-nav-menu
, и затем отображаю меню на веб-странице, используя функцию wp_nav_menu
.
Однако я хочу получить только список пунктов меню (только фактические названия пунктов меню, которые использовались в админ-панели wp-admin для создания меню, и без HTML), и я хотел бы сохранить этот список элементов в массиве (т.е. не отображать его).
Псевдокод будет выглядеть так:
$menu_items = get_list_of_items($name_of_menu); // $name_of_menu это результат register-nav-menu, а get_list_of_items это псевдофункция
foreach ($menu_items as $item) {
// выполнить какое-то действие с элементом
}
Есть ли способ сделать это? Спасибо.

Как упоминает @vancoder, функция wp_get_nav_menu_items()
— это правильный путь, однако я считаю, что более подробный ответ будет полезнее для людей в будущем.
Эта функция возвращает массив объектов WP_Post Object
(поэтому доступ к значениям осуществляется через стрелку, например $item->title
).
Для базовой настройки можно использовать следующий код:
$menuLocations = get_nav_menu_locations(); // Получаем наши локации меню (установленные в теме, обычно в functions.php)
// Возвращает массив локаций меню ([НАЗВАНИЕ_ЛОКАЦИИ] = ID_МЕНЮ);
$menuID = $menuLocations['primary']; // Получаем ID *первичного* меню
$primaryNav = wp_get_nav_menu_items($menuID); // Получаем массив объектов wp — элементы меню для нашей запрошенной локации.
Затем можно просто перебрать переменную $primaryNav
, например так:
foreach ( $primaryNav as $navItem ) {
echo '<li><a href="'.$navItem->url.'" title="'.$navItem->title.'">'.$navItem->title.'</a></li>';
}

wp_get_nav_menu_items — это именно та функция, которая вам нужна. Она возвращает массив объектов меню.

Модифицированная версия вышеприведенного кода с рекурсивными циклами.
Добавить в 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;
}

Получение простого массива меню.
Добавьте в 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;
}
В шапке сайта вызовите функцию
<?php
$a = wp_get_menu_array('top-menu-header');
print_r($a); exit;
?>
