Aggiungere Javascript al Menu WordPress

8 lug 2014, 23:28:03
Visualizzazioni: 34.1K
Voti: 10

Esiste un modo per inserire javascript nella parte URL di una voce del menu WordPress? Ho una funzione di live chat sul mio sito e devo inserire questo codice per creare un link che apra la chat dal vivo (come suggerito qui).

<!-- INIZIO LINK CHAT OLARK -->
<a href="javascript:void(0);" onclick="olark('api.box.expand')">
    Clicca qui per chattare!
</a>
<!-- FINE LINK CHAT OLARK -->

Il cliente vuole il link nella barra di navigazione utility, che è stata creata usando un menu WordPress nel pannello di amministrazione WordPress. Ma quando copio e incollo javascript:void(0);" onclick="olark('api.box.expand') nella casella URL nel pannello di amministrazione WordPress, scompare semplicemente e il link rimane inattivo.

Ho letto da qualche parte che forse potrei mettere una classe personalizzata sul link in questione e poi scrivere una funzione Javascript che si attiva quando viene cliccato il link con quella classe. Ho provato questo approccio, ma non sono riuscito a farlo funzionare. Non conosco molto Javascript, quindi è possibile che lo stessi scrivendo in modo completamente sbagliato.

Qualcuno sa come fare questo? Vorrei farlo senza utilizzare un plugin.

5
Commenti

Non dovresti essere in grado di aggiungere javascript al menu tramite l'interfaccia utente, e non dovresti mai fare affidamento sull'attributo onclick per eseguire javascript

Tom J Nowell Tom J Nowell
8 lug 2014 23:44:56

Perché no? È il codice che la società del live chat mi ha fornito.

mcography mcography
9 lug 2014 00:15:12

Questo non significa che sia il modo giusto per farlo, dai un'occhiata all'evento .click() di jQuery

Tom J Nowell Tom J Nowell
9 lug 2014 01:08:52

Non intendevo dire che lo fosse. Stavo solo cercando di chiedere perché non dovrei mai fare affidamento sull'attributo onclick. Darò un'occhiata a .click().

mcography mcography
9 lug 2014 17:21:04

Perché HTML serve per definire un documento, aggiungere un attributo onclick è sbagliato nello stesso modo in cui è sbagliato aggiungere un tag o un attributo di stile inline, li mischia. Vedi questa domanda per capire perché è sbagliato

Tom J Nowell Tom J Nowell
9 lug 2014 17:29:31
Tutte le risposte alla domanda 4
4

Bene che funzioni. Se è per un cliente o se vuoi semplicemente un codice più pulito, puoi farlo come suggerito da @Tom J Nowell.

Aggiungi una voce personalizzata al menu, collegala a nessuna pagina o a una qualsiasi. Trova l'ID della voce del menu (ogni voce ne ha uno), quindi punta a quell'ID con jQuery.

$("#menu-item-num").on("click", function(e){ 
      e.preventDefault();
      // codice olark qui
});

In questo modo, ogni volta che un utente clicca su quel menu-item lo script sopra verrà attivato. Puoi accodare lo script jQuery tramite functions.php.

Aggiornamento:

  1. Assicurati che il tuo olark.js venga caricato. Se lo stai aggiungendo al footer o all'header, ispeziona la tua pagina e assicurati che lo script sia presente. Inoltre, assicurati di non ricevere errori nella console del browser.

  2. Incorpora il tuo js con un document ready, così che lo script venga eseguito al momento giusto:

    jQuery(document).ready(function($) {
      $("#menu-item-38872").on("click", function(e){
      e.preventDefault();
      olark('api.box.expand');
      });
    });
    

Il fatto che il link non si carichi significa che c'è qualcosa di sbagliato nello script stesso o che lo script non viene caricato affatto.

9 lug 2014 01:52:15
Commenti

Grazie per la tua risposta. Non so molto di Javascript, quindi puoi dirmi perché la tua soluzione è migliore/più pulita? Sto solo cercando di capire.

mcography mcography
9 lug 2014 17:27:20

Ho creato un file chiamato olark.js e l'ho accodato, ma il link porta ancora solo a # (perché è lì che l'ho impostato nel pannello di controllo di Wordpress). Questo è quello che ho inserito in olark.js: $("#menu-item-38872").on("click", function(e){ e.preventDefault(); // codice olark qui olark('api.box.expand'); }); Cosa sto sbagliando?

mcography mcography
9 lug 2014 18:36:52

Ah ha! Il jQuery(document).ready(function($) { ha funzionato! Grazie, @gdaniel!

mcography mcography
9 lug 2014 18:42:09

Sono contento che abbia funzionato. L'idea è mantenere gli script separati dal contenuto. Ecco perché si consiglia di procedere in questo modo.

gdaniel gdaniel
9 lug 2014 18:52:10
0

Soluzione #1 (non ideale, ma funziona):

// Link per la Live Chat nel menu utility
add_filter( 'wp_nav_menu_items', 'live_chat_utility_link', 10, 2 );
function live_chat_utility_link ( $items, $args ) {
    if ( $args->theme_location == 'utility' ) {
        $items .= '<li><a href="javascript:void(0);" onclick="olark(\'api.box.expand\')" class="livechat">Live Chat</a></li>';
    }
    return $items;
}

Soluzione #2 (ideale):

Con l'aiuto dei commenti precedenti, ecco la soluzione che ha funzionato per me. Ho creato un nuovo file chiamato olark.js e ho inserito questo codice al suo interno:

jQuery(document).ready(function($) {
    $("#menu-item-38872").on("click", function(e){ 
          e.preventDefault();
          // codice olark qui
          olark('api.box.expand');
    });
});

Poi, ho caricato lo script nel mio functions.php con il seguente codice:

function olark_script() {
    wp_register_script( 'olark', get_stylesheet_directory_uri() . '/js/olark.js', array(), '1.0.0', true );
    wp_enqueue_script( 'olark' );
}

add_action( 'wp_enqueue_scripts', 'olark_script' );

Se non funziona, assicurati di caricare correttamente il tuo script. Sto usando un child theme, quindi ho dovuto usare get_stylesheet_directory_uri() invece di get_template_directory_uri().

9 lug 2014 00:15:54
0

Penso che ci sia un'opzione "più affidabile". Fare affidamento sul numero dell'elemento del menu non garantisce il funzionamento se si migra il codice dallo sviluppo alla produzione, ad esempio. Se si trasforma il numero in un'impostazione, la situazione migliora, ma non è ancora davvero ottimale.

Un'alternativa potrebbe essere collegare a un'ancora inesistente, come #olark, dal tuo elemento del menu. Questo può essere impostato utilizzando l'interfaccia utente ed è affidabile in tutti gli ambienti. Quindi, il tuo script separato dovrebbe osservare il cambiamento dell'hash (nella barra degli indirizzi del browser) e agire di conseguenza.

Un semplice esempio in CoffeeScript che si compila in JavaScript e ascolta l'evento hashchange:

if window.addEventListener
  window.addEventListener 'hashchange', (event) =>
  @showLogin()
else
  window.attachEvent 'onhashchange', (event) =>
  @showLogin()
#abilita la condivisione dell'URL
if location.hash then @showLogin()

@showLogin è una funzione che mostra una finestra di dialogo per il login se l'hash è uguale a '#login'.

[modifica] Curiosamente, l'hash nella barra degli indirizzi non cambia se si clicca su un elemento del menu. Questo è inaspettato e potrebbe essere dovuto a un altro script che previene l'evento predefinito. Quindi ho dovuto aggiungere un'altra riga per far sì che la posizione della finestra cambi in risposta al clic su un link:

# assicurati che l'hash cambi quando viene cliccato un link nel menu (per qualche motivo, nel mio caso non succede)
$('.menu-item a').click (event) =>
  window.location = $(event.currentTarget).attr 'href'

[/modifica]

29 ago 2014 12:24:52
1
-2

Puoi utilizzare queste funzioni nel file functions.php per aggiungere script aggiuntivi agli elementi del menu di navigazione

function add_nav_class($output) {
$output= preg_replace('/<a/', '<a id="join_club" onclick="awf_Form_.showForm(); return false;"', $output, -1);
return $output;
}
add_filter('wp_nav_menu', 'add_nav_class');
15 nov 2017 11:01:41
Commenti

Questa non è una soluzione corretta, romperà completamente il menu, perché tutti i pulsanti saranno influenzati, e non fa ciò che la domanda chiedeva.

Milan Petrovic Milan Petrovic
15 nov 2017 11:49:29