购物车更新商品数量触发跨域权限错误,求冲突解决方案
问题
在购物车或结账页面更新商品数量时,控制台抛出以下异常:
Uncaught DOMException: Permission denied to access property “nodeType” on cross-origin object
此时购物车会卡在加载状态,但刷新页面(F5)后能看到商品数量已正确更新。经排查,问题源于自定义插件中使用woocommerce_cart_needs_shipping钩子的代码,与WooCommerce Stripe Payment Gateway插件存在冲突。
自定义插件冲突代码如下:
function wm_woocommerce_cart_needs_shipping_hook_callback( $needs_shipping ){ WC()->session = new WC_Session_Handler(); WC()->session->init(); if(WC()->session->get( 'wm_store_method' ) && WC()->session->get( 'wm_store_method' ) == "vault") { $needs_shipping = false; return $needs_shipping; } return true; }
移除该函数内容后问题消失,但业务依赖此钩子逻辑无法删除,需解决冲突问题。
错误原因
你的代码手动实例化并初始化了WC_Session_Handler,直接覆盖了WooCommerce原生的会话对象。在AJAX更新购物车的场景中,Stripe插件依赖WooCommerce原生的会话上下文进行前端交互,会话对象被篡改后,Stripe的前端脚本尝试访问受异常会话影响的DOM对象时,浏览器会判定为跨域属性访问,抛出权限拒绝错误,最终导致购物车加载卡住。
另外,函数强制返回true会忽略WooCommerce原本的needs_shipping判断逻辑,进一步加剧了会话状态的异常。
解决方法
修改自定义钩子的代码,不要手动覆盖原生会话对象,使用WooCommerce已初始化的会话实例,同时保留原有逻辑的兼容性:
function wm_woocommerce_cart_needs_shipping_hook_callback( $needs_shipping ){ // 检查会话是否已初始化,避免手动重建覆盖原生实例 if ( isset( WC()->session ) && WC()->session->get( 'wm_store_method' ) === "vault" ) { return false; } // 保留原始参数的返回值,不强制覆盖原有逻辑 return $needs_shipping; }
关键修改点:
- 移除
WC()->session = new WC_Session_Handler();和WC()->session->init();,依赖WooCommerce自动初始化的会话对象,避免破坏Stripe插件依赖的会话上下文。 - 增加
isset( WC()->session )的安全检查,防止会话未初始化时出现报错。 - 不再强制返回
true,而是返回原始的$needs_shipping参数,保留WooCommerce原本的配送需求判断逻辑,只在自定义条件满足时返回false。
内容的提问来源于stack exchange,提问作者howtogeek24
相关产品推荐
相关产品推荐

