Come contare gli elementi di un menu di navigazione?

3 dic 2011, 00:57:31
Visualizzazioni: 15.9K
Voti: 9

Sto creando un custom walker per il mio menu di navigazione. L'obiettivo è dividere il menu in colonne come mostrato:

Esempio di menu diviso in colonne

Posso facilmente determinare la mia posizione nella lista guardando $item->menu_order. Quello che non so è quanti elementi contiene in totale il menu.

Come posso ottenere questa informazione dall'interno del walker?

Aggiornamento:

Mi rendo conto che esistono diversi altri modi per creare colonne. Tutti hanno però i loro svantaggi:

  1. CSS Floats. Come suggerito da @sagive, si potrebbe ottenere facendo il float di tutti gli elementi della lista. Il problema è che l'ordine della lista cambia. Invece di scorrere la prima colonna per poi passare alla seconda, la lista andrebbe attraverso tutte e quattro le colonne nella prima riga, poi attraverso tutte e quattro nella seconda riga. Questo scombussola l'ordine.

  2. CSS Columns. Questa è quasi la soluzione perfetta. Mi darebbe esattamente quello che voglio - tranne per il fatto che IE non lo supporta affatto. Nemmeno IE 9. Questo lo rende inutilizzabile per un sito web mainstream.

  3. jQuery. Con un po' di javascript lato client potrei modificare la lista e farla disporre come voglio. È però un approccio disordinato e non funziona per chi ha js disabilitato.

  4. PHP. Questo è il metodo su cui sto facendo la domanda. Divido la lista in quattro unordered list separate, le stampo in html, poi uso CSS per fare il float delle liste e creare quattro colonne distinte. Può essere complicato da realizzare in PHP, ma il risultato appare uguale in tutti i browser. Credo sia l'opzione migliore.

Soluzione:

Per chi volesse seguire questa strada, ecco il codice che ho usato per ottenere il risultato:

// L'handle del menu dalla dichiarazione register_nav_menu in functions.php
$theme_location = 'my-menu-handle';

$theme_locations = get_nav_menu_locations();

$menu_obj = get_term( $theme_locations[$theme_location], 'nav_menu' );

// Stampa il conteggio degli elementi nel menu
echo $menu_obj->count;
0
Tutte le risposte alla domanda 4
3
12

Chiama wp_get_nav_menu_object per ottenere un oggetto menu. Il conteggio sarà una delle proprietà dell'oggetto, a cui puoi fare riferimento così:

Esempio:

// Ottieni l'oggetto menu
$my_menu = wp_get_nav_menu_object( 'nome-o-slug-del-tuo-menu' );

// Mostra il conteggio degli elementi nel menu
echo $my_menu->count;

Inoltre, per rispondere ulteriormente alla domanda aggiuntiva nei commenti riguardo all'ottenere tutti gli elementi di menu di primo livello. Considerando che i menu sono un post type con meta key, è possibile chiamare wp_get_nav_menu_items con gli argomenti meta_key e meta_value per ottenere solo i menu di primo livello, come mostrato di seguito.

Esempio:

$args = array( 'meta_key' => '_menu_item_menu_item_parent', 'meta_value' => 0 );

$top_items = wp_get_nav_menu_items( 'nomedelmio_menu', $args );

Spero che questo sia di aiuto.

3 dic 2011 16:34:04
Commenti

Grazie! Non è esattamente quello che volevo, ma è stato abbastanza vicino da aiutarmi a trovare la risposta. Il problema era che non conoscevo il nome del menu o lo slug, solo il nome del tema impostato nella dichiarazione register_nav_menu. Tuttavia ho trovato del codice per determinare il nome del menu. Con questo a disposizione, ho potuto utilizzare il tuo codice sopra.

Axeva Axeva
3 dic 2011 17:40:11

Ah... non l'avevi specificato nella tua domanda, se l'avessi fatto probabilmente avrei aggiunto altro codice per capire anche il nome del menu. Felice di essere stato d'aiuto in ogni caso.. ;)

t31os t31os
3 dic 2011 18:24:56

È possibile filtrare questo in qualche modo per contare solo gli elementi del menu di primo livello e ignorare i sottomenu e gli elementi dei sottomenu?

Usce Usce
12 nov 2018 02:07:11
0

Perché non utilizzare semplicemente la funzione array_chunk()?

Supponendo che tu abbia costruito un array di tag <li> completi, il tuo codice per dividerli e visualizzarli potrebbe essere simile a questo:

$columns = array_chunk( $myArray, 4 );
foreach ( $columns as $column ) {
    echo '<li>' . $column . '</ul>';
}
23 gen 2015 21:17:05
1

Non pensi (e scusa se sono rude) che sia molto più semplice e facile
semplicemente applicare float:left; a tutti gli "li" e inserirli dentro un div con
lo sfondo della struttura come immagine??

Esempio:

<style type="text/css">
.fourPartMenu {
    border: 1px solid #444;
    width: 800px;
    padding: 10px 15px;
}

.fourPartMenu ul {
    list-style: circle; // sostituisci con la tua img
    padding: 0px;
    margin: 0px;
}

.fourPartMenu ul li {
    float: left;
    width: 190px;
}

</style>

<div class="fourPartMenu">
    <ul>
        <li><a href="#">Uno</a></li>
        <li><a href="#">Due</a></li>
        <li><a href="#">Tre</a></li>
        <li><a href="#">Quattro</a></li>
        <li><a href="#">Cinque</a></li>
        <li><a href="#">Sei</a></li>
        <li><a href="#">Sette</a></li>
        <li><a href="#">Otto</a></li>
        <li><a href="#">Nove</a></li>
        <li><a href="#">Dieci</a></li>
    </ul>
</div>

Penso che sarebbe molto più facile da implementare - ma.. so che non è esattamente quello che cerchi, anche se a volte una nuova prospettiva aiuta :)

3 dic 2011 01:25:12
Commenti

Grazie per la risposta. Capisco che potrei farlo con il CSS, ma la lista risulterebbe fuori ordine. Scorrendo le colonne otterresti uno, due, tre, quattro in cima. Quello che mi serve è uno, quattro, sette, nove. In altre parole, la lista scende lungo la prima colonna, poi lungo la seconda colonna e così via.

Axeva Axeva
3 dic 2011 16:16:53
0

So che hai già trovato una soluzione e non so se è esattamente quello che stai cercando, ma qualche tempo fa ho scritto un plugin per utilizzarlo nel sito di un cliente che crea classi per ogni menu, sottomenu e voce di menu. Si chiama Advanced Navigation Menus. Se deciderai di usarlo, sentiti libero di inviarmi richieste per nuove funzionalità.

3 dic 2011 18:31:50