Sfaturi pentru personalizarea claselor li în wp_nav_menu() WordPress
Construiesc un meniu pentru site-ul meu. Versiunea statică arată astfel:
<nav>
<ul id="menu">
<li class="item_1"><a href="#">Item 1</a></li>
<li class="item_2"><a href="#">Item 2</a></li>
<li class="item_3"><a href="#">Item 3</a></li>
<li class="item_4"><a href="#">Item 4</a></li>
<li class="item_5"><a href="#">Item 5</a></li>
<li class="item_6"><a href="#">Item 6</a></li>
<li class="item_7"><a href="#">Item 7</a></li>
<li class="item_8"><a href="#">Item 8</a></li>
</ul>
Am reușit să înțeleg cum să personalizez tag-ul <ul>
, pentru a scăpa de tag-ul automat <div>
. Dar acum, vreau să personalizez tag-ul <li>
pentru a putea atribui diferite nume de class
pentru a controla comportamente specifice prin CSS. Când folosesc wp_nav_menu()
, rezultatul arată astfel:
<ul id="menu">
<li id="menu-item-111" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-111"><a href="http://mydomain.com/dummy/fashion/">Fashion</a></li>
<li id="menu-item-112" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-112"><a href="http://mydomain.comdummy/documentary/">Documentary</a></li>
<li id="menu-item-113" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-113"><a href="http://mydomain.com/dummy/events/">Events</a></li>
<li id="menu-item-114" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-114"><a href="http://mydomain.com/dummy/portraits/">Portraits</a></li>
</ul>
Vreau să scap de id
din tag-urile <li>
și să schimb class
pentru a reflecta numele paginii pe care vreau să o leg. În esență, vreau să obțin același rezultat ca în primul fragment de cod din acest post.
Motivul pentru care fac asta este că folosesc imagini personalizate care sunt controlate prin CSS în loc de text simplu.
Este posibil? Ce strategie ar trebui să folosesc pentru a rezolva această problemă?

Folosește un walker personalizat, elimină orice nu ai nevoie și adaugă clasele tale. Iată un walker pe care îl folosesc pentru a obține o listă cu markup curat: T5_Nav_Menu_Walker_Simple.
De asemenea, ai putea filtra 'nav_menu_css_class'
sau 'wp_nav_menu_items'
. Dar o clasă walker este mai ușor de înțeles și de controlat, în opinia mea.

Mulțumesc Toscho, tocmai am descoperit că în noua versiune de WordPress (3.3) putem adăuga clase personalizate pentru fiecare element de meniu, ceea ce rezolvă parțial problema mea. Am încercat scriptul pe care mi l-ai sugerat (T5_Nav_Menu_Walker_Simple) care elimină tot din <li>
, cum putem controla ce elemente dorim să păstrăm?

@Christian Poți modifica walker-ul după cum ai nevoie, este doar un exemplu foarte simplu. Pentru a vedea ce informații sunt disponibile, adaugă un print_r( $item, TRUE )
la fiecare li
. Apoi decide ce să faci cu ele. :)

Acest lucru m-a îndreptat în direcția potrivită, aveam nevoie de wp_nav_menu, dar trebuia să modific parametrul 'container_class' pentru a funcționa în cazul meu particular, unde în anumite condiții înlocuiam meniul principal cu altul, dar aveam nevoie ca clasele să rămână consistente pentru CSS.

Setarea clasei <li>
la nav-link
, deoarece Bootstrap 4.3 o necesită:
function add_menu_link_class($atts, $item, $args)
{
$atts['class'] = 'nav-link';
return $atts;
}
add_filter('nav_menu_link_attributes', 'add_menu_link_class', 1, 3);
De asemenea, puteți elimina atributul id
din acel array.

Acesta este un mod foarte simplu de a apela clasa li
și de a înlocui ușor "orice clasă". Doar urmați instrucțiunile.
Folosiți acest cod în zona de navigare.
<?php
$consult_menu = wp_nav_menu(array(
'theme_location' => 'topmenu',
'menu_id' => 'menu',
'menu_class' => 'navbar-nav m-auto',
'echo' => false
)
);
$consult_menu = str_replace('menu-item', 'nav-item', $consult_menu);
echo $consult_menu;
?>
Apoi inspectați codul în browser. Găsiți clasa implicită wp și apoi înlocuiți str_replace(**"clasa_implicita_aici"**,**"noua_clasa_li_aici"**,$consult_menu);
| Notă: $consult_menu aici este numele temei mele, puteți folosi orice nume aici.

După cum a menționat și ultimul utilizator, poți adăuga propriile clase CSS prin aspect > meniuri cu opțiunea de clase CSS bifată în opțiunile ecranului. În walker, poți accesa ceea ce introduci acolo folosind:
$item_output .= '<a'. $attributes .' class="'. $item->classes[0].'">';
Am folosit chiar și această metodă pentru a adăuga imagini predefinite în meniu - puțin mai fragil, dar funcționează.
<img src="theme/images/navigation/'.$item->classes[0].'" width="48" height="48" alt="Imagine meniu" title="Imagine meniu">
