Cum să numeri elementele din meniul de navigare?

3 dec. 2011, 00:57:31
Vizualizări: 15.9K
Voturi: 9

Am creat un walker personalizat pentru meniul de navigare. Scopul este să împart meniul în coloane, astfel:

exemplu meniu împărțit în coloane

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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;
0
Toate răspunsurile la întrebare 4
3
12

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.

3 dec. 2011 16:34:04
Comentarii

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.

Axeva Axeva
3 dec. 2011 17:40:11

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.. ;)

t31os t31os
3 dec. 2011 18:24:56

Este posibil să filtrăm asta cumva pentru a număra doar elementele de meniu de nivel superior și să ignorăm submeniurile și elementele de submeniu?

Usce Usce
12 nov. 2018 02:07:11
0

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>';
}
23 ian. 2015 21:17:05
1

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ă :)

3 dec. 2011 01:25:12
Comentarii

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.

Axeva Axeva
3 dec. 2011 16:16:53
0

Ș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.

3 dec. 2011 18:31:50