Agregar Javascript al Menú de WordPress

8 jul 2014, 23:28:03
Vistas: 34.1K
Votos: 10

¿Existe alguna manera de poner javascript en la parte URL de un elemento del menú de WordPress? Tengo una función de chat en vivo en mi sitio, y se supone que debo poner este código en el sitio para crear un enlace que abra el chat en vivo (como se sugiere aquí).

<!-- INICIO DEL ENLACE DE CHAT OLARK -->
<a href="javascript:void(0);" onclick="olark('api.box.expand')">
    ¡Haz clic aquí para chatear!
</a>
<!-- FIN DEL ENLACE DE CHAT OLARK -->

El cliente quiere el enlace en la barra de navegación de utilidades, que fue creada usando un menú de WordPress en el panel de administración. Pero cuando copio y pego javascript:void(0);" onclick="olark('api.box.expand') en el campo URL en el panel de WordPress, simplemente desaparece y el enlace permanece inactivo.

Algo que leí sugería que tal vez podría poner una clase personalizada en el enlace en cuestión y luego escribir una función Javascript que se active cuando se hace clic en el enlace con esa clase. Lo intenté, sin embargo, no pude hacer que funcionara. No sé mucho de Javascript, así que es posible que lo estuviera escribiendo completamente mal.

¿Alguien sabe cómo hacer esto? Me gustaría hacerlo sin usar un plugin.

5
Comentarios

No deberías poder agregar javascript al menú a través de la interfaz de usuario, y nunca deberías depender del atributo onclick para ejecutar javascript

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

¿Por qué no? Ese es el código que me proporcionó la compañía del chat en vivo.

mcography mcography
9 jul 2014 00:15:12

Eso no significa que sea la forma correcta de hacerlo, investiga el evento .click() de jQuery

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

No estaba tratando de decir que lo fuera. Solo intentaba preguntar por qué nunca debería confiar en el atributo onclick. Investigaré sobre .click().

mcography mcography
9 jul 2014 17:21:04

Porque HTML es para definir un documento, agregar un atributo onclick es malo de la misma manera que agregar una etiqueta o atributo de estilo en línea es malo, los mezcla. Consulta esta pregunta para entender por qué es malo

Tom J Nowell Tom J Nowell
9 jul 2014 17:29:31
Todas las respuestas a la pregunta 4
4

Es bueno que funcione. Si es para un cliente o simplemente quieres un código más limpio, puedes hacerlo como sugirió @Tom J Nowell.

Añade un elemento personalizado al menú, enlázalo a ninguna parte o a cualquier lugar. Descubre el ID del elemento del menú (cada elemento tiene uno) y luego apunta a ese ID con jQuery.

$("#menu-item-num").on("click", function(e){ 
      e.preventDefault();
      // código de olark aquí
});

De esta manera, cada vez que un usuario haga clic en ese menu-item se activará el script anterior. Puedes encolar el script de jQuery a través de functions.php.

Actualización:

  1. Asegúrate de que tu olark.js se esté cargando. Si lo estás añadiendo al pie de página o al encabezado, inspecciona tu página y asegúrate de que el script esté allí. También, verifica que no estés recibiendo ningún error en la consola del navegador.

  2. Envuelve tu JavaScript con un document ready, para que el script se ejecute en el momento adecuado:

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

El hecho de que el enlace no se cargue significa que hay algo mal con el script en sí o que el script no se está cargando en absoluto.

9 jul 2014 01:52:15
Comentarios

Gracias por tu respuesta. No sé mucho sobre Javascript, ¿podrías decirme por qué tu solución es mejor/más limpia? Solo estoy tratando de entender.

mcography mcography
9 jul 2014 17:27:20

Creé un archivo llamado olark.js y lo encolé, pero el enlace aún lleva a # (porque así lo configuré en el panel de Wordpress). Esto es lo que puse en olark.js: $("#menu-item-38872").on("click", function(e){ e.preventDefault(); // código de olark aquí olark('api.box.expand'); }); ¿Qué estoy haciendo mal?

mcography mcography
9 jul 2014 18:36:52

¡Ajá! El jQuery(document).ready(function($) { ¡funcionó! Gracias, @gdaniel!

mcography mcography
9 jul 2014 18:42:09

Me alegro de que funcionara. La idea es mantener el script separado del contenido. Por eso se sugiere hacerlo de esa manera.

gdaniel gdaniel
9 jul 2014 18:52:10
0

Solución #1 (no ideal, pero funciona):

// Enlace de Chat en Vivo en el Menú 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">Chat en Vivo</a></li>';
    }
    return $items;
}

Solución #2 (ideal):

Con la ayuda de los comentarios anteriores, aquí está la solución que funcionó para mí. Creé un nuevo archivo llamado olark.js y coloqué este código:

jQuery(document).ready(function($) {
    $("#menu-item-38872").on("click", function(e){ 
          e.preventDefault();
          // código de olark aquí
          olark('api.box.expand');
    });
});

Luego, agregué el script en mi functions.php con el siguiente código:

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

Si no funciona, asegúrate de que estás agregando correctamente tu script. Yo estoy usando un tema hijo, así que tuve que usar get_stylesheet_directory_uri() en lugar de get_template_directory_uri().

9 jul 2014 00:15:54
0

Creo que hay una opción "más confiable". Depender del número del elemento del menú no garantiza que funcione si migras tu código de desarrollo a producción, por ejemplo. Si conviertes el número en una configuración mejora, pero aún no es realmente bueno.

Una alternativa podría ser enlazar a un ancla inexistente, como #olark, desde tu elemento del menú. Esto se puede configurar usando la interfaz de usuario y es confiable entre entornos. Luego, tu script separado debería observar el cambio de hash (en la barra de direcciones del navegador) y actuar en consecuencia.

Un simple ejemplo en CoffeeScript que se compila a JavaScript y escucha el hashchange:

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

@showLogin es una función que muestra un diálogo que te permite iniciar sesión si el hash es igual a '#login'.

[edición] Curiosamente, el hash en la dirección no cambia si haces clic en un elemento del menú. Esto es inesperado y podría deberse a otro script que previene el evento por defecto. Así que tuve que agregar otra línea, para hacer que la ubicación de la ventana cambie al hacer clic en un enlace:

# asegurarse de que el hash cambie al hacer clic en un enlace del menú (en mi caso, no lo hace)
$('.menu-item a').click (event) =>
  window.location = $(event.currentTarget).attr 'href'

[/edición]

29 ago 2014 12:24:52
1
-2

Puedes usar esto en functions.php para agregar un script adicional en los elementos del menú de navegación

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
Comentarios

Esta no es una solución adecuada, romperá completamente el menú, porque todos los botones se verán afectados, y no hace lo que se preguntaba en la cuestión.

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