Получение списка пунктов меню в массиве

16

В настоящее время я работаю над пользовательской темой. В этой теме у меня есть меню, которое я зарегистрировал с помощью register-nav-menu, а затем я отображаю меню на своей веб-странице с помощью этой wp_nav_menuфункции.

Тем не менее, я хотел бы получить список только пунктов меню (только имена реальных пунктов меню, которые использовались в области wp-admin для создания меню и без HTML), и я хотел бы сохранить этот список элементов в массиве (т.е. не отображать его).

Итак, код psuedo будет выглядеть так

$menu_items = get_list_of_items($name_of_menu); // $name_of_menu is the result of register-nav-menu, and get_list_of_items is the psuedo function
foreach ($menu_items as $item) {
    // do something with the item
}

Есть ли способ сделать это? Благодарю.

Greeso
источник

Ответы:

9

wp_get_nav_menu_items будет выглядеть именно то, что вам нужно. Возвращает массив объектов меню.

vancoder
источник
46

Как упоминает @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>';

}
Брэд адамс
источник
1
для меня это возвращает «ложь»
Джон Смит
4
Вы копируете @JohnSmith? Вам нужно будет использовать идентификатор вашего меню.
Брэд Адамс,
Я обнаружил, что это намного проще, чем использовать класс Уокера. Хороший!
Ли
1

Получить простой массив меню.

Добавить в 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;                       

?>
Махеш Катирия
источник
Это достойный ответ, однако он идет только на 1 уровень.
Hybrid Web Dev