WordPress WooCommerce前端wp-util先于underscore加载致加购错误如何解决
修复方案
你之前的代码无效是因为优先级设置为0太早,后续主题、插件的脚本注册逻辑会覆盖你的配置,未登录状态下没有管理员栏脚本提前加载underscore,才会出现依赖缺失错误,管理员登录正常就是因为管理员栏相关脚本强制加载了underscore。
直接将以下代码加入子主题functions.php即可:
// 修正wp-util依赖,强制先加载underscore add_action( 'wp_enqueue_scripts', function() { // 等待所有脚本注册完成后修改wp-util的依赖配置 if ( wp_script_is( 'wp-util', 'registered' ) ) { $wp_util_script = wp_scripts()->query( 'wp-util' ); // 避免重复添加依赖 if ( ! in_array( 'underscore', $wp_util_script->deps, true ) ) { $wp_util_script->deps[] = 'underscore'; } } // 强制入队underscore,防止被意外出队 wp_enqueue_script( 'underscore' ); }, 9999 ); // 高优先级保证最后执行,不被其他逻辑覆盖
这个方案会直接修改wp-util的内置依赖配置,WordPress会自动保证依赖的脚本先加载,不需要手动调整顺序。
脚本入队顺序调试方法
- 前端快速验证:未登录状态下打开产品页,右键查看网页源代码,分别搜索
underscore.min.js和wp-util.min.js,看两个脚本的出现顺序,underscore出现位置更早即为正常。 - 后端打印队列验证:临时添加以下代码到子主题functions.php,未登录状态下访问页面即可看到脚本加载顺序,调试完成后记得删除:
add_action( 'wp_enqueue_scripts', function() { // 仅管理员可见调试信息 if ( current_user_can( 'manage_options' ) ) { $script_list = wp_scripts()->done; $underscore_pos = array_search( 'underscore', $script_list ); echo '<pre>调试:underscore前后加载的脚本列表'; // 打印underscore前后各5个脚本,确认wp-util位置 print_r( array_slice( $script_list, $underscore_pos > 5 ? $underscore_pos -5 : 0, 10 ) ); echo '</pre>'; } }, 99999 );
兜底兼容方案
如果上面的方法仍然无效,说明存在代码强制提前输出wp-util脚本,可直接在页面头部最前打印underscore脚本:
add_action( 'wp_head', function() { if ( ! is_user_logged_in() ) { wp_print_scripts( 'underscore' ); } }, 1 );
内容的提问来源于stack exchange,提问作者Nick Li
相关产品推荐
相关产品推荐

