Come creare una voce di menu di primo livello senza link ma con sottomenu collegati?

5 ott 2011, 05:47:46
Visualizzazioni: 229K
Voti: 37

Sto creando un menu orizzontale dove alcune voci avranno menu a discesa (sottomenu) e altre no. Quelle che hanno sottomenu non sono in realtà pagine vere e proprie. Sono pensate solo come guide per i menu a discesa.

Per esempio, supponiamo che il menu orizzontale sia così:

Home | Chi Siamo | Prodotti | Come Raggiungerci | Contatti

E la voce "prodotti" del menu deve avere 3 pagine collegate in un elenco a discesa verticale sotto di essa, quindi "prodotti" di per sé non rappresenta una pagina, come posso fare questo in WordPress?

(Uso WordPress come CMS, con home page statica e pagine interne. Creo i miei template, stilizzo i menu in CSS, poi registro i menu nel functions.php e li richiamo nei template.) In WordPress si aggiungono voci ai menu tramite l'elenco delle pagine o tramite link personalizzati. Ma non voglio che "prodotti" sia collegato. Se non aggiungo un link al link personalizzato non mi permette di aggiungerlo al menu.

È possibile farlo attraverso l'amministrazione dei menu o devo affrontarlo in un altro modo?

Grazie per qualsiasi aiuto!

4
Commenti

ecco la soluzione funziona alla grande vai a controllare http://wordpress.org/support/topic/no-page-menu-item

User User
10 mar 2014 11:30:11

Puoi farlo usando js. prova questo articolo. http://www.kvcodes.com/2014/07/make-menu-link-wordpress-without-adding-page/

Kvvaradha Kvvaradha
16 feb 2016 06:50:58

Nella casella URL, lasciala vuota.

AMY WANG AMY WANG
11 lug 2018 20:03:45

Nessuno ha menzionato la classe WP_NAV_MENU_WALKER, potresti scrivere il tuo walker che generi esattamente quello che desideri.

user3135691 user3135691
18 set 2018 22:24:13
Tutte le risposte alla domanda 18
6
35

Il modo più semplice per farlo senza plugin o altro è utilizzare la funzione "Menu" di WordPress. Ecco le istruzioni per WordPress 4.8:

  1. Dalla tua dashboard WordPress, vai su "Aspetto → Menu"
  2. Nella scheda "Modifica Menu", seleziona "Link personalizzati"
  3. Per l'URL, inserisci "#" (senza virgolette)
  4. Per il testo del link, inserisci il testo desiderato per il livello superiore del tuo menu a discesa
  5. Clicca sul pulsante "Aggiungi al menu"
  6. Trascina la voce del menu nella posizione desiderata all'interno del tuo menu
  7. Per la voce del menu appena aggiunta, clicca sulla freccia verso destra accanto alla voce (leggerai "link personalizzato" a sinistra della voce)
  8. Rimuovi il "#" dall'URL. Questo - in tutti i browser - convertirà il link in testo semplice.
  9. Clicca sul pulsante "Salva Menu"
5 ott 2011 06:02:37
Commenti

Grazie per il suggerimento. È facile, anche se non perfetto perché le etichette sembrano ancora "link" quando ci passi il mouse sopra, ma non portano da nessuna parte. Quindi può funzionare in caso di necessità.

PVA PVA
6 ott 2011 00:15:47

Hai letto tutto il commento? Dopo aver aggiunto il link, clicca la freccia a discesa accanto al nome del link e rimuovi il "#" dalla casella di testo dell'URL. Questo, in tutti i browser, farà sì che il link non sia cliccabile.

GavinR GavinR
6 ott 2011 16:10:58

Sì, grazie, ho letto tutto il commento. Sono tornato indietro e ho riprovato, rendendomi conto del mio problema. Quando lascio il #, la parola appare nella barra di navigazione ma come un "link morto". Quando ho rimosso il #, la parola non appariva nella barra di navigazione a meno che non ci passassi il mouse sopra e appariva in uno stato di hover. Quindi presumo che significhi che devo applicare del CSS alla parola in modo che appaia senza essere collegata. Non sono sicuro del perché lo stato di hover si manifesti...

PVA PVA
7 ott 2011 01:13:54

Questo è ancora presente nella versione 4.9.5, tuttavia non sono sicuro che sia un hack che sfrutta un bug. Se non lo è... risparmierà a molte persone un sacco di mal di testa... È un po' come il fatto che WordPress consideri "1 2 3 4 5 6" una password complessa... ancora oggi.

brooklynsweb brooklynsweb
22 mag 2018 19:52:43

Per tua informazione, se esegui il Passo 8 (per qualsiasi buona ragione), il cursore non diventerà una mano quando passi sopra il link personalizzato. In quel caso, potresti applicare lo stile pointer:cursor.

Kalnode Kalnode
17 nov 2018 04:57:52

Sì, il link non è cliccabile utilizzando questo metodo, ma il testo è ancora avvolto dal tag di ancoraggio, il che è semanticamente scorretto!

Lovor Lovor
27 ago 2020 23:29:15
Mostra i restanti 1 commenti
4
16

Ho alcune idee:

  1. Imposta il link personalizzato su # che non restituirà nulla
  2. Aggiungi una classe personalizzata agli elementi e poi usa jQuery per rimuovere i link.
  3. Usa un equivalente PHP al metodo jQuery
  4. Usa il plugin Disable Parent Menu Link (o analizzalo e scrivine uno tuo)
5 ott 2011 05:59:28
Commenti

Grazie per i consigli e i link! Come suggerito da Gavin, usare un # per un link personalizzato "funziona"; le altre opzioni potrebbero funzionare meglio, anche se non sono altrettanto semplici. Beh, il plugin probabilmente è facile ma preferisco evitare di usare plugin se posso ottenere lo stesso risultato in modo più diretto. Dovrò decidere qual è l'approccio migliore. Grazie ancora!

PVA PVA
6 ott 2011 00:17:11

Se hai intenzione di usarlo su dispositivi tattili, fai attenzione a usare href="" vuoto perché la maggior parte degli utenti con dispositivi tattili non potrà vedere il menu a discesa senza usare JS

Simon Simon
21 nov 2013 17:05:32

I link si rompono. Potresti voler incorporare alcune di queste idee nella tua risposta

shea shea
13 mag 2015 04:33:10

Inoltre, i punti #2 e #3 si riferiscono a wp_list_pages(), non a wp_nav_menu()

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

Il metodo più semplice che ho trovato è stato quello di creare un elemento Link personalizzato con il valore URL impostato su #. Questo reindirizza l'utente a un hash vuoto sulla stessa pagina, quindi sostanzialmente non linka a nulla.

Tuttavia, ci sono alcuni effetti collaterali nell'utilizzare hash vuoti per i link segnaposto. Il link apparirà e si comporterà comunque come un link, quindi potrebbe confondere un utente quando clicca su quello che sembra un link ma non succede nulla. L'altro effetto è che cliccando su un link con hash vuoto sovrascriverà qualsiasi hash esistente, riportando l'utente all'inizio della pagina. Questo potrebbe non essere un problema per un menu che si trova già in cima alla pagina, ma è piuttosto fastidioso quando la pagina salta inaspettatamente, specialmente se si tratta di un menu nel footer.

La soluzione è combinare il metodo dell'hash vuoto con un pezzo di codice per rilevare quando i link con hash vuoti vengono utilizzati nel menu e rimuovere completamente l'attributo href da quel link. Un elemento a senza l'attributo href è il metodo corretto in HTML 5 per creare un link segnaposto.

/**
 * Rimuove l'href dai link vuoti `<a href="#">` nei menu di navigazione
 * @param string $menu l'HTML corrente del menu
 * @return string l'HTML del menu modificato
 */
add_filter( 'wp_nav_menu_items', function ( $menu ) {
    return str_replace( '<a href="#"', '<a', $menu );
} );
27 set 2014 14:00:03
Commenti

Puoi anche modificare l'intero tag a: <?php add_filter( 'wp_nav_menu_items', function ( $menu ) { return str_replace( ['<a href="#"', '/a>'], ['<span', '/span>'], $menu ); } ); ?>. Non dimenticare di aggiungere il dropdown tramite css o js.

quasi quasi
2 apr 2020 15:54:08
2

Questo ha funzionato per me:

Ho attivato Classi CSS in Menu > Opzioni Schermo > Classi CSS Poi ho assegnato all'elemento del menu che volevo disattivare la classe ".nolink" e ho aggiunto questo codice al pannello CSS personalizzato:

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

Questo elimina anche il menu a discesa.

user385917 user385917
28 giu 2017 21:06:59

Utilizzare # come destinazione del link e poi applicare una classe CSS personalizzata per scopi di stile, è la soluzione meno approssimativa secondo me. Tuttavia, impostare pointer-events: none non ha molto senso per me, dato che interromperà i sottomenu. Potresti spiegare perché hai impostato quell'attributo?

user1438038 user1438038
4 lug 2019 12:32:25
0

Anche se è un thread vecchio, per un modo rapido e sporco di avere un link in Wordpress è impostando l'URL del link come:

#_

Nota l'underscore dopo il cancelletto. In questo modo, se il tuo menu scorre lungo la pagina (ad esempio è fissato), non si verifica un salto in cima alla pagina quando ci clicchi sopra e non richiede alcun plugin o script.

21 nov 2017 00:41:43
0

Crea una voce di menu "Link personalizzati" e inserisci javascript:; nel campo URL. Questo è un metodo migliore rispetto all'uso del # perché non farà scorrere la pagina verso l'alto quando viene cliccato.

13 ago 2018 23:22:32
0

Utilizzando l'approccio PHP ho aggiunto questo codice a 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);

Questo codice sostituirà il link con un elemento span per la voce di menu con post_name == "contact", che è esattamente quello che cercavo. Puoi facilmente modificarlo per verificare il titolo del menu o l'ID, oppure aggiungere del codice per controllare se ha voci di menu figlie ecc.

11 nov 2017 20:39:47
0
  1. Imposta il link personalizzato su # che non restituirà nulla Voce di elenco
  2. Aggiungi questo filtro:

    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. Modifica il CSS dello span per ottenere lo stesso stile di <a>, non dimenticare cursor: context-menu;.

22 giu 2018 19:28:44
0

Questo rimuoverà il click (e toglierà lo stile all'elemento). In questo modo, non sarà necessario utilizzare i link personalizzati con # nel tuo menu.

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

Come altri hanno suggerito qui, puoi creare una voce di menu personalizzata con il link # come URL. Poi cancella il # una volta che è stato aggiunto al menu. Infine, puoi usare questa semplice espressione regolare per rimuovere il tag <a> effettivo da quei link.

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

Mi rendo conto di essere in ritardo, ma questi sono i due metodi che utilizzo:

1) Rendere l'elemento principale del menu un duplicato del primo sotto-elemento e cambiarne l'etichetta. Ad esempio, se il primo elemento sotto "Prodotti" è "Prodotto 1", usa "Prodotto 1" come elemento principale del menu, poi cambia la sua etichetta in "Prodotti". In questo modo, sia "Prodotti" che "Prodotto 1" porteranno alla pagina Prodotto 1.

2) Aggiungi un reindirizzamento in modo che la pagina Prodotti venga reindirizzata a Prodotto 1. Il vantaggio di questa opzione è che ti permette di creare una pagina Prodotti vuota per creare un elenco gerarchico nelle Pagine, ma se qualcuno prova ad accedere alla pagina Prodotti vuota, verrà reindirizzato.

21 dic 2017 18:55:44
2

Vai su Aspetto, quindi clicca su menu. In questa sezione vai sotto struttura menu e clicca sulla freccia verso il basso per espandere la pagina e vedrai una casella con scritto disabilita link. Spunta quella casella e salva.

26 gen 2018 21:06:18
Commenti

Questa funzionalità non è fornita dal core. Forse un tema o un plugin la sta aggiungendo alla tua configurazione?

Dave Romsey Dave Romsey
26 gen 2018 23:58:21

L'ho visto anche io in passato, vorrei sapere quale plugin o tema lo facesse.

DavGarcia DavGarcia
15 gen 2019 14:53:12
1

Ho risolto in questo modo: in header.php (del tuo tema) ho cercato:

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

e l'ho sostituito con:

'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>',

In parole semplici, questo script controlla se il link genitore termina con "#", in questo caso aggiunge un elemento span attorno al contenuto del tag A, che disabilita il click.

Spero sia utile :-)

28 lug 2014 12:06:50
Commenti

Ciao, so che questa è una risposta vecchia, ma per riferimento futuro, non mi limiterei a modificare il file header del tuo tema perché quando verrà aggiornato tutto il tuo codice verrà sovrascritto. La soluzione migliore per questo è creare un child theme con il tuo codice personalizzato.

Scott Scott
21 mar 2017 16:29:25
0

Scritto a partire da 1/2019, la soluzione che produce un HTML5 corretto è la seguente.

  1. Aggiungi un Link Personalizzato con l'URL impostato su # e il nome che preferisci. Entrambi i campi sono obbligatori.
  2. Modifica il Link Personalizzato appena aggiunto in modo che l'URL sia vuoto.
  3. Salva le modifiche.

Questo produrrà un elemento di navigazione di primo livello come <a>Menu</a> che è il modo corretto per rappresentare un link non cliccabile.

15 gen 2019 14:55:44
0

Crea un menu di collegamento personalizzato come descritto. Visualizza il codice sorgente e cerca l'href del sottomenu, ad esempio: #mm-1. Incolla questo nell'URL del collegamento personalizzato e salva il menu. In questo modo anche la versione mobile funzionerà quando tocchi il testo del menu.

23 dic 2019 20:05:06
0

La mia versione si presenta così:

per prima cosa, nel menu del pannello di amministrazione nel link desiderato, nel campo href inserisci # o lascialo vuoto, e poi nel function.php del tema aggiungi:

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

Puoi sostituire 'div' con qualsiasi elemento che preferisci.

Questo funziona per la versione 5.3.2 (testato in questa versione, ma dovrebbe funzionare anche in altre).

In questa forma, viene preservato il funzionamento di tutti gli argomenti 'before', 'after', 'link_before', 'link_after', ecc. da wp_nav_menu().

Inoltre, questo funziona anche per i sottomenu.

28 mar 2020 23:25:25
0
-1

Una soluzione molto più semplice può essere trovata in un'altra domanda:

Menu Admin - Evidenzia il menu di primo livello quando sei su una pagina di sottomenu (senza mostrare il sottomenu)

Cerca la risposta di Askelon. Funziona perfettamente, senza bisogno di fare preg_replace o usare jQuery.

3 feb 2015 22:05:08
0
-1

Puoi disabilitare gli eventi sul tag <a> per tutti gli elementi di menu di primo livello utilizzando CSS puro. La classe .main-menu potrebbe avere un nome diverso a seconda della denominazione del tuo menu.

/* disabilita gli elementi del menu genitore */
ul.main-menu > li > a {
    pointer-events: none;
}
9 mar 2019 10:36:29