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
相关产品推荐
相关产品推荐

