Получение списка пунктов меню в массиве
4 ответ
- голосов
-
- 2013-08-21
wp_get_nav_menu_items ,похоже,именно то,что вам нужно.Он возвращает массив объектов меню.
wp_get_nav_menu_items would appear to be exactly what you require. It returns an array of menu objects.
-
- 2016-12-22
Как упоминает @vancoder,
wp_get_nav_menu_items()
- это правильный выбор,однако я думаю,что более подробный ответ будет более полезен для людей в будущем.Указанная функция возвращает массив объектов
WP_Post Object
(поэтому вы получаете доступ к значениям с помощью стрелки,например,$item->title
).Для базовой настройки вы можете использовать следующее:
$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.
Затем вы можете просто перебрать эту переменную
$primaryNav
,например:foreach ( $primaryNav as $navItem ) { echo '<li><a href="'.$navItem->url.'" title="'.$navItem->title.'">'.$navItem->title.'</a></li>'; }
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>'; }
-
мне это возвращает "ложь"to me this returns "false"
- 1
- 2018-01-24
- John Smith
-
Вы копируете @JohnSmith?Вам нужно будет использовать идентификатор _вашего_ меню.Are you copy-pasting @JohnSmith? You'll need to use _your_ menu's ID.
- 4
- 2018-02-22
- Brad Adams
-
Я обнаружил,что это намного проще,чем использовать класс walker.Хороший!I found this far easier than using the walker class. Nice one!
- 0
- 2019-03-27
- Lee
-
- 2019-07-25
Получите простой массив меню.
Добавить в 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; ?>
Get simple array of menu.
Add To 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; }
Go to Your Header And Call Function
<?php $a = wp_get_menu_array('top-menu-header'); print_r($a); exit; ?>
-
Это достойный ответ,но он идет только на 1 уровень.This is a decent answer, however it only goes 1 level deep.
- 0
- 2019-09-11
- Hybrid Web Dev
-
- 2020-05-21
Модифицированная версия выше с рекурсивными циклами.
Добавить в 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; }
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; }
В настоящее время я работаю над собственной темой.В этой теме у меня есть меню,которое я зарегистрировал с помощью
register-nav-menu
,а затем я показываю меню на своей веб-странице с помощью функцииwp_nav_menu
.Однако мне нравится получать только список пунктов меню (только фактические названия пунктов меню,которые использовались в области wp-admin для создания меню,и без какого-либо HTML),и я хотел бы сохранить этот список пунктовв массив (т.е. не отображать его).
Итак,псевдокод будет выглядеть так
Как это сделать?Спасибо.