WooCommerce结账时移除购物车商品需刷新才生效问题
解决WooCommerce结账时移除商品后页面不实时更新的问题
你遇到的问题是:结账页点击「下单」按钮后,代码成功移除了零售专属商品,但页面仍显示该商品,需刷新才会同步正确状态。
问题根源
你使用的woocommerce_checkout_create_order钩子触发时机过晚——这个钩子是在订单即将创建时执行的,此时页面已经完成渲染,移除购物车项后没有触发前端的购物车更新机制,导致页面保留旧的购物车内容。
解决方案
改用woocommerce_checkout_process钩子(结账验证阶段触发),同时在移除商品后更新购物车数据并触发前端通知,确保页面实时同步状态。
修改后的代码如下:
function cart_remove_retail_only_products() { if (WC()->cart->is_empty()) { return; } $removed_items = false; foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) { $_product = $values['data']; $productRetailOnly = $_product->get_meta('retail_only'); if (!$productRetailOnly) { continue; } // 移除目标商品 WC()->cart->remove_cart_item($cart_item_key); $removed_items = true; } if ($removed_items) { // 更新购物车总额,同步会话数据 WC()->cart->calculate_totals(); // 添加错误通知,阻止订单提交并告知用户 wc_add_notice( __('您使用了批发优惠券,但购物车包含零售专属商品,该商品已被移除。'), 'error' ); } } add_action('woocommerce_checkout_process', 'cart_remove_retail_only_products');
关键改动说明
- 钩子替换:
woocommerce_checkout_process是WooCommerce官方推荐的结账前验证钩子,执行时机更早,能在订单创建前完成检查并触发前端更新。 - 购物车更新:调用
calculate_totals()确保购物车的会话数据和总额同步更新,让前端能获取到最新的购物车状态。 - 通知系统:使用
wc_add_notice替代抛异常,既能阻止订单提交,又能让WooCommerce的前端通知系统自动显示提示,同时触发页面的购物车刷新。
内容的提问来源于stack exchange,提问作者Freddy Hos
相关产品推荐
相关产品推荐

