如何在子主题中覆盖JavaScript文件?


35

我正在父主题中加载一些JavaScript文件。父主题中的路径为:

scripts > custom.js

在子主题中,我将创建相同的路径(scripts > custom.js)并更改custom.js文件中的某些jQuery 。

问题是未应用更改。这是在子主题中更改这些文件的错误方法吗?


1
父主题是什么?父主题如何调用脚本?
Chip Bennett

Answers:


51

子主题仅覆盖get_template_part或get_header等功能随附的php文件(例如header.php)。

将脚本添加到WordPress的正确方法是wp_enqueue_script。如果您的父主题使用此主题,则可以使用wp_dequeue_script并自己加入队列来覆盖JS文件。

像这样

<?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标记的子主题中替换该模板文件。

如果他们使用利用get_stylesheet_directory_uri的 wp_enqueue_script调用,则您无需执行任何操作。由于这没有发生,因此您只需要四处转转,​​看看主题作者做了什么。


2
如果父主题使用get_stylesheet_directory_uri来使脚本入队,则子主题将必须复制由此入队的所有脚本,因为否则将找不到它们。get_stylesheet_directory_uri中没有回退机制来检查子主题中是否存在单个文件,并在必要时回退到父主题的文件。

在食典中:“ wp_print_scripts不应用于在首页上加入样式或脚本。请改用wp_enqueue_scripts。” codex.wordpress.org/Plugin_API/Action_Reference/…–
Christian Lescuyer

请记住,这是在两年前写的。Before wp_enqueue_scripts只能用于将脚本排入前端。更新。如果您看到过时的内容,请随时进行编辑。
chrisguitarguy

4
请注意,您可能必须设置一个较晚的优先级(例如100),以确保您的出队发生父主题入队之后。 add_action( 'wp_enqueue_scripts', 'wpse26822_script_fix', 100 ); 来自codex.wordpress.org/Function_Reference/wp_dequeue_script
Spone 2014年

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也是很重要的,因为它指定将其放入页脚中,该页脚是父脚本首先被排队的位置。

另外,我不能完全解释它,但是我注意到,如果您谨慎考虑将初始脚本放入队列后将其出队,那么您似乎可以有效地防止其首先被加载。


1
该函数wp_enqueue_script没有优先级参数,只是一个版本号,它作为查询字符串连接到路径的末尾。此参数用于确保无论缓存如何都将正确的版本发送到客户端[...]
Emile Bergeron 2016年


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 );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.