Adăugare Javascript în Meniul WordPress

8 iul. 2014, 23:28:03
Vizualizări: 34.1K
Voturi: 10

Există vreo modalitate de a pune javascript în secțiunea URL a unui element din meniul WordPress? Am o funcție de chat live pe site-ul meu și trebuie să pun acest cod pe site pentru a crea un link care să deschidă chat-ul live (așa cum este sugerat aici).

<!-- ÎNCEPUT LINK OLARK CHAT -->
<a href="javascript:void(0);" onclick="olark('api.box.expand')">
    Click aici pentru chat!
</a>
<!-- SFÂRȘIT LINK OLARK CHAT -->

Clientul dorește link-ul în bara de navigare utilitară, care a fost creată folosind un meniu WordPress în panoul de administrare WordPress. Dar când copiez și lipesc javascript:void(0);" onclick="olark('api.box.expand') în câmpul URL din panoul de administrare WordPress, acesta pur și simplu dispare și link-ul rămâne inactiv.

Am citit undeva că aș putea pune o clasă personalizată pe link-ul respectiv și apoi să scriu o funcție Javascript care să se execute când link-ul cu acea clasă este accesat. Am încercat asta, totuși, și nu am reușit să o fac să funcționeze. Nu cunosc prea mult Javascript, așa că este posibil să fi scris totul greșit.

Știe cineva cum să facă acest lucru? Aș dori să o fac fără a utiliza un plugin.

5
Comentarii

Nu ar trebui să poți adăuga javascript în meniu prin interfața utilizatorului și nu ar trebui să te bazezi niciodată pe atributul onclick pentru a executa javascript

Tom J Nowell Tom J Nowell
8 iul. 2014 23:44:56

De ce nu? Acesta este codul pe care mi l-a furnizat compania de live chat.

mcography mcography
9 iul. 2014 00:15:12

Asta nu înseamnă că este modul corect de a face acest lucru, verifică evenimentul .click() din jQuery

Tom J Nowell Tom J Nowell
9 iul. 2014 01:08:52

Nu încercam să spun că așa este. Doar încercam să întreb de ce nu ar trebui să mă bazez niciodată pe atributul onclick. Voi căuta informații despre .click().

mcography mcography
9 iul. 2014 17:21:04

Deoarece HTML este menit să definească un document, adăugarea unui atribut onclick este la fel de nepotrivită precum adăugarea unui stil inline sau a unui atribut de stil - amestecă lucrurile. Vezi această întrebare pentru a afla de ce este nepotrivit

Tom J Nowell Tom J Nowell
9 iul. 2014 17:29:31
Toate răspunsurile la întrebare 4
4

Bine că funcționează. Dacă este pentru un client sau dacă dorești doar un cod mai curat, poți face cum a sugerat @Tom J Nowell.

Adaugă un element personalizat în meniu, leagă-l de nicăieri sau oriunde. Află ID-ul elementului de meniu (fiecare element are unul), apoi direcționează acel ID cu jQuery.

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

În acest fel, de fiecare dată când un utilizator dă click pe acel menu-item scriptul de mai sus va fi declanșat. Poți încărca scriptul jQuery prin functions.php.

Actualizare:

  1. Asigură-te că olark.js se încarcă. Dacă îl adaugi în footer sau header, inspectează pagina și verifică dacă scriptul este prezent. De asemenea, asigură-te că nu primești erori în consola browserului.

  2. Învelește codul tău JavaScript într-un document ready, astfel încât scriptul să se execute la momentul potrivit:

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

Faptul că link-ul nu se încarcă înseamnă că există o problemă cu scriptul în sine sau că scriptul nu se încarcă deloc.

9 iul. 2014 01:52:15
Comentarii

Mulțumesc pentru răspuns. Nu știu prea multe despre Javascript, așa că poți să-mi spui de ce soluția ta este mai bună/mai elegantă? Doar încerc să înțeleg.

mcography mcography
9 iul. 2014 17:27:20

Am creat un fișier numit olark.js și l-am încărcat, dar linkul tot duce doar la # (pentru că așa l-am setat în panoul Wordpress). Iată ce am pus în olark.js: $("#menu-item-38872").on("click", function(e){ e.preventDefault(); // codul olark aici olark('api.box.expand'); }); Ce am greșit?

mcography mcography
9 iul. 2014 18:36:52

Aha! jQuery(document).ready(function($) { a funcționat! Mulțumesc, @gdaniel!

mcography mcography
9 iul. 2014 18:42:09

Mă bucur că a funcționat. Ideea este să păstrăm scriptul separat de conținut. De aceea se sugerează să facem astfel.

gdaniel gdaniel
9 iul. 2014 18:52:10
0

Soluția #1 (nu este ideală, dar funcționează):

// Link utilitar pentru Live Chat
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;
}

Soluția #2 (ideală):

Cu ajutorul comentariilor de mai sus, iată soluția care a funcționat pentru mine. Am creat un fișier nou numit olark.js și am pus acest cod în el:

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

Apoi, am încărcat scriptul în functions.php cu următorul cod:

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

Dacă nu funcționează, asigurați-vă că încărcați scriptul corect. Eu folosesc un child theme, așa că a trebuit să folosesc get_stylesheet_directory_uri() în loc de get_template_directory_uri().

9 iul. 2014 00:15:54
0

Cred că există o opțiune 'mai fiabilă'. Bazarea pe numărul elementului de meniu nu este garantată să funcționeze dacă migrezi codul de la dezvoltare la producție, de exemplu. Dacă transformi numărul într-o setare, devine mai bine, dar tot nu este chiar ideal.

O alternativă ar putea fi să legi un ancore inexistent, cum ar fi #olark, din elementul de meniu. Acest lucru poate fi setat folosind interfața utilizatorului și este fiabil în toate mediile. Apoi, scriptul tău separat ar trebui să observe schimbarea hash-ului (în bara de adresă a browserului) și să acționeze în consecință.

Un exemplu simplu de script CoffeeScript care se compilează în JavaScript și ascultă schimbările de hash:

if window.addEventListener
  window.addEventListener 'hashchange', (event) =>
  @showLogin()
else
  window.attachEvent 'onhashchange', (event) =>
  @showLogin()
#activează partajarea URL-ului
if location.hash then @showLogin()

@showLogin este o funcție care afișează un dialog care te lasă să te autentifici dacă hash-ul este egal cu '#login'.

[edit] Destul de amuzant, hash-ul din adresă nu se schimbă dacă dai clic pe un element de meniu. Acest lucru este neașteptat și ar putea fi din cauza unui alt script care previne evenimentul implicit. Așa că a trebuit să adaug o altă linie, pentru a schimba locația ferestrei ca răspuns la clic pe un link:

# asigură-te că hash-ul se schimbă când se dă clic pe un link din meniu (cumva, în cazul meu nu se întâmplă)
$('.menu-item a').click (event) =>
  window.location = $(event.currentTarget).attr 'href'

[/edit]

29 aug. 2014 12:24:52
1
-2

Poți folosi acest cod în functions.php pentru a adăuga un script suplimentar în elementul din meniul de navigare

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
Comentarii

Acesta nu este un rezultat corect, va strica complet meniul, deoarece toate butoanele vor fi afectate și nu realizează ceea ce a fost cerut în întrebare.

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