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

WooCommerce设置可变产品价格并添加至报价订单的问题

解决WooCommerce阶梯定价变体订单价格设置问题

嘿,我明白你现在遇到的麻烦了——购物车能正确显示阶梯价,但创建报价订单时就是没法把这个价格同步过去对吧?咱们来一步步解决这个问题。

问题根源

你现在的代码里尝试直接修改WC_Product_Variation对象的价格,但WooCommerce在添加商品到订单时,默认会优先使用产品本身的原始定价,而不是你临时修改的这个值。而且直接实例化变体对象再修改,其实并没有把价格数据正确传递到订单条目里。

正确的解决方法

其实不需要修改产品变体对象,咱们可以在调用add_product方法时,通过第三个参数直接传入自定义的阶梯价格。这个参数支持传入包含price字段的数组,订单会直接使用这个价格来计算。

修改后的代码

// 创建订单
$order = wc_create_order();

// 获取购物车商品
$items = WC()->cart->get_cart();

foreach($items as $item => $values) {
    $_product = apply_filters( 'woocommerce_cart_item_product', $values['data'], $values, $item );
    $quantity = (int)$values['quantity'];
    $variation_id = $values['variation_id'];
    $variation_attributes = $values['variation'];
    
    // 获取购物车中显示的阶梯单价,注意转换为纯数字格式
    $tiered_price_display = WC()->cart->get_product_price($_product);
    $tiered_price = floatval(wc_remove_all_formatting($tiered_price_display));
    
    // 准备订单条目参数,重点传入自定义阶梯价
    $order_item_args = array(
        'variation' => $variation_attributes,
        'price'     => $tiered_price, // 这里覆盖默认定价
    );
    
    // 变体产品额外传入变体ID
    if ($variation_id > 0) {
        $order_item_args['variation_id'] = $variation_id;
    }
    
    // 添加商品到订单,复用购物车中的产品对象+自定义价格参数
    $order->add_product($_product, $quantity, $order_item_args);
}

关键细节说明

  • 价格格式处理:WC()->cart->get_product_price()返回的是带货币符号的字符串(比如"$3.00"),必须用wc_remove_all_formatting()清除格式后转成浮点型,不然订单会识别错误价格。
  • 直接传递价格参数:add_product的第三个参数是订单条目的自定义配置,其中price字段会直接覆盖产品的默认定价,确保订单使用阶梯价。
  • 复用购物车产品对象:直接用购物车中已有的$_product对象即可,不需要重新实例化变体对象,避免数据不一致和额外资源消耗。

这样修改后,订单就能正确获取到阶梯定价的数值,并且把商品数据完整添加进去啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:16:11