¿Cómo anular archivos JavaScript en el tema secundario?

35

Estoy cargando algunos archivos JavaScript en el tema principal. La ruta en el tema principal es:

scripts > custom.js

En el tema secundario, estoy creando la misma ruta ( scripts > custom.js) y cambiando parte de jQuery dentro del custom.jsarchivo.

El problema es que los cambios no se están aplicando. ¿Es esta la forma incorrecta de hacer cambios en estos archivos en el tema secundario?

Chris Molitor
fuente
1
¿Cuál es el tema principal? ¿Cómo son llamados los scripts por el Tema principal?
Chip Bennett

Respuestas:

51

Los temas secundarios solo anulan los archivos php (como header.php) que se incluyen con funciones como get_template_part o get_header, etc.

La forma correcta de agregar scripts a WordPress es con wp_enqueue_script . Si su tema principal usa esto, puede anular los archivos JS mediante el uso de wp_dequeue_script y colocando el suyo.

Al igual que...

<?php
// hook in late to make sure the parent theme's registration 
// has fired so you can undo it. Otherwise the parent will simply
// enqueue its script anyway.
add_action('wp_enqueue_scripts', 'wpse26822_script_fix', 100);
function wpse26822_script_fix()
{
    wp_dequeue_script('parent_theme_script_handle');
    wp_enqueue_script('child_theme_script_handle', get_stylesheet_directory_uri().'/scripts/yourjs.js', array('jquery'));
}

Si el tema principal no usa wp_enqueue_script, probablemente esté enganchado en wp_head (o wp_footer) para hacer eco de los scripts allí. Por lo tanto, usaría remove_action para deshacerse de esas funciones que hacen eco de las secuencias de comandos y luego crear su propia secuencia de comandos.

Si el script está codificado en el archivo de plantilla, solo tendrá que reemplazar ese archivo de plantilla en el tema secundario sin la etiqueta del script.

Si utilizaron llamadas wp_enqueue_script que utilizan get_stylesheet_directory_uri , entonces no debería tener que hacer nada. Como esto no está sucediendo, solo tendrás que mirar y ver qué hizo el autor del tema.

chrisguitarguy
fuente
2
Si los padres utiliza el tema get_stylesheet_directory_uri a los scripts enqueue, entonces el tema de niño va a tener que duplicar todos los scripts tanto en cola, porque de lo contrario se pueden encontrar woun't. No hay un mecanismo alternativo en get_stylesheet_directory_uri para verificar si existe un archivo individual en el tema secundario y, si es necesario, recurrir al archivo del tema principal.
Desde el Códice: "wp_print_scripts no debe usarse para poner en cola estilos o scripts en la página principal. Utilice wp_enqueue_scripts en su lugar. ” Codex.wordpress.org/Plugin_API/Action_Reference/…
Christian Lescuyer
Tenga en cuenta cuando esto se escribió: hace dos años. Antes solo se wp_enqueue_scriptspodía usar para poner en cola los scripts en el front-end. Actualizado. Si ve algo desactualizado, no dude en editarlo.
chrisguitarguy
44
Tenga en cuenta que es posible que tenga que establecer una prioridad tardía (por ejemplo, 100) para asegurarse de que su retirada se produzca después de la cola del tema principal. add_action( 'wp_enqueue_scripts', 'wpse26822_script_fix', 100 ); de codex.wordpress.org/Function_Reference/wp_dequeue_script
Spone
44
Actualización para 2016: de acuerdo con stackoverflow.com/questions/23507179/… también tenemos que usar wp_deregister_script('parent-script-handle');para eliminar por completo el script principal. De hecho, no funcionó para mí sin él. WP 4.6.1
PhiLho
1

En algunos casos, es importante priorizar las llamadas a la función add_action y wp_enqueue_script de la siguiente manera:

add_action('wp_enqueue_scripts', 'wpse26822_script_fix', 20120207);
function wpse26822_script_fix()
{
    wp_dequeue_script('storefront-navigation');
    wp_enqueue_script('my_storefront-navigation', get_stylesheet_directory_uri().'/js/navigation.min.js', array('jquery'),20151110,true);
}

En este caso, el padre llamó a wp_enqueue_scripts con una prioridad de 20120206 (la fecha) y, por lo tanto, esta acción se agrega con una prioridad apenas mayor para que se elimine de inmediato. Luego, la declaración en cola que sigue a continuación se prioriza realmente después de eso para garantizar que se cargue después de que se eliminó la anterior. La verdad, en este caso, también es importante porque eso especifica que debe colocarse en cola en el pie de página, que es donde se colocó por primera vez la secuencia de comandos principal.

Además, no puedo explicarlo por completo, pero me doy cuenta de que si tiene cuidado al retirar el script inicial inmediatamente después de que se haya puesto en cola, parece que puede evitar que se cargue efectivamente en primer lugar.

damiankaelgreen
fuente
1
La función wp_enqueue_scriptno tiene un parámetro de prioridad, es solo un número de versión que se concatena al final de la ruta como una cadena de consulta. Este parámetro se utiliza para garantizar que se envíe la versión correcta al cliente independientemente del almacenamiento en caché [...]
Emile Bergeron
1

llame a wp_deregister_script antes de registrar su propia versión

Mohamed Abo Badawy
fuente
1
¿Por qué? Esto solo es necesario cuando está utilizando el mismo controlador, algo que no tiene que hacer. Probablemente ni siquiera deberías, porque es más fácil depurar el código cuya fuente es clara.
fuxia
1
// enqueue your required script file
add_action('wp_enqueue_scripts', 'your_child_theme_js_file_override');
function your_child_theme_js_file_override(){
    wp_enqueue_script( 'child_theme_script_handle', get_stylesheet_directory_uri() . '/assets/js/your-file.js', array('jquery' ) );
}

// dequeue your required script file
function your_child_theme_js_file_dequeue() {
   wp_dequeue_script( 'parent_theme_script_handle' );
}
add_action( 'wp_print_scripts', 'your_child_theme_js_file_dequeue', 100 );
Zabid Ahmed
fuente