¿Cómo sobrescribir archivos JavaScript en un tema hijo?
Estoy cargando algunos archivos JavaScript en el tema padre. La ruta en el tema padre es:
scripts > custom.js
En el tema hijo, estoy creando la misma ruta (scripts > custom.js
) y modificando parte del jQuery dentro del archivo custom.js
.
El problema es que los cambios no se están aplicando. ¿Es esta la forma incorrecta de realizar cambios en estos archivos en el tema hijo?

Los temas hijos solo sobrescriben archivos PHP (como header.php) que son incluidos con funciones como get_template_part o get_header, etc.
La forma correcta de agregar scripts en WordPress es usando wp_enqueue_script. Si tu tema padre utiliza esto, puedes sobrescribir los archivos JS usando wp_dequeue_script y encolando los tuyos.
Así...
<?php
// Se engancha tarde para asegurar que el registro del tema padre
// ya haya ocurrido y así poder deshacerlo. De lo contrario, el tema padre
// simplemente encolará su script de todos modos.
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 padre no está usando wp_enqueue_script, probablemente esté enganchándose a wp_head (o wp_footer) para imprimir los scripts ahí. Entonces usarías remove_action para eliminar esas funciones que imprimen los scripts, y luego encolar tu propio script.
Si el script está codificado directamente en el archivo de plantilla, solo necesitarás reemplazar ese archivo en tu tema hijo sin la etiqueta del script.
Si usaron llamadas a wp_enqueue_script que utilizan get_stylesheet_directory_uri, entonces no deberías tener que hacer nada. Como esto no está ocurriendo, tendrás que investigar qué hizo el autor del tema.

si el tema padre utiliza get_stylesheet_directory_uri para encolar scripts, entonces el tema hijo tendrá que duplicar todos los scripts encolados de esta manera, porque de lo contrario no serán encontrados. No existe un mecanismo de respaldo en get_stylesheet_directory_uri para verificar si un archivo individual existe en el tema hijo y recurrir al archivo del tema padre si es necesario.

Del Codex: "wp_print_scripts no debe utilizarse para encolar estilos o scripts en la página principal. Usa wp_enqueue_scripts en su lugar." http://codex.wordpress.org/Plugin_API/Action_Reference/wp_print_scripts

Ten en cuenta cuándo fue escrito esto: hace dos años. Antes de que wp_enqueue_scripts
pudiera usarse para encolar scripts únicamente en el front end. Actualizado. Si ves algo desactualizado, siéntete libre de editarlo.

Lo siento, no hay crítica implícita, voté a favor de tu respuesta :)

Ten en cuenta que quizás necesites establecer una prioridad tardía (por ejemplo 100) para asegurarte de que tu desencolado ocurra después del encolado del tema padre.
add_action( 'wp_enqueue_scripts', 'wpse26822_script_fix', 100 );
de http://codex.wordpress.org/Function_Reference/wp_dequeue_script

Actualización para 2016: según http://stackoverflow.com/questions/23507179/wp-dequeue-script-for-child-theme-to-replace-script también debemos usar wp_deregister_script('parent-script-handle');
para eliminar completamente el script padre. De hecho, no funcionó para mí sin esto. WP 4.6.1

¿puedes responder mi pregunta aquí por favor? Esta respuesta es un poco confusa:https://wordpress.stackexchange.com/questions/286957/modifying-js-files-in-child-theme

@PhiLho, estoy usando la versión 5.4, y wp_dequeue_script()
sí funcionó por sí sola en mi caso. El tema padre tenía wp_enqueue_script( 'fitvids', get_template_directory_uri() . '/js/fitvids.js', array( 'jquery' ), '1.1', true );
-- quizás tiene que ver con la forma en que el script fue cargado por el tema padre?

@PhiLho, también agregué wp_deregister_script
, esto no cambió nada, pero quizás liberó algo de memoria inútilmente retenida por el registro del script. También tuve que agregar dos acciones para 'wp_enqueue_scripts', la prioridad por defecto para cargar mi hoja de estilos personalizada, pero para eliminar el script agregué otra, con prioridad 100, como sugería la respuesta. Pero el hecho de que no funcionara no puede explicarse por el fiasco del orden de carga, porque en mi caso, descargar o desregistrar en el hook de prioridad normal solo registraba errores. Extraño, en cualquier caso.

En algunos casos es importante priorizar tanto las llamadas a add_action como a la función 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, wp_enqueue_scripts fue llamado por el tema padre con una prioridad de 20120206 (la fecha) y esta acción se agrega con una prioridad apenas mayor para que se elimine de la cola inmediatamente. Luego, la sentencia de encolado que sigue en realidad tiene prioridad después de eso para asegurar que se cargue después de que el antiguo fue eliminado de la cola. El true, en este caso también es importante porque especifica que debe encolarse en el footer, que es donde el script padre fue encolado originalmente.
Además, no puedo explicarlo completamente, pero noté que si tienes cuidado al eliminar el script inicial de la cola inmediatamente después de que se encola, parece que puedes evitar efectivamente que se cargue en primer lugar.

La función wp_enqueue_script
no tiene un parámetro de prioridad, solo tiene 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 la versión correcta se envíe al cliente independientemente del almacenamiento en caché [...]

llama a wp_deregister_script antes de registrar tu propia versión

// encolar tu archivo de script requerido
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' ) );
}
// desencolar tu archivo de script requerido
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 );

Desde la versión 4.7 de WordPress puedes usar 'get_theme_file_uri()' que primero buscará en la carpeta de tu tema hijo y después en la carpeta del tema padre. De esta manera, el archivo en el tema hijo tendrá prioridad.
wp_enqueue_script('custom-js', get_theme_file_uri() . '/scripts/custom.js');
