Cum să faci elementul de meniu principal fără link, dar să aibă submeniuri cu linkuri?

5 oct. 2011, 05:47:46
Vizualizări: 229K
Voturi: 37

Construiesc un meniu orizontal și unele dintre elementele din acel meniu vor avea meniuri dropdown (sub-meniuri), iar altele nu. Cele care au sub-meniuri nu sunt de fapt pagini. Sunt destinate doar să servească drept ghid pentru meniurile dropdown.

De exemplu, să zicem că meniul orizontal arată astfel:

Acasă | Despre Noi | Produse | Indicații | Contact

Iar elementul "produse" din listă este menit să aibă 3 pagini cu linkuri într-o listă dropdown verticală sub el, deci "produse" în sine nu reprezintă o pagină, cum pot face asta în WordPress?

(Folosesc WordPress ca CMS, cu pagină de start și pagini interioare statice. Îmi construiesc propriile template-uri, stilizez meniurile în CSS, apoi înregistrez meniurile în functions.php și le apelez în template-uri.) În WordPress adaugi intrări în meniuri prin lista de pagini sau prin linkuri personalizate. Dar nu vreau ca "produse" să aibă link. Dacă nu adaug un link la linkul personalizat, nu mă lasă să-l adaug în meniu.

Se poate face acest lucru prin interfața de administrare a meniurilor sau trebuie să abordez altfel?

Mulțumesc pentru orice ajutor!

4
Comentarii

iată soluția funcționează perfect du-te și verifică http://wordpress.org/support/topic/no-page-menu-item

User User
10 mar. 2014 11:30:11

Poți face asta folosind js. încearcă acest articol. http://www.kvcodes.com/2014/07/make-menu-link-wordpress-without-adding-page/

Kvvaradha Kvvaradha
16 feb. 2016 06:50:58

În căsuța URL, las-o goală.

AMY WANG AMY WANG
11 iul. 2018 20:03:45

Nimeni nu a menționat clasa WP_NAV_MENU_WALKER, ai putea să-ți scrii propriul walker care să afișeze exact ceea ce dorești.

user3135691 user3135691
18 sept. 2018 22:24:13
Toate răspunsurile la întrebare 18
6
35

Cea mai ușoară metodă de a realiza acest lucru fără un plugin sau altceva este să folosești funcția "Menus" din WordPress. Iată instrucțiunile pentru WordPress 4.8:

  1. Din panoul de control WordPress, accesează "Aspect -> Meniuri"
  2. În fila "Editare Meniuri", selectează "Legături Personalizate"
  3. Pentru URL, introdu "#" (fără ghilimele)
  4. Pentru textul linkului, introdu textul dorit pentru nivelul superior al meniului tău derulant
  5. Apasă butonul "Adaugă la Meniu"
  6. Trage elementul de meniu în poziția dorită în cadrul meniului tău
  7. Pentru elementul de meniu pe care tocmai l-ai adăugat, apasă pe săgeata în jos din dreapta elementului (va fi scris "legătură personalizată" în stânga elementului)
  8. Șterge "#" din URL. Acest lucru - în toate browserele - va converti linkul în text simplu.
  9. Apasă pe butonul "Salvează Meniul"
5 oct. 2011 06:02:37
Comentarii

Mulțumesc pentru pont. Este ușor, deși nu perfect, pentru că Etichetele încă arată ca „linkuri” când treci cu mouse-ul peste ele, dar nu duc nicăieri. Deci poate funcționa într-un pinch.

PVA PVA
6 oct. 2011 00:15:47

Ai citit întregul comentariu? După ce adaugi linkul, dă clic pe săgeata dropdown de lângă numele linkului și elimină „#” din caseta URL. Acest lucru, în toate browserele, va face ca linkul să nu fie clickable.

GavinR GavinR
6 oct. 2011 16:10:58

Da, mulțumesc, am citit întregul comentariu. M-am întors și am încercat din nou și mi-am dat seama de problema mea. Când las #, cuvântul apare în bara de navigare dar ca un „link mort”. Când am eliminat #, cuvântul nu a apărut în bara de navigare decât dacă treceam cu mouse-ul peste el și apărea într-o stare de hover. Deci presupun că asta înseamnă că trebuie să aplic CSS pe cuvânt pentru ca acesta să apară fără a fi linkat. Nu sunt sigur de ce apare starea de hover...

PVA PVA
7 oct. 2011 01:13:54

Aceasta încă funcționează în versiunea 4.9.5, totuși nu sunt sigur dacă este un hack care exploatează un bug. Dacă nu... va salva o mulțime de utilizatori de dureri de cap... Este similar cu faptul că WordPress consideră "1 2 3 4 5 6" o parolă puternică... încă.

brooklynsweb brooklynsweb
22 mai 2018 19:52:43

Pentru informare, dacă efectuați Pasul 8 (din orice motiv bun), cursorul nu va deveni un pointer când treceți peste link-ul personalizat. În acest caz, îl puteți stiliza cu pointer:cursor.

Kalnode Kalnode
17 nov. 2018 04:57:52

Da, link-ul nu este clicabil folosind această metodă, dar textul este în continuare înfășurat în tag-ul anchor, ceea ce este incorect din punct de vedere semantic!

Lovor Lovor
27 aug. 2020 23:29:15
Arată celelalte 1 comentarii
4
16

Am câteva idei:

  1. Setează link-ul personalizat la # care nu va returna nimic
  2. Adaugă o clasă personalizată elementelor și apoi folosește jQuery pentru a elimina link-urile.
  3. Folosește un echivalent PHP pentru metoda jQuery
  4. Folosește plugin-ul Disable Parent Menu Link (sau analizează-l și scrie propriul tău)
5 oct. 2011 05:59:28
Comentarii

Mulțumesc pentru sfaturi și linkuri! După cum a sugerat Gavin, folosirea unui # pentru un link personalizat "funcționează"; celelalte opțiuni pot funcționa mai bine, dar nu sunt la fel de ușor de implementat. Plugin-ul este probabil ușor, dar prefer să evit plugin-uri dacă pot obține același rezultat într-un mod mai direct. Va trebui să decid ce abordare este cea mai bună. Mulțumesc din nou!

PVA PVA
6 oct. 2011 00:17:11

Dacă intenționați să-l folosiți pe dispozitive tactile, aveți grijă la folosirea href="" gol, deoarece majoritatea utilizatorilor de dispozitive tactile nu vor putea vedea meniul derulant fără a folosi JS

Simon Simon
21 nov. 2013 17:05:32

Linkurile se rup. Ați putea să integrați câteva dintre aceste idei în răspunsul dumneavoastră

shea shea
13 mai 2015 04:33:10

De asemenea, #2 și #3 se referă la wp_list_pages(), nu la wp_nav_menu()

shea shea
13 mai 2015 04:34:32
1
10

Cea mai simplă metodă la care m-am gândit a fost să creez un element de tip Link Personalizat cu valoarea URL-ului setată la #. Acest lucru trimite utilizatorul către un hash gol pe aceeași pagină, deci practic nu duce nicăieri.

Totuși, există câteva efecte secundare ale utilizării hash-urilor goale pentru link-uri de tip placeholder. Link-ul va apărea și se va comporta în continuare ca un link, ceea ce ar putea deruta un utilizator atunci când dă clic pe ceea ce pare a fi un link, dar nu se întâmplă nimic. Un alt efect este că dând clic pe un link cu hash gol va suprascrie orice hash existent, trimitând utilizatorul în partea de sus a paginii. Acest lucru s-ar putea să nu fie atât de deranjant pentru un meniu care este deja în partea de sus a paginii, dar este destul de neplăcut când pagina sare neașteptat, mai ales dacă este vorba despre un meniu din footer.

Soluția este să combinăm metoda hash-ului gol cu o bucată de cod care să detecteze când sunt folosite link-uri cu hash gol în meniu și să elimine atributul href din acel link complet. Un element a fără atribut href este metoda corectă în HTML 5 de a crea un link de tip placeholder.

/**
 * Elimină atributul href din link-urile goale `<a href="#">` din meniurile de navigare
 * @param string $menu HTML-ul curent al meniului
 * @return string HTML-ul modificat al meniului
 */
add_filter( 'wp_nav_menu_items', function ( $menu ) {
    return str_replace( '<a href="#"', '<a', $menu );
} );
27 sept. 2014 14:00:03
Comentarii

Poți chiar să schimbi întregul tag a: <?php add_filter( 'wp_nav_menu_items', function ( $menu ) { return str_replace( ['<a href="#"', '/a>'], ['<span', '/span>'], $menu ); } ); ?>. Doar nu uita să adaugi dropdown-ul prin css sau js.

quasi quasi
2 apr. 2020 15:54:08
2

Acest lucru a funcționat pentru mine:

Am activat Clasele CSS în Meniuri > Opțiuni ecran > Clase CSS Apoi am dat elementului de meniu pe care am vrut să-l dezactivez clasa ".nolink" și am adăugat acest fragment de cod în panoul meu CSS personalizat:

.nolink {
   pointer-events: none;
   cursor: default;
}
14 oct. 2016 00:37:31
Comentarii

Aceasta omoară și meniurile drop-down.

user385917 user385917
28 iun. 2017 21:06:59

Folosirea # ca țintă a link-ului și apoi aplicarea unei clase CSS personalizate pentru scopuri de stilizare, este cea mai puțin hacky soluție în opinia mea. Totuși, setarea pointer-events: none nu are prea mult sens pentru mine, deoarece va strica submeniurile. Poți să elaborezi de ce ai setat acel atribut?

user1438038 user1438038
4 iul. 2019 12:32:25
0

Înțeleg că acesta este un subiect vechi, dar pentru o metodă rapidă și simplă de a avea un link în Wordpress este prin setarea URL-ului link-ului ca:

#_

Observați underscore-ul după hashtag. În acest fel, dacă meniul dvs. derulează în jos pe pagină (adică este fixat), nu veți avea un salt în partea de sus a paginii când faceți clic pe el și nu necesită niciun plugin/script.

21 nov. 2017 00:41:43
0

Creează un element de meniu "Linkuri Personalizate" și adaugă javascript:; în câmpul URL. Aceasta este o metodă mai bună decât folosirea # deoarece nu va derula pagina în sus la click.

13 aug. 2018 23:22:32
0

Folosind abordarea PHP, am adăugat acest cod în functions.php:

function remove_link_contact_menu($item_output, $item) {
    if ($item->post_name == 'contact')
        return '<span>' . $item->title . '</span>';

    return $item_output;
}
add_filter('walker_nav_menu_start_el', 'remove_link_contact_menu', 20, 2);
add_filter('megamenu_walker_nav_menu_start_el', 'remove_link_contact_menu', 20, 2);

Acest cod va înlocui link-ul cu un element span pentru elementul de meniu cu post_name == "contact", exact ceea ce căutam. Puteți modifica cu ușurință acest cod pentru a verifica titlul meniului sau ID-ul, sau puteți adăuga cod suplimentar pentru a verifica dacă elementul are subelemente de meniu etc.

11 nov. 2017 20:39:47
0
  1. Setează link-ul personalizat la # care nu va returna nimic List item
  2. Adaugă acest filtru:

    add_filter( 'wp_nav_menu_items', 'wpse_remove_empty_links' );
    
    function wpse_remove_empty_links( $menu ) {
    
        return preg_replace("/<a href=\"#\">(.+?)<\/a>/is", "<span>$1</span>", $menu);
    
    }
    
  3. Editează CSS-ul pentru span pentru a obține același stil ca <a>, nu uita de cursor: context-menu;.

22 iun. 2018 19:28:44
0

Aceasta va elimina acțiunea de click (și va elimina stilizarea elementului). În acest fel, nu este necesar să folosești link-uri personalizate # în meniu.

add_action( 'wp_footer', function(){
    ?>
    <script>
    (function( $ ) {
        var itemm = $('#main-menu .menu-item-has-children > a');
        itemm.click(function(){
            document.activeElement && document.activeElement.blur();
            return false;
        });
    })(jQuery);
    </script>
<?php
 }, 1, 0 );
18 mar. 2016 14:54:37
0

După cum au sugerat și alții aici, puteți crea un element de meniu personalizat cu link folosind # ca URL. Apoi ștergeți # odată ce este adăugat în meniu. În final, puteți folosi această expresie regulată simplă pentru a elimina tag-ul <a> real din acele link-uri.

preg_replace('/<a>([^<]+)<\/a>/i', '<span class="no-link">$1</span>', $navHTML);
7 mai 2015 07:09:26
0

Îmi dau seama că am întârziat la petrecere, dar acestea sunt cele două metode pe care le folosesc:

1) Faceți elementul părinte din meniu o copie a primului sub-element și schimbați-i eticheta. De exemplu, dacă primul element din submeniul "Produse" este "Produsul 1", folosiți "Produsul 1" ca element părinte din meniu, apoi schimbați eticheta acestuia în "Produse". Astfel, atât "Produse" cât și "Produsul 1" vor duce către pagina Produsul 1.

2) Adăugați o redirecționare astfel încât pagina Produse să fie redirecționată către Produsul 1. Beneficiul acestei opțiuni este că vă permite să creați o pagină Produse goală pentru a crea o listă ierarhică în Pagini, dar dacă cineva încearcă să acceseze pagina goală Produse, va fi redirecționat.

21 dec. 2017 18:55:44
2

Accesează Aspect, apoi dă clic pe meniuri. În această secțiune, mergi sub structura meniului și dă clic pe săgeata în jos pentru a extinde pagina și vei vedea o casetă care spune dezactivează linkul. Bifează acea casetă și salvează.

26 ian. 2018 21:06:18
Comentarii

Această funcționalitate nu este oferită de nucleul WordPress. Probabil un temă sau un plugin o adaugă în configurația ta.

Dave Romsey Dave Romsey
26 ian. 2018 23:58:21

Am văzut și eu acest lucru înainte, aș fi vrut să știu care temă sau plugin face asta.

DavGarcia DavGarcia
15 ian. 2019 14:53:12
1

Am rezolvat astfel: în header.php (al temei tale) am căutat:

'link_before'     => '',
'link_after'      => '',

și am înlocuit cu:

'link_before'     => '<script>var scriptTag=document.getElementsByTagName("script");scriptTag=scriptTag[scriptTag.length-1];if(scriptTag.parentNode.href)if(scriptTag.parentNode.href.slice(-1)=="#")document.write("<span onclick=\"return false\">")</script>',
'link_after'      => '<script>var scriptTag=document.getElementsByTagName("script");scriptTag=scriptTag[scriptTag.length-1];if(scriptTag.parentNode.href)if(scriptTag.parentNode.href.slice(-1)=="#")document.write("</span>")</script>',

Pe scurt, acest script verifică dacă link-ul părinte se termină cu "#", iar în acest caz adaugă un element span în jurul conținutului tag-ului A, care dezactivează click-ul.

Sper să te ajute :-)

28 iul. 2014 12:06:50
Comentarii

Bună, știu că acesta este un răspuns vechi, dar pentru referințe viitoare, nu aș recomanda să modifici direct fișierul header al temei tale, deoarece la următoarea actualizare toate modificările tale vor fi suprascrise. Cea mai bună soluție pentru această situație este să creezi o temă copil cu codul tău personalizat.

Scott Scott
21 mar. 2017 16:29:25
0

Scris în 1/2019, soluția care generează HTML5 corect este următoarea.

  1. Adaugă un Link Personalizat cu URL-ul setat pe # și orice nume dorești. Ambele câmpuri sunt obligatorii.
  2. Editează Linkul Personalizat tocmai adăugat astfel încât URL-ul să fie gol.
  3. Salvează modificările.

Aceasta va genera un element de navigare de nivel superior care este <a>Meniu</a>, ceea ce reprezintă modalitatea corectă de a afișa un link neclicabil.

15 ian. 2019 14:55:44
0

Creează un meniu personalizat cu linkuri așa cum s-a menționat. Vezi codul sursă și caută href-ul submeniului, de exemplu: #mm-1. Lipește acest cod în URL-ul linkului personalizat și salvează meniul. Acest lucru va face ca versiunea mobilă să funcționeze și ea atunci când apeși pe textul meniului.

23 dec. 2019 20:05:06
0

Versiunea mea arată astfel:

mai întâi, în meniul din panoul de administrare, în link-ul dorit, în câmpul href puneți # sau lăsați-l gol, apoi în function.php al temei se adaugă:

function replace_empty_menu_links( $item_output, $item, $depth, $args ) {
  if ( $item->url == '#' || $item->url == '' ) {
    $item_output = sprintf( '%1$s<' . 'div' . '%2$s>%3$s%4$s%5$s</' . 'div' . '>%6$s',
      $args->before,
      $attributes,
      $args->link_before,
      apply_filters( 'the_title', $item->title, $item->ID ),
      $args->link_after,
      $args->after
    );
  }
  return $item_output;
}
add_filter( 'walker_nav_menu_start_el', 'replace_empty_menu_links', 10, 4 );

Puteți înlocui 'div' cu orice element care vă convine.

Această soluție funcționează pentru versiunea 5.3.2 (testată în această versiune, dar ar trebui să funcționeze și în alte versiuni).

În această formă, este păstrată funcționalitatea tuturor argumentelor 'before', 'after', 'link_before', 'link_after', etc. din wp_nav_menu().

De asemenea, această soluție funcționează și pentru sub-meniu.

28 mar. 2020 23:25:25
0
-1

O soluție mult mai ușoară poate fi găsită în altă întrebare:

Meniu Admin - Evidențierea meniului principal când vă aflați pe o pagină de sub-meniul (fără a afișa sub-meniul)

Căutați răspunsul lui Askelon. Funcționează perfect, fără a fi nevoie să utilizați preg_replaces sau jquery.

3 feb. 2015 22:05:08
0
-1

Puteți dezactiva evenimentele pe tag-ul <a> pentru toate elementele de meniu de prim nivel folosind CSS pur. Clasa .main-menu poate avea alt nume în funcție de denumirea meniului dumneavoastră.

/* dezactivează elementele de meniu părinte */
ul.main-menu > li > a {
    pointer-events: none;
}
9 mar. 2019 10:36:29