Як замінити файли 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), щоб повторювати там сценарії. Таким чином, ви використовуєте функцію видалення, щоб позбутися тих функцій, які повторюють сценарії, а потім застосувати власний скрипт.

Якщо сценарій важко закодований у файл шаблону, вам просто потрібно буде замінити цей шаблон шаблону у вашій дочірній темі без тега сценарію.

Якщо вони використовували дзвінки wp_enqueue_script, які використовують get_stylesheet_directory_uri , то вам нічого не потрібно робити. Оскільки цього не відбувається, вам просто доведеться розібратися і подивитися, що зробив автор теми.


2
якщо батьківська тема використовує get_stylesheet_directory_uri для запускання скриптів, тоді дочірній темі доведеться дублювати всі так зафіксовані сценарії, бо в іншому випадку вони не будуть знайдені. У get_stylesheet_directory_uri немає механізму резервного копіювання, щоб перевірити, чи існує окремий файл у дочірній темі, і при необхідності повернутися до файлу батьківської теми.

З кодексу: "wp_print_scripts не слід використовувати для запускання стилів або сценаріїв на головній сторінці". Використовуйте натомість wp_enqueue_scripts. ” Codex.wordpress.org/Plugin_API/Action_Reference/…
Christian Lescuyer

Майте на увазі, коли це було написано: два роки тому. Раніше його 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

У деяких випадках важливо розставити пріоритети як виклику функції додавання, так і викликів функції 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 (дата), і тому ця дія додається з пріоритетом трішки більшим, щоб її негайно було скасовано. Потім, наступне твердження, що випливає, насправді надається пріоритет після цього, щоб переконатися, що воно завантажується після того, як старий був відмінений. Істинна, в цьому випадку також важлива, тому що вона вказує на те, що вона має бути зафіксована у нижньому колонтитулі, саме там було вперше задіяно батьківський сценарій.

Крім того, я не можу повністю пояснити це, але зауважую, що якщо ви обережно ставитеся до відміни початкового сценарію одразу після його заповнення, здається, ви зможете в першу чергу ефективно запобігти його завантаженню.


1
Функція wp_enqueue_scriptне має параметра пріоритету, це лише номер версії, який з'єднаний в кінець шляху як рядок запиту. Цей параметр використовується для того, щоб клієнт надсилав правильну версію незалежно від кешування [...]
Emile Bergeron

1

зателефонуйте wp_deregister_script, перш ніж зареєструвати власну версію


1
Чому? Це потрібно лише тоді, коли ви використовуєте ту саму ручку - щось не потрібно робити. Ви, мабуть, навіть не повинні, тому що простіше відлагоджувати код, джерело якого зрозуміло.
фуксія

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 );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.