You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:48:16