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

WooCommerce刷新块购物车时,禁用默认配送选项的代码失效问题

解决WooCommerce新版块购物车刷新/返回后默认配送方式禁用失效问题

问题原因

你使用的woocommerce_shipping_chosen_method钩子仅对传统PHP渲染的购物车页面生效,但新版块购物车(Block Cart)基于WooCommerce Blocks构建,依赖REST API和前端本地存储管理状态。当页面刷新或用户返回时,前端会从本地存储或API会话中读取之前保存的配送方式状态,导致旧代码的禁用逻辑失效。

解决方案

需要同时处理PHP端的API会话和前端的状态管理,确保禁用逻辑覆盖所有场景:

1. PHP代码(处理后端会话与API)

将以下代码添加到主题的functions.php文件或自定义插件中:

// 禁用传统页面渲染时的默认配送方式
add_filter( 'woocommerce_shipping_chosen_method', '__return_false', 99 );

// 适配REST API,禁用块购物车返回的选中配送方式
add_filter( 'woocommerce_rest_cart_shipping_method_chosen', '__return_false', 99 );

// 清除购物会话中保存的选中配送方式,防止页面加载时读取旧状态
add_action( 'woocommerce_cart_loaded_from_session', function() {
    if ( WC()->session ) {
        WC()->session->set( 'chosen_shipping_methods', array() );
    }
}, 99 );

2. JavaScript代码(处理前端本地存储与块状态)

将以下代码添加到主题的自定义JS区域,或通过wp_enqueue_script仅加载到购物车和结账页面:

document.addEventListener('DOMContentLoaded', () => {
    // 页面加载时清除块购物车的本地存储状态
    if (window.localStorage) {
        localStorage.removeItem('wc-blocks-cart');
        localStorage.removeItem('wc-blocks-checkout');
    }

    // 监听购物车更新事件,重置选中的配送方式选项
    document.addEventListener('wc-blocks-cart-updated', () => {
        const shippingInputs = document.querySelectorAll('.wc-block-components-shipping-method-option input[type="radio"]');
        shippingInputs.forEach(input => input.checked = false);
        
        // 调用块购物车的内置方法更新状态
        if (window.wc?.blocks?.cart) {
            window.wc.blocks.cart.updateShippingMethod(null);
        }
    });
});

说明

  • PHP代码负责从后端层面清除配送方式的选中状态,覆盖传统页面和REST API请求;
  • JS代码处理前端本地存储的状态残留,确保页面刷新或返回后,块购物车的UI和内部状态同步重置;
  • 测试时请清空浏览器缓存,避免旧的本地存储数据干扰。

内容的提问来源于stack exchange,提问作者PAW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:58:27