Cómo agregar correctamente Javascript en functions.php

25 jun 2014, 21:30:03
Vistas: 148K
Votos: 17

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?

Fuente del Snippet jQuery

4
Comentarios

Es una locura: ¿no puedes editar las flechas en el código que las genera? (¿O se descargan de una fuente externa?) En cualquier caso, puedes hacer ambos reemplazos en una sola función para evitar leer y escribir todo el HTML dentro del bloque del carrito dos veces. No conozco una forma de inyectar eso directamente en la página desde functions.php, pero puedes guardarlo en un archivo de script separado (si aún no tienes uno, puedes agregarlo) y luego usar wp-enqueue-script. También tendrás que cambiar los $ por jQuery (consulta esa sección en la página 7)

Rup Rup
25 jun 2014 21:46:08

No, estoy bastante seguro de que no se puede eliminar antes de insertarlo. Si es posible, no he encontrado una manera de hacerlo.

Buen punto sobre agregarlo en una sola función. ¿Se vería así?

$(document).ready(function() {
    $(".woocommerce-cart").html(function(i, val) {
    return val.replace(" →", "");
    return val.replace("← ", "");
    });
});

Investigaré lo del enqueue script. Aunque parece un poco complicado... ¡Gracias!

user2806026 user2806026
25 jun 2014 23:18:30

Bien. Probé este enfoque:

Creé un archivo llamado 'removeArrows.js' y lo coloqué en la carpeta de mi plugin. Tiene el mismo contenido que el código original, excepto que usa 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' );

(Lo siento, no puedo entender cómo hacer que el código se muestre correctamente)

Esto no funcionó. ¿Puedes ayudarme a solucionarlo?

user2806026 user2806026
25 jun 2014 23:32:34

Por favor, presenta una [edición] y añade toda la información relevante directamente a tu pregunta. No uses la sección de comentarios para agregar código

Pieter Goosen Pieter Goosen
26 jun 2014 14:52:08
Todas las respuestas a la pregunta 4
6
13

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 ); 
26 jun 2014 15:47:32
Comentarios

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?

user2806026 user2806026
26 jun 2014 17:41:22

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.

Pieter Goosen Pieter Goosen
26 jun 2014 17:44:46

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.

user2806026 user2806026
26 jun 2014 18:07:51

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

Pieter Goosen Pieter Goosen
26 jun 2014 18:10:41

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

user2806026 user2806026
27 jun 2014 15:41:57

Disculpa, hubo un error al copiar y pegar. El último fragmento de código completo es para temas padre. Si esto no funciona, necesitarás revisar tu script

Pieter Goosen Pieter Goosen
27 jun 2014 16:31:59
Mostrar los 1 comentarios restantes
7

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.

26 jun 2014 00:06:15
Comentarios

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

Pat J Pat J
26 jun 2014 00:24:23

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.

Matt Royal Matt Royal
26 jun 2014 00:33:11

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

Pat J Pat J
26 jun 2014 03:04:37

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

Matt Royal Matt Royal
26 jun 2014 09:30:07

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í?

user2806026 user2806026
26 jun 2014 13:23:52

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

Matt Royal Matt Royal
26 jun 2014 14:38:00

Este código JS debe envolverse en <script></script>. Este método para renderizar JS en WP no es recomendado, pero en algunos casos las soluciones rápidas son más importantes que las mejores prácticas.

Tahi Reu Tahi Reu
9 ene 2020 16:13:14
Mostrar los 2 comentarios restantes
1

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' );
24 ago 2018 17:31:38
Comentarios

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.

Xhynk Xhynk
24 ago 2018 19:33:34
1
-1

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!

24 ago 2018 14:24:26
Comentarios

En la época en que el OP publicó, los desarrolladores sí usaban jQuery y JavaScript indistintamente. No es para nada preciso, pero así de popular era jQuery y de cuántas características le faltaban a JavaScript.

Rocky Kev Rocky Kev
29 abr 2020 19:01:00