Cum pot dezactiva linkurile pentru elementele de meniu părinte?
Nu doresc ca elementele părinte din meniurile de navigare ale site-ului meu să aibă link către o pagină separată. Pe de o parte, nu vreau să am pagini inutile. Pe de altă parte, aceste linkuri îngreunează navigarea pe site pentru utilizatorii de pe dispozitive mobile care nu pot să "tindă" peste un link (pentru a afișa elementele copil).
Cea mai bună soluție ar fi dezactivarea linkurilor pentru elementele părinte din meniu. Dar cum pot face acest lucru, mai ales acum că odată cu WordPress 3.5 plugin-ul Disable Parent Menu Item nu mai funcționează?
O posibilă soluție este aici.

Nu creați URL-uri false (#
). Acest lucru ar fi foarte neplăcut pentru utilizatorii cu cititor de ecran: aceștia folosesc o listă de linkuri disponibile pentru a naviga pe site-ul vostru. Același lucru este valabil și pentru linkurile javascript:
, care oricum nu sunt un markup elegant.
Aveți nevoie de doi pași:
- Marcați elementele care au copii înainte ca walker-ul să înceapă.
- Înlocuiți markup-ul pentru părinții de nivel superior.
Voi folosi un element <a>
gol aici pentru a facilita obținerea cursorului. Probabil veți avea nevoie de ceva de genul acesta în fișierul dumneavoastră de stiluri:
.menu > .has-children {
cursor: pointer;
}
Filtrul pentru marcarea elementelor părinte este preluat din acest răspuns. A doua funcție verifică doar această proprietate și testează dacă elementul în sine nu este un element copil.
add_filter( 'wp_nav_menu_objects', 't5_add_has_children_to_nav_items' );
add_filter( 'walker_nav_menu_start_el', 't5_unlink_parent_item', 10, 4 );
/**
* Adaugă proprietatea 'has_children' elementelor de meniu
*
* @wp-hook wp_nav_menu_objects
* @param array $items
* @return array
*/
function t5_add_has_children_to_nav_items( $items )
{
$parents = wp_list_pluck( $items, 'menu_item_parent' );
$out = array ();
foreach ( $items as $item )
{
in_array( $item->ID, $parents ) && $item->has_children = TRUE;
$out[] = $item;
}
return $items;
}
/**
* Înlocuiește markup-ul pentru elementele părinte de nivel superior.
*
* @wp-hook walker_nav_menu_start_el
* @param string $item_output
* @param object $item
* @param int $depth
* @param object $args
* @return string
*/
function t5_unlink_parent_item( $item_output, $item, $depth, $args )
{
// nu este element părinte de prim nivel
if ( empty ( $item->has_children ) or 0 != $item->menu_item_parent )
return $item_output;
$title = apply_filters(
'the_title',
$item->title,
$item->ID
);
$id = apply_filters(
'nav_menu_item_id',
'menu-item-'. $item->ID,
$item, $args
);
$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$classes[] = 'menu-item-' . $item->ID;
$classes[] = 'has-children';
$class_names = join(
' ',
apply_filters(
'nav_menu_css_class',
array_filter( $classes ),
$item,
$args
)
);
$class_names = $class_names
? ' class="' . esc_attr( $class_names ) . '"'
: '';
return "<li$id>$args->before<a class='menu-item has-children'>$title</a>$args->after";
}

Acesta este un răspuns mai bun decât al meu, dar indică o problemă fundamentală în meniurile WordPress că este nevoie de atât de mult cod pentru a realiza ceva care ar trebui să fie simplu :)

@JCL1178 Presupun că nu mulți autori folosesc un nivel superior fără href
. Și cele mai multe teme personalizate folosesc de obicei un walker personalizat. Văd implementarea nativă ca un ghid de bază care funcționează în majoritatea cazurilor, dar nu este impus dezvoltatorului.

Mulțumesc pentru răspunsul detaliat, toscho. Văd că ai depus mult efort în el. De fapt, răspunsul din linkul pe care l-am postat spune să elimini simbolul diez, astfel încât să nu existe niciun simbol diez în link-ul care apare în meniu: devine un link fără href
, adică fără URL, fals sau altfel. Deoarece soluția ta pare să depindă de evacuarea href
-ului de asemenea, mă întreb cum este mai bună pentru cititoarele de ecran. Merită walker-ul tău?

@JohnK Pluginul din acel thread este probabil cea mai proastă încercare de a rezolva acea problemă. Cu siguranță vei avea conflicte cu alte pluginuri, pentru că apelează wp_print_scripts
a doua oară. Acest lucru nu ar fi trebuit să treacă niciodată evaluarea pluginului... Oricum, folosește soluția PHP de aici; este lipsită de efecte secundare, cu excepția cazului în care folosești un plugin care vine cu propriul walker personalizat.

Linkul nu era către plugin, toscho, ci către o metodă simplă, 'manuală' de a-l înlocui pentru a crea un element de meniu neclicabil. Pare să producă același efect ca și codul tău. Aș vrea să îți recunosc munca, dar pot alege răspunsul tău ca fiind cel corect doar dacă îmi justifici superioritatea lui față de metoda simplă.

Răspuns bun și o soluție mult mai bună decât utilizarea simbolului hash în link, așa cum este indicat în linkul postat.

De fapt, dacă citești cu atenție, acea soluție spune să elimini simbolul hash, deci nu există simbol hash în link.
