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

21 авг. 2013 г., 19:23:04
Просмотры: 119K
Голосов: 22

В настоящее время я работаю над пользовательской темой. В этой теме у меня есть меню, которое я зарегистрировал с помощью 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) {
    // выполнить какое-то действие с элементом
}

Есть ли способ сделать это? Спасибо.

0
Все ответы на вопрос 4
3
63

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

}
22 дек. 2016 г. 15:51:56
Комментарии

для меня это возвращает "false"

John Smith John Smith
24 янв. 2018 г. 11:43:36

Вы копируете и вставляете, @JohnSmith? Вам нужно использовать ID вашего меню.

Brad Adams Brad Adams
22 февр. 2018 г. 03:56:49

Я нашел это гораздо проще, чем использование класса walker. Отличная работа!

Lee Lee
27 мар. 2019 г. 20:48:06
0
17

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

21 авг. 2013 г. 19:32:08
1

Модифицированная версия вышеприведенного кода с рекурсивными циклами.

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

}
21 мая 2020 г. 03:05:10
Комментарии

Привет, Пит, как применить активное закрытие к этому?

RMH RMH
4 мар. 2021 г. 03:18:10
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;                       

?>
25 июл. 2019 г. 15:26:49
Комментарии

Это неплохой ответ, но он раскрывает тему только на 1 уровень глубины.

Hybrid Web Dev Hybrid Web Dev
11 сент. 2019 г. 08:26:12