Cum pot dezactiva linkurile pentru elementele de meniu părinte?

18 ian. 2013, 06:20:14
Vizualizări: 15.6K
Voturi: 0

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.

0
Toate răspunsurile la întrebare 5
6

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:

  1. Marcați elementele care au copii înainte ca walker-ul să înceapă.
  2. Î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";
}
18 ian. 2013 08:14:18
Comentarii

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 JCL1178
18 ian. 2013 08:23:23

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

fuxia fuxia
18 ian. 2013 08:27:57

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 JohnK
24 mar. 2013 03:44:56

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

fuxia fuxia
24 mar. 2013 03:57:46

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

JohnK JohnK
24 mar. 2013 04:25:06

Ah, am înțeles. Orice se potrivește mai bine în cazul tău este în regulă. Soluția mea funcționează automat, cealaltă necesită ajustări manuale. Prefer soluțiile care funcționează fără probleme. Dar dacă ești mulțumit cu câțiva pași în plus, fă așa.

fuxia fuxia
24 mar. 2013 04:35:53
Arată celelalte 1 comentarii
3

Aș crea pur și simplu elemente personalizate de meniu cu un javascript:void(0) ca href ori de câte ori este necesar un element părinte.

18 ian. 2013 07:15:45
Comentarii

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.

gteh gteh
18 ian. 2013 07:38:43

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

JohnK JohnK
24 mar. 2013 03:31:44

Dar cum? Poți da un exemplu?

244boy 244boy
26 nov. 2019 12:05:08
1

Funcționează cu WordPress 3.5:

  1. Adaugă o intrare Link cu numele dorit și un URL #
  2. Editează intrarea din meniu creată și elimină #

Trebuie să parcurgi ambele pași, deoarece nu poți adăuga o intrare în meniu cu URL gol.

6 iun. 2013 14:36:15
Comentarii

Poți să explici mai multe?

244boy 244boy
26 nov. 2019 11:50:00
0

Puțin târziu, dar pentru utilizare viitoare. Puteți crea un link personalizat pentru elementul părinte. Când îl adăugați, trebuie să includeți un #, dar odată adăugat, îl puteți elimina, ceea ce dezactivează linkul.

25 apr. 2018 20:18:11
0
-1

Pentru a elimina cursorul activ "hover":

Opțiuni Temă > Meniu derulant > Faceți elementele de meniu părinte clicabile : dezactivați

29 iul. 2015 18:28:38