Aplicar script jQuery solo a páginas de productos y categorías de WooCommerce
Tengo este script que automáticamente desplaza hacia abajo hasta el contenido principal al cargar la página.
jQuery(document).ready(function($){
if ( $(window).width() < 768 || window.Touch) {
$('html, body').animate({ scrollTop: $("#primary").offset().top}, 2000);}
});
1. Sin embargo, me gustaría aplicarlo solamente a nuestras páginas de productos y categorías de WooCommerce para que no funcione en las páginas de inicio/blog. ¿Cómo podría hacer esto?
Puedo hacer esto pobremente editando los archivos del núcleo de WooCommerce pero sé que es una idea horrible, así que estoy buscando ayuda sobre cómo hacerlo correctamente a través de mi archivo functions.php.
2. También me gustaría saber cómo aplicarlo a todas las páginas excepto la página de inicio en caso de que esa sea una mejor opción más adelante.
¡Muchas gracias!

Hay dos formas en las que podrías hacerlo.
1. Usando solo JavaScript
Los temas de WordPress normalmente utilizan la función body_class()
. Como resultado, verás que la etiqueta <body>
tendrá muchas clases. Luego puedes apuntar a páginas con una clase específica para ejecutar tu código en JavaScript:
if( $('body.whateverclass').length || $('body.anotherclass').length ){
// Tu código JS aquí
}
2. Usando PHP
Puedes aprovechar wp_localize_script()
para enviar una bandera a tu código.
Supongamos que has encolado un archivo llamado site.js
con un nombre de handle site
, en tu functions.php
tendrás:
wp_register_script( 'site', 'path/to/site.js' );
wp_enqueue_script( 'site' );
Ahora puedes agregar algunas banderas:
wp_register_script( 'site', 'path/to/site.js' ); # Sin cambios
$value = '';
if ( is_shop() || is_some_other_condition() ){
$value = 'yes';
}
wp_localize_script( 'site', 'MYSITE', $value );
wp_enqueue_script( 'site' ); # Sin cambios
Luego puedes verificar la variable MYSITE
en JavaScript:
if( 'yes' === MYSITE ){
// Tu código JS aquí
}
Edición: Preguntaste cómo ponerlo en el footer.php:
<script>
jQuery(document).ready(function($){
if( $('body.product-template-default').length || $('body.anotherclass').length ){
if ( $(window).width() < 768 || window.Touch) {
$('html, body').animate({ scrollTop: $("#primary").offset().top}, 2000);
}
}
});
</script>

Si estoy usando js... ¿Cómo se vería exactamente? Puse esto al final de mi footer.php y no puedo hacer que funcione. (funciona sin la sentencia if)
<script> if( $('body.product-template-default').length || $('body.anotherclass').length ){ jQuery(document).ready(function($){ if ( $(window).width() < 768 || window.Touch) { $('html, body').animate({ scrollTop: $("#primary").offset().top}, 2000); } }); } </script>

@PortalP Actualicé mi respuesta con tu código. La parte jQuery(document)....
debería estar en el nivel más externo.

¡No importa, ya lo hice funcionar! :) ¡GRACIAS! Esto va a ser tan útil en muchas situaciones.

Mi script de ancho de pantalla no funciona. Solo debería funcionar en anchos menores o iguales a 768px. ¿Está bien tener una declaración if
dentro de otra? ¿No deberían combinarse en una sola declaración if
?
¡Gracias!

No hay problema en poner un if
dentro de otro. ¿Cuál es el propósito de tu script? Por lo que puedo leer, debería desplazarse al elemento #primary
cada vez que cargas la página mientras el ancho de pantalla sea menor a 768.

Lamentablemente, no estoy disponible para sesiones de depuración privadas gratuitas :) Elimina el || window.Touch
e inténtalo de nuevo. O prueba StackOverflow para problemas no relacionados con WordPress.

@RRikesh ¿cuál es la diferencia entre site
y some_handle
? Pensaría que después de registrar site
, ahora lo encolamos... pero aparentemente se encoló algo más

Paso 1: guarda el código como un nuevo archivo js, por ejemplo main.js
Paso 2: añade una función condicional al archivo function.php de tu tema que diga algo como:
if (is_shop() || is_product_category()) {
wp_enqueue_script('main', get_template_directory_uri() . '/js/main.js', false, false, true);
}
Consulta esta página para ver las etiquetas condicionales según tus necesidades:
https://docs.woocommerce.com/document/conditional-tags/
¡Espero que te ayude!
Edición:
Para scripting inline podrías hacer (por ejemplo dentro de footer.php):
if (is_shop() || is_product_category()) {?>
<script>
jQuery(document).ready(function($){
if ( $(window).width() < 768 || window.Touch) {
$('html, body').animate({ scrollTop: $("#primary").offset().top}, 2000);
}
});
</script>
<?php}

¡Gracias! ¿Pero cómo puedo añadir el script en línea? Siento que hacer una llamada adicional a un archivo de script no tiene sentido cuando el script en sí (proporcionado arriba) es pequeño.

Supongo que podrías usar la misma sentencia IF en el footer.php pero en lugar de encolarlo podrías escribir tu script dentro de las etiquetas <script>, aunque no lo recomiendo, especialmente para scripts de jQuery.

¿Por qué no? ¿También podrías actualizar esa respuesta con un fragmento de ejemplo?
