Cum să numeri elementele din meniul de navigare?
Am creat un walker personalizat pentru meniul de navigare. Scopul este să împart meniul în coloane, astfel:
Pot determina cu ușurință poziția curentă în listă folosind $item->menu_order
. Ceea ce nu știu este cum să aflu numărul total de elemente din meniu.
Cum pot afla acest lucru din interiorul walker-ului?
Actualizare:
Am realizat că există mai multe metode alternative pentru a crea coloane. Toate au însă dezavantaje:
CSS Floats. După cum sugerează @sagive mai jos, s-ar putea realiza prin floatarea tuturor elementelor de listă. Problema este că ordinea listei se schimbă. În loc să meargă pe prima coloană în jos, apoi să treacă la a doua, lista ar merge pe toate cele patru coloane pe primul rând, apoi pe toate patru pe al doilea rând. Asta încurcă ordinea.
CSS Columns. Aceasta este aproape soluția perfectă. O să îmi ofere exact ce vreau - doar că IE nu o suportă deloc. Nici măcar pe IE 9. Asta o face inutilizabilă pentru un site web mainstream.
jQuery. Cu niște JavaScript pe partea de client aș putea modifica lista și să o aranjez așa cum vreau. Dar e dezordonat și nu funcționează pentru cei care au JS dezactivat.
PHP. Aceasta este metoda despre care întreb în această întrebare. Împart lista în patru liste neordonate separate, le afișez în HTML, apoi folosesc CSS pentru a le float-ui și a crea patru coloane distincte. Poate fi complicat de realizat în PHP, dar rezultatul arată la fel în toate browserele. Cred că asta o face cea mai bună opțiune.
Soluție:
Pentru cei care ar putea urma, iată codul pe care l-am folosit în final pentru a obține răspunsul:
// Handle-ul meniului din register_nav_menu din functions.php
$theme_location = 'my-menu-handle';
$theme_locations = get_nav_menu_locations();
$menu_obj = get_term( $theme_locations[$theme_location], 'nav_menu' );
// Afișează numărul de elemente din meniu
echo $menu_obj->count;
Apelați wp_get_nav_menu_object
pentru a obține un obiect de meniu. Numărul de elemente va fi una dintre proprietățile obiectului, la care puteți face referință astfel:
Exemplu:
// Obține obiectul meniului
$my_menu = wp_get_nav_menu_object( 'numele-sau-slug-ul-meniuului' );
// Afișează numărul de elemente din meniu
echo $my_menu->count;
De asemenea, pentru a răspunde complet la întrebarea suplimentară din comentarii privind obținerea tuturor elementelor de meniu de nivel superior. Având în vedere că meniurile sunt un tip de postare cu chei meta, este posibil să apelați wp_get_nav_menu_items
cu argumentele meta_key
și meta_value
pentru a obține doar meniurile de nivel superior, astfel:
Exemplu:
$args = array( 'meta_key' => '_menu_item_menu_item_parent', 'meta_value' => 0 );
$top_items = wp_get_nav_menu_items( 'numelemeumeniu', $args );
Sper că acest lucru vă este de ajutor.

Mulțumesc! Asta nu mi-a dat exact ceea ce voiam, dar a fost suficient de aproape pentru a mă ajuta să găsesc răspunsul. Problema era că nu știam numele meniului sau slug-ul, doar numele temei setat în declarația register_nav_menu. Totuși, am găsit niște cod pentru a determina numele meniului. Cu asta la îndemână, am putut folosi codul tău de mai sus.

Ah... nu ai menționat asta în întrebarea ta, dacă ai fi făcut-o, probabil aș fi adăugat și eu niște cod suplimentar pentru a afla și numele meniului. Oricum, mă bucur că am putut ajuta.. ;)

De ce să nu folosești pur și simplu funcția array_chunk() ?
Presupunând că ai construit un array de elemente <li>
finalizate, codul tău pentru a le împărți și afișa ar putea arăta astfel:
$columns = array_chunk( $myArray, 4 );
foreach ( $columns as $column ) {
echo '<li>' . $column . '</ul>';
}

Nu crezi (și îmi cer scuze dacă sunt nepoliticos) că e mult mai simplu și ușor
să folosești float:left; pentru toate elementele "li" și să le pui într-un div cu
acel fundal ca imagine??
Exemplu:
<style type="text/css">
.fourPartMenu {
border: 1px solid #444;
width: 800px;
padding: 10px 15px;
}
.fourPartMenu ul {
list-style: circle; // înlocuiește cu imaginea ta
padding: 0px;
margin: 0px;
}
.fourPartMenu ul li {
float: left;
width: 190px;
}
</style>
<div class="fourPartMenu">
<ul>
<li><a href="#">Unu</a></li>
<li><a href="#">Doi</a></li>
<li><a href="#">Trei</a></li>
<li><a href="#">Patru</a></li>
<li><a href="#">Cinci</a></li>
<li><a href="#">Șase</a></li>
<li><a href="#">Șapte</a></li>
<li><a href="#">Opt</a></li>
<li><a href="#">Nouă</a></li>
<li><a href="#">Zece</a></li>
</ul>
</div>
Cred că ar fi mult mai ușor de implementat - dar.. știu că nu e exact ceea ce cauți, dar uneori o perspectivă proaspătă ajută :)

Mulțumesc pentru răspuns. Îmi dau seama că aș putea face asta cu CSS, dar lista va fi în ordine greșită. Trecând prin coloane, ai obține unu, doi, trei, patru în partea de sus. Ceea ce am nevoie este unu, patru, șapte, nouă. Cu alte cuvinte, lista merge în jos pe prima coloană, apoi pe a doua coloană și așa mai departe.

Știu că deja ai găsit o soluție și nu sunt sigur dacă exact asta cauți, dar am scris un plugin acum ceva timp pentru a-l folosi pe site-ul unui client și creează clase pentru fiecare meniu, sub-meniu și element de meniu. Se numește Advanced Navigation Menus. Dacă îl folosești în final, nu ezita să-mi trimiți sugestii de funcționalități.
