Recuperare un elenco di voci di menu in un array

21 ago 2013, 19:23:04
Visualizzazioni: 119K
Voti: 22

Attualmente sto lavorando su un tema personalizzato. In questo tema, ho un menu che ho registrato usando register-nav-menu, e poi lo visualizzo nella mia pagina web utilizzando la funzione wp_nav_menu.

Tuttavia, vorrei recuperare solo l'elenco delle voci di menu (solo i nomi effettivi delle voci di menu utilizzati nell'area wp-admin per creare il menu, e senza HTML), e vorrei salvare quell'elenco di elementi in un array (cioè, non visualizzarlo).

Quindi, uno pseudo codice sarebbe così:

$menu_items = get_list_of_items($name_of_menu); // $name_of_menu è il risultato di register-nav-menu, e get_list_of_items è la funzione pseudo
foreach ($menu_items as $item) {
    // fai qualcosa con l'elemento
}

C'è un modo per farlo? Grazie.

0
Tutte le risposte alla domanda 4
3
63

Come menzionato da @vancoder, wp_get_nav_menu_items() è la funzione da utilizzare, tuttavia penso che una risposta più dettagliata possa essere più utile per le persone in futuro.

Questa funzione restituisce un array di oggetti WP_Post Object (quindi puoi accedere ai valori con la freccia, ad es. $item->title).

Per un setup base, potresti usare il seguente codice:

$menuLocations = get_nav_menu_locations(); // Ottiene le posizioni dei menu (impostate nel tema, di solito in functions.php)
                                           // Restituisce un array di posizioni dei menu ([NOME_POSIZIONE] = ID_MENU);

$menuID = $menuLocations['primary']; // Ottiene l'ID del menu *primario*

$primaryNav = wp_get_nav_menu_items($menuID); // Ottiene l'array di oggetti wp, gli elementi del menu per la posizione specificata.

Poi puoi semplicemente iterare sulla variabile $primaryNav, ad esempio:

foreach ( $primaryNav as $navItem ) {

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

}
22 dic 2016 15:51:56
Commenti

per me questo restituisce "false"

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

Stai facendo copia-incolla @JohnSmith? Dovrai usare l'ID del tuo menu.

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

Ho trovato questo metodo molto più semplice rispetto all'uso della classe walker. Ottimo lavoro!

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

wp_get_nav_menu_items sembra essere esattamente ciò di cui hai bisogno. Restituisce un array di oggetti menu.

21 ago 2013 19:32:08
1

Versione modificata della precedente con loop ricorsivi.

Aggiungi al file Functions.php

function wp_get_menu_array($current_menu='Menu Principale') {

    $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 mag 2020 03:05:10
Commenti

Ehi Pete, come si applica una chiusura attiva a questo?

RMH RMH
4 mar 2021 03:18:10
1

Ottieni un array semplice del menu.

Aggiungi 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;
}

Vai nel tuo Header e chiama la funzione

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

?>
25 lug 2019 15:26:49
Commenti

Questa è una risposta decente, tuttavia approfondisce solo di 1 livello.

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