WordPress合并JS时如何保留WooCommerce内联脚本
问题根源
原脚本合并逻辑丢失WooCommerce内联JS的原因有两个:
- 读取本地化配置变量(如
wc_add_to_cart_params)时,代码误用了未定义的$obj变量,正确的调用对象应为当前循环项的脚本注册实例,导致这部分内容根本没被读取 - WordPress体系下,除了
wp_localize_script生成的变量存在extra['data']字段外,通过wp_add_inline_script注册的内联代码,是存储在脚本实例extra属性的before、after数组中,原逻辑完全没有处理这部分内容,WooCommerce大量的初始化配置、前置判断逻辑都挂在这两个字段下,自然会丢失。
修正后可直接使用的代码
function merge_all_scripts() { global $wp_scripts; $wp_scripts->all_deps($wp_scripts->queue); $merged_file_location = get_stylesheet_directory() . DIRECTORY_SEPARATOR . 'merged-script.js'; $merged_script = ''; foreach( $wp_scripts->to_do as $handle) { $script_obj = $wp_scripts->registered[$handle]; $src = strtok($script_obj->src, '?'); $js_file_path = ''; if (strpos($src, 'http') !== false) { $site_url = site_url(); if (strpos($src, $site_url) !== false) { $js_file_path = str_replace($site_url, '', $src); } else { // 跳过非本站域名的第三方JS,避免跨域拉取失败、鉴权失效问题 continue; } $js_file_path = ltrim($js_file_path, '/'); } else { $js_file_path = ltrim($src, '/'); } if (file_exists($js_file_path)) { // 按WordPress原生输出顺序拼接内容,避免依赖报错 // 1. 拼接脚本前置内联内容 if (!empty($script_obj->extra['before']) && is_array($script_obj->extra['before'])) { $merged_script .= implode('', $script_obj->extra['before']) . ';'; } // 2. 拼接本地化配置变量 if (!empty($script_obj->extra['data'])) { $merged_script .= $script_obj->extra['data'] . ';'; } // 3. 拼接JS文件本体 $merged_script .= file_get_contents($js_file_path) . ';'; // 4. 拼接脚本后置内联内容 if (!empty($script_obj->extra['after']) && is_array($script_obj->extra['after'])) { $merged_script .= implode('', $script_obj->extra['after']) . ';'; } } } file_put_contents($merged_file_location, $merged_script); // 用文件修改时间作为版本号,方便缓存刷新 wp_enqueue_script('merged-script', get_stylesheet_directory_uri() . '/merged-script.js', array(), filemtime($merged_file_location), false ); // 注销原有拆分脚本 foreach( $wp_scripts->to_do as $handle ) { wp_deregister_script($handle); } } add_action( 'wp_enqueue_scripts', 'merge_all_scripts', 99 );
注意事项
- 不要合并非本站域名的第三方JS,比如公共CDN加载的库、第三方统计SDK、支付接口脚本等,这类资源强行拉取到本地合并容易触发跨域限制、鉴权参数失效、版本不匹配问题
- 现有逻辑每次页面访问都会重新读取所有JS、拼接写入文件,高流量站点会增加服务器负载,建议增加缓存判断:仅当合并文件不存在、或者主题/插件有更新时再重新生成合并文件
- 如果站点开了页面缓存、CDN缓存、JS压缩插件,调整代码后记得清理全部缓存,避免旧的缺失内联代码的文件被持续访问
- 合并后的脚本保持页头加载位置即可,和WooCommerce默认脚本加载位置一致,不会出现变量未定义、依赖找不到的问题
内容的提问来源于stack exchange,提问作者haveman
相关产品推荐
相关产品推荐

