Cómo agregar correctamente Javascript en functions.php
Me gustaría eliminar algunas flechas de aspecto desagradable que son estándar en los botones del carrito en WooCommerce. Para lograr esto, encontré un consejo de agregar el siguiente código, que debería eliminar las flechas cuando el documento se haya cargado.
¿Asumo que voy a ponerlo en mi functions.php? ¿Cómo haría eso exactamente?
$(document).ready(function() {
$(".woocommerce-cart").html(function(i, val) {
return val.replace(" →", "");
});
$(".woocommerce-cart").html(function(i, val) {
return val.replace("← ", "");
});
});
EDICIÓN
Bien. He probado este enfoque:
Creé un archivo llamado 'removeArrows.js' y lo coloqué en mi carpeta de plugins. Este tiene el mismo contenido que el código original, excepto jQuery en lugar de $. Luego agregué lo siguiente a functions.php:
function wpb_adding_scripts() {
wp_register_script('my_amazing_script', plugins_url('removeArrows.js', __FILE__), array('jquery'),'1.1', true);
wp_enqueue_script('my_amazing_script');
}
add_action( 'wp_enqueue_scripts', 'wpb_adding_scripts' );
No puedo descifrar cómo hacer que el código se muestre correctamente. Esto no funcionó. ¿Alguna sugerencia para hacer que esto funcione?

Tu variable $scr
en la función wp_register_script()
es incorrecta. Dado que tu archivo functions.php está dentro de tu plugin, y tu removeArrows.js está en la raíz de tu plugin, tu $scr
debería verse así:
plugins_url( '/removeArrows.js' , __FILE__ )
Otro punto a tener en cuenta, siempre es una buena práctica cargar tus scripts y estilos al final. Esto asegurará que no sean sobrescritos por otros scripts y estilos. Para hacer esto, simplemente agrega una prioridad muy baja (un número muy alto) al parámetro de prioridad ($priority
) de add_action
.
add_action( 'wp_enqueue_scripts', 'wpb_adding_scripts', 999 );
Y siempre carga/encola scripts y estilos mediante el hook de acción wp_enqueue_scripts
, ya que este es el hook adecuado para usar. No cargues scripts y estilos directamente en wp_head
o wp_footer
.
EDITADO
Para temas, como has indicado que ahora has movido todo a tu tema, tu $scr
cambiaría a esto:
get_template_directory_uri() . '/removeArrows.js'
para temas principales y esto:
get_stylesheet_directory_uri() . '/removeArrows.js'
para temas hijos. Tu código completo debería verse así:
function wpb_adding_scripts() {
wp_register_script('my_amazing_script', get_template_directory_uri() . '/removeArrows.js', array('jquery'),'1.1', true);
wp_enqueue_script('my_amazing_script');
}
add_action( 'wp_enqueue_scripts', 'wpb_adding_scripts', 999 );

Muchas gracias por tu excelente consejo. Parece que este es el enfoque a utilizar. Sin embargo, tengo una pregunta; el archivo functions.php está en mi carpeta del tema. ¿Cómo enlazaría el archivo js si está en la misma carpeta raíz del tema?

Debes mantener todo en un plugin o en un tema, no los dividas. Si estás en un tema, tu $scr
sería get_template_directory_uri() . '/removeArrows.js'
para temas principales, y get_stylesheet_directory_uri() . '/removeArrows.js'
para temas hijos.

Lo intenté nuevamente, esta vez agregando el archivo removeArrows.js directamente en la carpeta del tema y usando lo siguiente en functions.php: function wpb_adding_scripts() { wp_register_script('my_amazing_script', get_template_directory_uri() . '/removeArrows.js', FILE), array('jquery'),'1.1', true); wp_enqueue_script('my_amazing_script'); }
add_action( 'wp_enqueue_scripts', 'wpb_adding_scripts', 999 );
Esto me da un error de sintaxis: Parse error: syntax error, unexpected ',' en la línea de wp_register_script.

get_template_directory_uri() . '/removeArrows.js', FILE)
debería ser simplemente get_template_directory_uri() . '/removeArrows.js'

No. Usé exactamente el código completo que editaste al final de tu publicación original. Lo único que hace es congelar la página del carrito al ver los contenidos. Creo que simplemente me rendiré :-) Un último intento: empezaste mencionando que get_template_directory_uri() es para temas padres, y luego en el código final completo dijiste que es para temas hijos. ¿Cuál es? Mi tema es padre :-)

No agregaría otro archivo JS externo, es solo un recurso adicional e innecesario para cargar y eso es algo que queremos reducir en términos de tiempos de carga de la página.
Agregaría este fragmento de jQuery en el encabezado de tu sitio web usando el hook wp_head
. Pegarías lo siguiente en el archivo functions.php de tu tema o plugin. También me he asegurado de que jQuery esté en modo sin conflicto, como puedes ver a continuación.
add_action('wp_head','woocommerce_js');
function woocommerce_js()
{ // salir de php ?>
<script>
jQuery(document).ready(function($) {
$(".woocommerce-cart").html(function(i, val) {
return val.replace(" →", "");
});
$(".woocommerce-cart").html(function(i, val) {
return val.replace("← ", "");
});
});
</script>
<?php } // volver a entrar en php
Una vez que hayas hecho esto y actualices tu página, revisa el código fuente para asegurarte de que este fragmento de jQuery se esté cargando correctamente en tu página. Si es así, debería funcionar a menos que haya algún problema en el propio fragmento de jQuery que estás utilizando.

Sin embargo, esa no es la forma correcta de cargar JavaScript en WordPress. Consulta wp_enqueue_script()
para obtener más información.

Hola @PatJ, estoy de acuerdo, para cargar una biblioteca JS externa o un archivo JS con todas tus funciones de JavaScript, entonces sí, absolutamente sería la forma correcta. Sin embargo, si estás cargando un fragmento de JavaScript, no tiene sentido crear un archivo JS completamente nuevo y añadir una solicitud HTTP adicional solo para eso. Tomemos Google Analytics como ejemplo, en el 99% de los temas o desarrollos personalizados, el JS se agregará en el encabezado o pie de página a través de opciones del tema o el archivo de funciones. Es una práctica común incluir fragmentos de JS o incluso CSS de esta manera.

"Práctica común" no significa que sea correcto, sin embargo. La documentación de wp_enqueue_script()
incluso afirma Este es el método recomendado para vincular JavaScript a una página generada por WordPress.

Si tomas el tema predeterminado twentyfourteen de WordPress, carga html5.js en el header.php. Se hace de esta manera por una razón, para verificar si el navegador cumple la condición de ser IE < 9, pero mi punto es que, si bien encolar es el método recomendado y preferido, dependiendo de todas las demás variables/circunstancias que rodean lo que intentas lograr, puede que no siempre sea el más práctico y creo que se debe usar cierto criterio. Mira, podría estar completamente equivocado en esta perspectiva también, me interesa escuchar lo que algunos de los tipos realmente experimentados tienen que decir :-)

Gracias por tu gran sugerencia. Sin embargo, no puedo hacer que funcione; si agrego tu código dentro de la etiqueta <?php de mi functions.php obtengo un 'Parse error: syntax error, unexpected '<' in /somepath.../functions.php on line 1146'. Si lo agrego fuera de <?php, simplemente parece mostrar el código dado en la parte superior de la página. ¿Qué me estoy perdiendo aquí?

Cuando lo pegas en tu archivo functions.php - elimina el primer <?php
del código que proporcioné, ya que ya tienes la etiqueta de apertura <?php
en la línea 1 de tu archivo functions.php. He editado mi respuesta original y también lo he eliminado de allí.

Como la respuesta ya está aceptada, solo quería mencionar que hay otra forma de encolar código JavaScript en el pie de página que he utilizado muchas veces.
En el archivo functions.php:
function load_script_to_remove_arrow(){
?>
<script>
$(document).ready(function() {
$(".woocommerce-cart").html(function(i, val) {
return val.replace(" →", "");
});
$(".woocommerce-cart").html(function(i, val) {
return val.replace("← ", "");
});
});
</script>
<?php
}
add_action( 'wp_footer', 'load_script_to_remove_arrow' );
Puedes cargar este script solo en una plantilla de página específica usando una condición
if( is_page_template( 'page-template.php' ) ):
//coloca el código anterior (o solo la parte de add_action) dentro de esta condición para cargar el archivo solo si la condición es verdadera
endif;
Si la plantilla page-template.php está en un directorio (por ejemplo, el directorio templates en la raíz de tu tema) puedes escribirlo así:
is_page_template( 'templates/page-template.php' );

No recomendaría "incrustar" el JavaScript en el pie de página de esta manera. Impide que se pueda desenganchar o modificar (al menos, fácilmente), lo cual es extremadamente importante en el desarrollo de plugins y temas. Si eres el usuario final de un sitio y necesitas un script rápido o algo así, adelante, pero incluso en ese caso, wp_enqueue_script()
es casi siempre universalmente mejor y más flexible.

Para responder a la pregunta primero debemos hacer una distinción entre JavaScript y jQuery.
Para decirlo de manera sencilla:
- JavaScript está basado en ECMAScript
- jQuery es una librería para JavaScript
Así que en realidad estás haciendo dos preguntas diferentes:
- El título habla sobre una solución para implementar JavaScript
- La pregunta habla sobre una solución para implementar jQuery
Debido a que los resultados de Google muestran tu título y todo el contenido de la página habla sobre jQuery, esto puede resultar muy frustrante para las personas que buscan una solución en JavaScript.
Y ahora la solución para jQuery:
wp_enqueue_script( 'script-id', get_template_directory_uri() . '/js/script.js', array ( 'jquery' ), 1.1, true);
Y la solución para JavaScript:
wp_enqueue_script( 'script-id', get_template_directory_uri() . '/js/script.js', array(), '1.0.0', true );
Este código puede añadirse a tu functions.php
La ubicación de los scripts en ambos casos es wp-content/themes/theme-name/js/script.js
¡Feliz programación!
