Как переопределить JavaScript файлы в дочерней теме?
Я загружаю некоторые JavaScript файлы в родительской теме. Путь в родительской теме:
scripts > custom.js
В дочерней теме я создаю такой же путь (scripts > custom.js
) и изменяю некоторый jQuery код внутри файла custom.js
.
Проблема в том, что изменения не применяются. Это неправильный способ внесения изменений в эти файлы в дочерней теме?

Дочерние темы переопределяют только PHP-файлы (например, header.php), которые подключаются с помощью функций, таких как get_template_part или get_header и т.д.
Правильный способ добавления скриптов в WordPress — использование wp_enqueue_script. Если родительская тема использует этот метод, вы можете переопределить JS-файлы с помощью wp_dequeue_script и подключить свои собственные.
Например...
<?php
// Подключаемся позже, чтобы убедиться, что регистрация скриптов
// родительской темы уже выполнена, и можно её отменить.
// В противном случае родительская тема всё равно подключит свой скрипт.
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'));
}
Если родительская тема не использует wp_enqueue_script, скорее всего, она подключает скрипты через wp_head или wp_footer, выводя их напрямую. В таком случае вы можете использовать remove_action, чтобы убрать вывод этих скриптов, и затем подключить свои собственные.
Если скрипт жёстко встроен в файл шаблона, вам просто нужно заменить этот файл шаблона в дочерней теме, удалив тег script.
Если в родительской теме использовались вызовы wp_enqueue_script с get_stylesheet_directory_uri, то вам, скорее всего, ничего не нужно делать. Поскольку в вашем случае это не сработало, придётся разбираться, как именно автор темы реализовал подключение скриптов.

если родительская тема использует get_stylesheet_directory_uri для подключения скриптов, то дочерняя тема должна дублировать все таким образом подключённые скрипты, потому что иначе они не будут найдены. В get_stylesheet_directory_uri нет механизма отката, который проверял бы наличие отдельного файла в дочерней теме и, при необходимости, подключал бы файл из родительской темы.

Из Кодекса: «wp_print_scripts не следует использовать для подключения стилей или скриптов на главной странице. Вместо этого используйте wp_enqueue_scripts.» http://codex.wordpress.org/Plugin_API/Action_Reference/wp_print_scripts

Учитывайте, когда это было написано: два года назад. До того, как wp_enqueue_scripts
можно было использовать только для подключения скриптов на фронтенде. Обновлено. Если видите что-то устаревшее, не стесняйтесь редактировать.

Извините, никакой критики не подразумевалось, я проголосовал за ваш ответ :)

Обратите внимание, что вам может потребоваться установить низкий приоритет (например, 100), чтобы убедиться, что ваш выгрузка скрипта произойдет после загрузки скрипта родительской темы.
add_action( 'wp_enqueue_scripts', 'wpse26822_script_fix', 100 );
из http://codex.wordpress.org/Function_Reference/wp_dequeue_script

Обновление для 2016 года: согласно http://stackoverflow.com/questions/23507179/wp-dequeue-script-for-child-theme-to-replace-script нам также необходимо использовать wp_deregister_script('parent-script-handle');
для полного удаления скрипта родительской темы. Действительно, у меня это не работало без этого. WP 4.6.1

можете ответить на мой вопрос здесь, пожалуйста? Этот ответ немного запутанный:https://wordpress.stackexchange.com/questions/286957/modifying-js-files-in-child-theme

@PhiLho, я использую 5.4, и wp_dequeue_script()
сработал для меня сам по себе. В родительской теме было wp_enqueue_script( 'fitvids', get_template_directory_uri() . '/js/fitvids.js', array( 'jquery' ), '1.1', true );
-- возможно, это связано с тем, как скрипт был загружен родительской темой?

@PhiLho, я также добавил wp_deregister_script
, это ничего не изменило, но, возможно, освободило память, бесполезно удерживаемую регистрацией скрипта. Мне также пришлось добавить два действия для 'wp_enqueue_scripts' - с приоритетом по умолчанию для загрузки моей таблицы стилей, но чтобы избавиться от скрипта я добавил ещё одно с приоритетом 100, как предлагалось в ответе. Но тот факт, что это не сработало, нельзя объяснить проблемой порядка загрузки, потому что в моём случае выгрузка или отмена регистрации в хуке с обычным приоритетом только вызывала ошибки в логах. Странно, в любом случае.

В некоторых случаях важно расставить приоритеты как для add_action, так и для вызовов функции wp_enqueue_script, например:
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);
}
В данном случае wp_enqueue_scripts был вызван родительской темой с приоритетом 20120206 (дата), поэтому это действие добавлено с приоритетом чуть выше, чтобы его можно было сразу же удалить из очереди. Затем оператор enqueue, который следует за ним, фактически имеет более высокий приоритет, чтобы гарантировать, что он загрузится после того, как старый скрипт был удален из очереди. Параметр true также важен, так как он указывает, что скрипт должен быть добавлен в футер, где изначально был добавлен родительский скрипт.
Кроме того, я не могу полностью это объяснить, но заметил, что если аккуратно удалить первоначальный скрипт из очереди сразу после его добавления, можно эффективно предотвратить его загрузку с самого начала.

вызовите wp_deregister_script перед регистрацией своей собственной версии

// подключение необходимого файла скрипта
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' ) );
}
// отключение необходимого файла скрипта
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 );

Начиная с WordPress версии 4.7 вы можете использовать функцию 'get_theme_file_uri()', которая сначала будет искать файл в папке дочерней темы, а затем в папке родительской темы. Таким образом, файл в дочерней теме будет иметь приоритет.
wp_enqueue_script('custom-js', get_theme_file_uri() . '/scripts/custom.js');
