Come creare una voce di menu di primo livello senza link ma con sottomenu collegati?
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!

Il modo più semplice per farlo senza plugin o altro è utilizzare la funzione "Menu" di WordPress. Ecco le istruzioni per WordPress 4.8:
- Dalla tua dashboard WordPress, vai su "Aspetto → Menu"
- Nella scheda "Modifica Menu", seleziona "Link personalizzati"
- Per l'URL, inserisci "#" (senza virgolette)
- Per il testo del link, inserisci il testo desiderato per il livello superiore del tuo menu a discesa
- Clicca sul pulsante "Aggiungi al menu"
- Trascina la voce del menu nella posizione desiderata all'interno del tuo menu
- Per la voce del menu appena aggiunta, clicca sulla freccia verso destra accanto alla voce (leggerai "link personalizzato" a sinistra della voce)
- Rimuovi il "#" dall'URL. Questo - in tutti i browser - convertirà il link in testo semplice.
- Clicca sul pulsante "Salva Menu"

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

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.

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

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.

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.

Ho alcune idee:
- Imposta il link personalizzato su
#
che non restituirà nulla - Aggiungi una classe personalizzata agli elementi e poi usa jQuery per rimuovere i link.
- Usa un equivalente PHP al metodo jQuery
- Usa il plugin Disable Parent Menu Link (o analizzalo e scrivine uno tuo)

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!

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

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

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

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

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?

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.

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.

- Imposta il link personalizzato su # che non restituirà nulla Voce di elenco
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); }
Modifica il CSS dello span per ottenere lo stesso stile di
<a>
, non dimenticarecursor: context-menu;
.

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

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

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.

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

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.

Scritto a partire da 1/2019, la soluzione che produce un HTML5 corretto è la seguente.
- Aggiungi un Link Personalizzato con l'URL impostato su # e il nome che preferisci. Entrambi i campi sono obbligatori.
- Modifica il Link Personalizzato appena aggiunto in modo che l'URL sia vuoto.
- 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.

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.

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.

Una soluzione molto più semplice può essere trovata in un'altra domanda:
Cerca la risposta di Askelon. Funziona perfettamente, senza bisogno di fare preg_replace o usare jQuery.

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