Obținerea unei liste de elemente de meniu într-un array

21 aug. 2013, 19:23:04
Vizualizări: 119K
Voturi: 22

În prezent lucrez la o temă personalizată. În această temă, am un meniu pe care l-am înregistrat folosind register-nav-menu, și apoi îl afișez pe pagina web folosind funcția wp_nav_menu.

Cu toate acestea, aș dori să obțin doar lista elementelor de meniu (doar numele efective ale elementelor de meniu care au fost folosite în zona wp-admin pentru a crea meniul, fără HTML), și aș dori să salvez această listă într-un array (adică, nu să o afișez).

Așadar, un pseudo-cod ar arăta astfel:

$menu_items = get_list_of_items($name_of_menu); // $name_of_menu este rezultatul register-nav-menu, iar get_list_of_items este funcția pseudo
foreach ($menu_items as $item) {
    // fă ceva cu elementul
}

Există vreo modalitate de a face acest lucru? Mulțumesc.

0
Toate răspunsurile la întrebare 4
3
63

După cum menționează @vancoder, wp_get_nav_menu_items() este soluția recomandată, însă cred că un răspuns mai detaliat ar fi mai util pentru oamenii din viitor.

Această funcție returnează un array de obiecte WP_Post Object (astfel încât valorile se accesează folosind săgeata, de exemplu $item->title).

Pentru o configurare de bază, puteți folosi următorul cod:

$menuLocations = get_nav_menu_locations(); // Obține locațiile de meniu (setate în tema, de obicei în functions.php)
                                           // Returnează un array cu locațiile de meniu ([NUME_LOCATIE] = ID_MENU);

$menuID = $menuLocations['primary']; // Obține ID-ul meniului *principal*

$primaryNav = wp_get_nav_menu_items($menuID); // Obține array-ul de obiecte wp, elementele de navigare pentru locația interogată.

Apoi puteți parcurge variabila $primaryNav, de exemplu:

foreach ( $primaryNav as $navItem ) {

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

}
22 dec. 2016 15:51:56
Comentarii

pentru mine aceasta returnează "false"

John Smith John Smith
24 ian. 2018 11:43:36

Copiezi și lipești @JohnSmith? Va trebui să folosești ID-ul tău de meniu.

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

Am găsit această soluție mult mai ușoară decât folosirea clasei walker. Bravo!

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

wp_get_nav_menu_items pare să fie exact ceea ce ai nevoie. Returnează un tablou de obiecte de meniu.

21 aug. 2013 19:32:08
1

Versiune modificată a celei de mai sus cu bucle recursive.

Adăugați în Functions.php

function wp_get_menu_array($current_menu='Meniu 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 mai 2020 03:05:10
Comentarii

Salut Pete, cum aplici un close activ la asta?

RMH RMH
4 mar. 2021 03:18:10
1

Obține un array simplu al meniului.

Adaugă în 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;
}

Mergi în Header-ul tău și apelează funcția

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

?>
25 iul. 2019 15:26:49
Comentarii

Acesta este un răspuns decent, însă merge doar pe un singur nivel în adâncime.

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