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

购物车更新商品数量触发跨域权限错误,求冲突解决方案

问题

在购物车或结账页面更新商品数量时,控制台抛出以下异常:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:15:34