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

Brigante
297
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.

Brigante
297
27 gen 2012 19:06:35
Domande correlate
4
risposte
1
risposte