In che modo la voce di menu di livello superiore non ha un collegamento, ma ha sottomenu collegati?


25

Sto creando un menu orizzontale e alcune delle voci di quel menu avranno menu a discesa (sottomenu), e altre no. Quelli che hanno sottomenu non sono in realtà pagine. Sono solo pensati per essere guide per i menu a discesa.

Ad esempio, supponiamo che il menu orizzontale sia il seguente:

Home | Chi siamo | Prodotti | Indicazioni | Contatto

E l'elemento li "prodotti" dovrebbe avere 3 pagine collegate in un elenco a discesa verticale sotto di esso, quindi i "prodotti" non rappresentano effettivamente una pagina, come posso farlo in WP?

(Uso WP come CMS, con home statica e pagine interne. Costruisco i miei modelli, modifico i menu in CSS, quindi registro i menu in Functions.php e li chiamo nei modelli.) In WP aggiungi voci a i menu tramite l'elenco delle pagine o tramite i collegamenti personalizzati. Ma non voglio che i "prodotti" siano collegati. Se non aggiungo un collegamento al collegamento personalizzato, non mi consente di aggiungerlo al menu.

È possibile tramite i menu admin o devo affrontarlo in qualche altro modo?

Grazie per tutto l'aiuto!


1
ecco la soluzione funziona alla grande vai su wordpress.org/support/topic/no-page-menu-item

Puoi farlo usando js. prova questo articolo. kvcodes.com/2014/07/…
Kvvaradha,

Nella casella URL, lascialo vuoto.
AMY WANG,

Nessuno ha menzionato la classe WP_NAV_MENU_WALKER, potresti scrivere il tuo walker che sputa quello che vuoi.
user3135691

Risposte:


12

Ho alcune idee:

  1. Imposta il link personalizzato su #cui non restituirà nulla
  2. Aggiungi una classe personalizzata agli elementi e quindi usa jQuery per rimuovere i collegamenti.
  3. Usa un PHP equivalente al metodo jQuery
  4. Utilizzare il plug-in Disabilita collegamento menu principale (o smontarlo e scrivere il proprio)

Grazie per i suggerimenti e i collegamenti! Come ha suggerito Gavin, usare un # per un collegamento personalizzato "funziona"; le altre opzioni potrebbero funzionare meglio, anche se non sono così facili. Bene, il plugin è probabilmente facile, ma odio usare i plugin se riesco a realizzare la stessa cosa più direttamente. Dovrò decidere l'approccio migliore. Grazie ancora!
PVA,

Se prevedi di utilizzarlo in dispositivi tattili, fai attenzione a utilizzare vuoto href=""perché la maggior parte degli utenti di dispositivi tattili non sarà in grado di vedere il menu a discesa senza utilizzare JS
Simon

I collegamenti si rompono. Potresti voler inserire alcune di queste idee nella tua risposta
shea

Inoltre, # 2 e # 3 si riferiscono wp_list_pages(), nonwp_nav_menu()
karité,

25

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

  1. Dalla dashboard di WordPress, vai su "Aspetto -> Menu"
  2. Nella scheda "Modifica menu", seleziona "Collegamenti personalizzati"
  3. Per l'URL, inserisci "#" (senza virgolette)
  4. Per il testo del collegamento, inserisci il testo desiderato per il livello superiore del menu a discesa
  5. Fai clic sul pulsante "Aggiungi al menu"
  6. Trascina la voce di menu nella posizione desiderata all'interno del menu
  7. Per la voce di menu che hai appena aggiunto, fai clic sulla freccia in giù a destra della voce (leggerà "collegamento personalizzato" a sinistra della voce)
  8. Rimuovi "#" dall'URL. Questo, in tutti i browser, convertirà il collegamento in testo semplice.
  9. Fai clic sul pulsante "Salva menu"

Grazie per quel suggerimento. È ez, anche se non perfetto in quanto le etichette sembrano ancora "collegamenti" quando si passa il mouse, ma non vanno da nessuna parte. Quindi può funzionare in un pizzico.
PVA,

1
Hai letto l'intero commento? Dopo aver aggiunto il collegamento, fai clic sulla freccia a discesa accanto al nome del collegamento e rimuovi "#" dalla casella di testo dell'URL. Questo, in tutti i browser, renderà il collegamento non cliccabile.
GavinR,

1
Sì, grazie, ho letto l'intero commento. Sono tornato indietro e ho riprovato e ho capito il mio problema. Quando lascio il #, la parola appare nella barra di navigazione ma come "collegamento morto". Quando ho rimosso il #, la parola non appariva nella barra di navigazione a meno che non ci passassi sopra e apparisse in uno stato al passaggio del mouse. Quindi suppongo che ciò significhi che devo applicare CSS alla parola in modo che appaia senza essere collegata. Non sono sicuro del motivo per cui viene visualizzato lo stato al passaggio del mouse ...
PVA

Questo è ancora in 4.9.5, tuttavia non sono sicuro in quanto "sembra" un hack che affronta il vantaggio di un bug. Altrimenti ... salverà molte persone ... Questo è un po 'come il fatto che Wordpress consideri "1 2 3 4 5 6" una password sicura ... ancora.
brooklynsweb,

Cordiali saluti, se si esegue il passaggio 8 (per qualsiasi motivo valido), il cursore non sarà un puntatore quando si passa sopra il collegamento personalizzato. In tal caso, è possibile modellarlo con pointer: pointer.
MarsAndBack

7

Il metodo più semplice che mi è venuto in mente è stato quello di creare un elemento di collegamento personalizzato con il valore URL collegamento di #. Questo sta inviando l'utente a un hash vuoto sulla stessa pagina, quindi praticamente non si collega da nessuna parte.

Tuttavia, ci sono alcuni effetti collaterali dell'uso di hash vuoti per i collegamenti segnaposto. Il collegamento verrà comunque visualizzato e si comporterà come un collegamento, pertanto potrebbe confondere un utente quando fa clic su quello che sembra essere un collegamento ma non accade nulla. L'altro effetto è che facendo clic su un collegamento hash vuoto si sovrascriverà qualsiasi hash esistente, inviando l'utente nella parte superiore della pagina. Questo potrebbe non essere così preoccupante per un menu che si trova in cima alla pagina comunque, ma è abbastanza stonante quando la pagina salta inaspettatamente quando non te l'aspetti, specialmente se questo è per un menu a piè di pagina.

La soluzione è combinare il metodo hash vuoto con un pezzo di codice per rilevare quando nel menu vengono utilizzati collegamenti hash vuoti e rimuovere completamente l' hrefattributo da quel collegamento. Un aelemento senza hrefattributo è il metodo HTML 5 corretto per creare un collegamento segnaposto.

/**
 * Remove the href from empty links `<a href="#">` in the nav menus
 * @param string $menu the current menu HTML
 * @return string the modified menu HTML
 */
add_filter( 'wp_nav_menu_items', function ( $menu ) {
    return str_replace( '<a href="#"', '<a', $menu );
} );

2

Questo ha funzionato per me:

Ho attivato le classi CSS in Menu> Opzioni schermo> Classi CSS Quindi ho dato l'elemento di menu che volevo disattivare la classe ".nolink" e ho aggiunto questo pezzo di codice al mio pannello CSS personalizzato:

.nolink {
   pointer-events: none;
   cursor: default;
}

Questo uccide anche il menu a discesa.
user385917,

Utilizzare #come target del collegamento e quindi applicare una classe CSS personalizzata a scopi di styling, secondo me è la soluzione meno complicata. Tuttavia, l'impostazione pointer-events: nonenon ha molto senso per me, poiché interromperà i sottomenu. Potresti approfondire il motivo per cui hai impostato quell'attributo?
user1438038

1

Usando 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 sostituirà il collegamento con un elemento span per il menu di elementi con post_name == "contatto", che è quello che stavo cercando. Puoi facilmente cambiarlo per verificare il titolo del menu o l'ID, oppure aggiungere un codice per verificare se ha voci di menu figlio ecc.


0

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

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

e 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 verifica se il suo link principale termina con "#", in questo caso aggiunge un elemento span attorno al contenuto del tag A, che disabilita il clic.

Spero che sia d'aiuto :-)


Ciao, so che questa è una vecchia risposta, ma per riferimento futuro, non vorrei semplicemente entrare e modificare il file di intestazione dei temi perché quando si aggiorna in seguito tutto il codice verrà sovrascritto. La soluzione migliore per questo è creare un tema figlio con il tuo codice personalizzato.
Scott,

0

Come altri hanno suggerito, puoi creare una voce di menu di collegamento personalizzata con # come relativo URL. Quindi cancellare il # una volta che è stato aggiunto al menu. E infine, puoi usare questa semplice regex per rimuovere il tag effettivo da quei collegamenti.

preg_replace('/<a>([^<]+)<\/a>/i', '<span class="no-link">$1</span>', $navHTML);

0

Ciò rimuoverà il clic (e disattiverà l'elemento). In questo modo, non è necessario utilizzare i collegamenti # personalizzati nel 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 );

0

Apprezzo questo è un vecchio thread, ma per un modo rapido e sporco di avere un link in Wordpress è facendo l'URL del link come:

#_

Nota il carattere di sottolineatura dopo l'hashtag. In questo modo se il tuo menu scorre verso il basso nella pagina (es. Fisso), non fai un salto in cima alla pagina quando fai clic su di essa e non richiedono plugin / script.


0

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

1) Trasforma la voce del menu principale in un duplicato della prima voce secondaria e cambia la sua etichetta. Ad esempio, se il primo elemento in "Prodotti" è "Prodotto 1", utilizzare "Prodotto 1" come voce di menu principale, quindi cambiare 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 sia reindirizzata al Prodotto 1. Il vantaggio di questa opzione è che ti consente di creare una pagina Prodotti vuota per creare un elenco gerarchico in Pagine, ma se qualcuno cerca di andare ai Prodotti vuoti pagina, verranno reindirizzati.


0

Vai su Aspetto, quindi fai clic sui menu. In questa sezione vai sotto la struttura del menu e fai clic sulla freccia verso il basso per espandere la pagina e vedrai una casella che dice disabilita collegamento. Seleziona quella casella e salva.


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

L'ho già visto prima, vorrei sapere quale plug-in o tema ha fatto questo.
DavGarcia,

0
  1. Impostare il collegamento personalizzato su # che non restituirà nulla dell'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 span CSS per ottenere lo stesso stile di <a>, non dimenticare cursor: context-menu;.


0

Crea la voce di menu "Collegamenti personalizzati" e aggiungi "javascript :;" (senza virgolette) per il campo URL. Questo è un modo migliore rispetto all'uso di "#" perché non fa scorrere la pagina verso l'alto quando viene cliccato.


0

Scrivendo dal 1/2019, la soluzione che produce HTML5 corretto è di fare quanto segue.

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

Ciò produrrà un navigatore di livello superiore <a>Menu</a>che è il modo corretto di rappresentare un collegamento non cliccabile.


0

È possibile disabilitare gli eventi sul <a>tag per tutte le voci di menu di primo livello utilizzando CSS puro. .main-menuLa classe potrebbe avere un altro nome in base alla denominazione del menu.

/* disable parent menu items */
ul.main-menu > li > a {
    pointer-events: none;
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.