Как переопределить файлы JavaScript в дочерней теме?

35

Я загружаю некоторые файлы JavaScript в родительской теме. Путь в родительской теме:

scripts > custom.js

В дочерней теме я создаю тот же путь ( scripts > custom.js) и изменяю некоторые jQuery внутри custom.jsфайла.

Проблема в том, что изменения не применяются. Это неправильный способ внести изменения в эти файлы в дочерней теме?

Крис Молитор
источник
1
Какая родительская тема? Как сценарии вызываются родительской темой?
Чип Беннетт

Ответы:

51

Дочерние темы переопределяют только файлы php (такие как header.php), которые включены в такие функции, как get_template_part или get_header и т. Д.

Правильный способ добавления скриптов в WordPress - с помощью wp_enqueue_script . Если ваша родительская тема использует это, вы можете переопределить файлы JS, используя wp_dequeue_script и поставив в очередь свои собственные.

Вот так...

<?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'));
}

Если родительская тема не использует wp_enqueue_script, она, вероятно, подключается к wp_head (или wp_footer) для вывода сценариев там. Таким образом, вы должны использовать remove_action, чтобы избавиться от этих функций, выводящих сценарии, а затем поставить в очередь свой собственный сценарий.

Если скрипт жестко запрограммирован в файле шаблона, вам просто нужно заменить этот файл шаблона в вашей дочерней теме без тега script.

Если они использовали вызовы wp_enqueue_script , которые используют get_stylesheet_directory_uri , то вам не нужно ничего делать. Так как этого не происходит, вам просто нужно покопаться и посмотреть, что сделал автор темы.

chrisguitarguy
источник
2
если родительская тема использует get_stylesheet_directory_uri для постановки в очередь сценариев, то дочерняя тема должна будет продублировать все сценарии, помещенные в очередь, потому что в противном случае они не будут найдены. В get_stylesheet_directory_uri отсутствует механизм возврата для проверки наличия отдельного файла в дочерней теме и возврата к файлу родительской темы в случае необходимости.
Из Кодекса: «wp_print_scripts не должен использоваться для постановки в очередь стилей или сценариев на первой странице. Вместо этого используйте wp_enqueue_scripts. ” Codex.wordpress.org/Plugin_API/Action_Reference/…
Кристиан Лескиер
Имейте в виду, когда это было написано: два года назад. До этого wp_enqueue_scriptsмог использоваться только для постановки сценариев на передний конец. Обновлено. Если вы видите что-то устаревшее, не стесняйтесь редактировать.
chrisguitarguy
4
Обратите внимание, что вам может потребоваться установить более поздний приоритет (например, 100), чтобы убедиться, что ваша очередь произошла после постановки в очередь родительской темы. add_action( 'wp_enqueue_scripts', 'wpse26822_script_fix', 100 ); из codex.wordpress.org/Function_Reference/wp_dequeue_script
Spone
4
Обновление для 2016: в соответствии со stackoverflow.com/questions/23507179/… мы также должны использовать, wp_deregister_script('parent-script-handle');чтобы полностью удалить родительский скрипт. Действительно, у меня не получилось без этого. WP 4.6.1
PhiLho
1

В некоторых случаях важно установить приоритетность вызовов функций 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 в этом случае также важно, поскольку оно указывает, что он должен быть помещен в нижний колонтитул, в который родительский сценарий был впервые помещен.

Кроме того, я не могу полностью объяснить это, но я замечаю, что если вы будете осторожны с удалением исходного сценария сразу после того, как он был помещен в очередь, кажется, что вы можете эффективно предотвратить его загрузку в первую очередь.

damiankaelgreen
источник
1
Функция wp_enqueue_scriptне имеет параметра приоритета, это всего лишь номер версии, который объединяется в конец пути в виде строки запроса. Этот параметр используется, чтобы гарантировать, что правильная версия отправляется клиенту независимо от кэширования [...]
Эмиль Бержерон
1

вызовите wp_deregister_script, прежде чем зарегистрировать свою собственную версию

Мохамед Або Бадави
источник
1
Зачем? Это необходимо только тогда, когда вы используете ту же ручку - то, что вам не нужно делать. Вы, вероятно, даже не должны, потому что легче отлаживать код, источник которого ясен.
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 );
Забид Ахмед
источник