Agregar Javascript al Menú de WordPress
¿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.

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

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.

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?

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

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

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]

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