Recuperar una lista de elementos de menú en un array

21 ago 2013, 19:23:04
Vistas: 119K
Votos: 22

Actualmente estoy trabajando en un tema personalizado. En este tema, tengo un menú que registré usando register-nav-menu, y luego estoy mostrando el menú en mi página web usando la función wp_nav_menu.

Sin embargo, me gustaría recuperar solo la lista de elementos del menú (solo los nombres reales de los elementos del menú que se usaron en el área de wp-admin para crear el menú, y sin ningún HTML), y me gustaría guardar esa lista de elementos en un array (es decir, no mostrarla).

Entonces, un código de ejemplo se vería así:

$menu_items = get_list_of_items($name_of_menu); // $name_of_menu es el resultado de register-nav-menu, y get_list_of_items es la función de ejemplo
foreach ($menu_items as $item) {
    // hacer algo con el elemento
}

¿Hay alguna manera de hacer esto? Gracias.

0
Todas las respuestas a la pregunta 4
3
63

Como menciona @vancoder, wp_get_nav_menu_items() es la función a utilizar, sin embargo creo que una respuesta más detallada sería más útil para las personas en el futuro.

Dicha función retorna un array de objetos WP_Post Object (por lo que accedes a los valores con una flecha, ej. $item->title).

Para una configuración básica, podrías usar lo siguiente:

$menuLocations = get_nav_menu_locations(); // Obtiene nuestras ubicaciones de menú (establecidas en nuestro tema, usualmente en functions.php)
                                           // Esto retorna un array de ubicaciones de menú ([NOMBRE_UBICACION] = ID_MENU);

$menuID = $menuLocations['primary']; // Obtiene el ID del menú *principal*

$primaryNav = wp_get_nav_menu_items($menuID); // Obtiene el array de objetos wp, los elementos del menú para nuestra ubicación consultada.

Luego puedes iterar sobre esa variable $primaryNav, por ejemplo:

foreach ( $primaryNav as $navItem ) {

    echo '<li><a href="'.$navItem->url.'" title="'.$navItem->title.'">'.$navItem->title.'</a></li>';

}
22 dic 2016 15:51:56
Comentarios

para mí esto devuelve "falso"

John Smith John Smith
24 ene 2018 11:43:36

¿Estás copiando y pegando @JohnSmith? Necesitarás usar el ID de tu menú.

Brad Adams Brad Adams
22 feb 2018 03:56:49

Encontré esto mucho más fácil que usar la clase walker. ¡Bien hecho!

Lee Lee
27 mar 2019 20:48:06
0
17

wp_get_nav_menu_items parece ser exactamente lo que necesitas. Devuelve un array de objetos del menú.

21 ago 2013 19:32:08
1

Versión modificada del código anterior con bucles recursivos.

Añadir al archivo functions.php

function wp_get_menu_array($current_menu='Menú 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;

}
21 may 2020 03:05:10
Comentarios

Hola Pete, ¿cómo aplicas un cierre activo a esto?

RMH RMH
4 mar 2021 03:18:10
1

Obtener un array simple del menú.

Añadir a 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;
}

Ir al Header y llamar a la función

<?php
 $a = wp_get_menu_array('top-menu-header');                         
 print_r($a); exit;                       

?>
25 jul 2019 15:26:49
Comentarios

Esta es una respuesta decente, sin embargo, solo profundiza 1 nivel.

Hybrid Web Dev Hybrid Web Dev
11 sept 2019 08:26:12