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

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');

关键改动说明

  1. 钩子替换:woocommerce_checkout_process是WooCommerce官方推荐的结账前验证钩子,执行时机更早,能在订单创建前完成检查并触发前端更新。
  2. 购物车更新:调用calculate_totals()确保购物车的会话数据和总额同步更新,让前端能获取到最新的购物车状态。
  3. 通知系统:使用wc_add_notice替代抛异常,既能阻止订单提交,又能让WooCommerce的前端通知系统自动显示提示,同时触发页面的购物车刷新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:30:00