Come escludere voci di menu di livello inferiore con wp_get_nav_menu_items?

27 gen 2012, 18:44:58
Visualizzazioni: 15K
Voti: 4

Ho la seguente funzione per visualizzare un menu personalizzato in formato select per un design responsive su cui sto lavorando.

Funziona esattamente come desidero, tranne per il fatto che dovrei escludere le voci dei sottomenu. Al momento include tutti i livelli.

Qualcuno sa come posso dire a wp_get_nav_menu_items di visualizzare solo le voci di menu di livello superiore?

function jeMobileMenu( $args ) {

        // Imposta gli argomenti predefiniti
        $defaults = array (
            'menuSlug'      =>  '',
            'placeholder'   =>  'Menu',
            'prefix'        =>  ' » ',
            'navID'         =>  'mobileNav',
            'navClass'      =>  ''
        );

        // Combina gli argomenti in entrata $args con $defaults
        $args = wp_parse_args( $args, $defaults );

        // Dichiarazione di ciascun elemento in $args come variabile separata (es. $menuSlug, $placeholder)
        extract( $args, EXTR_SKIP );

        // Se non viene passato alcuno slug del menu, usciamo
        if ( empty($menuSlug) )
            return;

        // Se lo slug del menu passato non corrisponde a un menu esistente, usciamo
        if ( !has_nav_menu( $menuSlug ) )
            return;

        $locations = get_nav_menu_locations();
        $menu = wp_get_nav_menu_object( $locations[ $menuSlug ] );

        // Modifica: Aggiunto filtro per ottenere solo voci di menu di primo livello
        $menu_items = wp_get_nav_menu_items($menu->term_id, array(
            'depth' => 1  // Mostra solo elementi di livello 1
        ));

        // Avvolge il select in un elemento nav con id e classi passati
        $menu_output = '<nav id="' . $navID . '" class="' . $navClass . '">';

        $menu_output .= '<select id="menu-' . $menuSlug . '" onchange="window.open(this.options[this.selectedIndex].value,\'_top\')">';

        // Aggiunge segnaposto e link home
        $menu_output .= '<option value="">' . $placeholder . '</option>';
        $menu_output .= '<option value="' . home_url( '/' ) . '">' . $prefix . 'Home</option>';

        // Cicla attraverso tutte le voci di menu e le crea come opzioni nella select        
        foreach ( (array) $menu_items as $key => $menu_item ) {
            // Modifica: Verifica che l'elemento sia di livello superiore (menu_item_parent == 0)
            if ($menu_item->menu_item_parent == 0) {
                $title = $menu_item->title;
                $url = $menu_item->url;
                $menu_output .= '<option value="' . $url . '">' . $prefix . $title . '</option>';
            }
        }
        $menu_output .= '</select>';

        $menu_output .= '</nav>';

        echo $menu_output;
    }
0
Tutte le risposte alla domanda 1
2

Credo di aver trovato la soluzione!!

Ho fatto un print_r su ogni $menu_item e ho visto che c'è una chiave dell'array chiamata menu_item_parent.

Quindi ho modificato questo:

foreach ( (array) $menu_items as $key => $menu_item ) {
    $title = $menu_item->title;
    $url = $menu_item->url;
    $menu_output .= '<option value="' . $url . '">' . $prefix . $title . '</option>';
}

in questo:

foreach ( (array) $menu_items as $key => $menu_item ) {
    if ( $menu_item->menu_item_parent == 0 ) :
        $title = $menu_item->title;
        $url = $menu_item->url;
        $menu_output .= '<option value="' . $url . '">' . $prefix . $title . '</option>';
    endif;
}

Ora estrae solo gli elementi del menu che non hanno un elemento genitore.

27 gen 2012 19:06:35
Commenti

Se questa è la soluzione, contrassegnala come risolta.

mor7ifer mor7ifer
27 gen 2012 19:13:48

Non puoi contrassegnare le tue risposte come soluzione fino a 2 giorni dopo che la domanda è stata posta, ma lo farò allora.

Brigante Brigante
27 gen 2012 19:35:04