扩展到@gmazzap 建议在可以使用时不要使用全局变量wp_scripts()
, 有一个快捷方式wp_scripts()
用于添加条件注释调用wp_script_add_data
同样地wp_style_add_data
用于条件样式。
因此,从Wordpress 4.2开始,使用条件句的正确方法如下:
/**
* IE enqueue HTML5shiv with conditionals
* @link http://tiny.cc/html5shiv
*/
function wpse_213701_enqueue_html5shiv() {
wp_enqueue_script( \'html5shiv\',
\'https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js\',
array(),
false,
false
);
wp_script_add_data( \'html5shiv\', \'conditional\', \'lt IE 9\' );
}
add_action(\'wp_enqueue_scripts\', \'wpse_213701_enqueue_html5shiv\');
然而,上面的例子使用的是HTML5shiv,这是一种独特的情况。从那以后
has to 如果你担心一个插件,比如
Roots Soil 从头部删除所有脚本。
不过,你很可能不会遇到这种情况。这是一件非常不稳定的事情,因为需要在头部加载很多脚本。在页脚中放置脚本应通过设置$in_footer
将脚本排队时,将变量设置为true。因此,如果你确实使用了根或任何缓存插件,不要计划一切都按照你想要的方式立即运行。
下面是一个你能做的丑陋的例子:
add_action( \'wp_head\', \'wpse_213701_check_html5shiv\', 1 );
function wpse_213701_check_html5shiv() {
remove_action( \'wp_head\', \'genesis_html5_ie_fix\' );
if ( !has_filter( \'wp_head\', \'wp_enqueue_scripts\' ) && !wp_script_is( \'html5shiv\', \'done\' ) ) {
add_action(\'wp_head\', \'wpse_213701_echo_html5shiv\');
wp_dequeue_script(\'html5shiv\');
}
}
function wpse_213701_echo_html5shiv() {
echo \'<!--[if lt IE 9]><script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script><![endif]-->\' . "\\n";
}
尽管这有点过头了,但仍不能保证它会起作用。在过去的4年中,html5shiv有许多名称,这导致它被注册/排队使用几个不同的句柄(html5、html5shiv、html5shim、themename-html5shiv、html5 ie补丁和html5 polyfill,仅举几例)。此外
bundled with modernizr. 考虑到这一点,如果您认为上面的示例很荒谬,那么您最好将脚本添加到
wp_head
在您的子主题中,因为插件html5shiv句柄很可能会命名为其他名称。
更新(使用这种方法将脚本移动到页脚):
这引发了
Roots/Soil Github页面。下面可能是最好的方法(如
@grappler ) 并且仍然将脚本移动到页脚。类似的方法发布在
@kaiser\'s blog 几年前。
function grappler_move_js_to_footer()
$scripts = wp_scripts();
foreach( $scripts->registered as $script ) {
if ( \'html5\' == $script->handle ) {
wp_script_add_data( $script->handle, \'group\', 0 );
} else {
wp_script_add_data( $script->handle, \'group\', 1 );
}
}
}
add_action( \'wp_enqueue_scripts\', \'grappler_move_js_to_footer\', 99 );
至于马克·卡普兰的建议
toscho mentioned here ,
you shouldn\'t be using option 2\'s $is_IE method. 显然,如果HTTP标头发生变化:用户代理未被发送,您将向缓存后面的用户发送错误的输出,从而导致这些用户的输出中断。关于浏览器侧检测
here is a long thread of examples 关于如何做到这一点。即使客户端检测也有它的缺陷。
归根结底,最好的答案可能是不要使用这些方法中的任何一种,忘记旧浏览器,因为Microsoft has dropped support for them as of January 12.