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

scripts > custom.js


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

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

评论

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

#1 楼

子主题仅覆盖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摆脱掉那些将脚本回显的功能,然后排队自己的脚本。

如果脚本被硬编码到模板文件中,则只需替换您的子主题中没有脚本标签的模板文件。

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

评论


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

–user18579
2012年7月26日13:20

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

–克里斯蒂安·莱斯库(Christian Lescuyer)
13年8月13日在14:53

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

–chrisguitarguy
13年8月13日在15:02

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

–斯派恩
2014-09-4 5:18



2016年更新:根据stackoverflow.com/questions/23507179/…我们还必须使用wp_deregister_script('parent-script-handle');完全删除父脚本。的确,没有它,它对我不起作用。 WP 4.6.1

– PhiLho
16-11-30在9:58



#2 楼

在某些情况下,必须对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_enqueue_script没有优先级参数,它只是一个版本号,该版本号作为查询字符串连接到路径的末尾。此参数用于确保无论缓存如何,都将正确的版本发送到客户端[...]

– Emile Bergeron
16年1月18日在14:51

#3 楼

在注册您自己的版本之前,请致电wp_deregister_script

评论


为什么?仅在使用相同的手柄时才需要此操作-无需执行任何操作。您甚至可能不应该这样做,因为调试源清晰的代码更容易。

– fuxia♦
16 Dec 25 '18:14

#4 楼

// 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 );