【问题标题】:Getting the correct variation price from order items in Woocommerce 3从 Woocommerce 3 中的订单商品中获取正确的变化价格
【发布时间】:2018-11-24 03:44:24
【问题描述】:

我试图为每个项目变体获得正确的价格,但它似乎只是获得该产品变体的第一个价格。不知道如何解决这个问题。

代码:

$query = new WC_Order_Query( array(
        'status' => 'on-hold',
        'orderby' => 'date',
        'order' => 'DESC',
        'return' => 'ids',
    ) );
    $order_ids = $query->get_orders();

    foreach( $order_ids as $order_id ) {


        $order = new WC_Order($order_id);


        foreach ($order->get_items() as $item_id => $item_obj) {
            $_product = wc_get_product($item_obj['product_id']);
            $product = new WC_Product_Variable($item_obj['product_id']);
            $product_variations = $product->get_available_variations();

            $variation_product_id = $product_variations [0]['variation_id'];

            $variation_product = new WC_Product_Variation( $variation_product_id );
            $t_dy =  $variation_product->get_price();
            $item_qty = $item_obj['qty'];
            $it_total = $item_qty * $t_dy;
            $td = wc_update_order_item_meta($item_id, '_line_total', $it_total);
            $order->calculate_totals();
            $order->save();
        }

    }

【问题讨论】:

  • 您在 $product_variations 中获得了正确的变体 ID 吗?
  • 谢谢我仔细检查输出

标签: php wordpress woocommerce hook-woocommerce price


【解决方案1】:

更新 3

当订单项目是产品变体时,要获得正确的当前变体价格比您做的要简单得多。然后您将使用Woocommerce 3 CRUD setter and getter methods 设置订单项目总计,保存并更新订单。

代码:

// Loop through order items
foreach ($order->get_items() as $item_id => $item ) {

    // Targeting only product variation items
    if( $item->get_variation_id() > 0 ){ 

        // Get an instance of the WC_Product_Variation object
        $product = $item->get_product(); 

        $price   = (float) $product->get_price(); // <=== HERE the variation price

        $qty     = (int) $item->get_quantity(); // <=== HERE the quantity

        // set line totals
        $item->set_total( $price * $qty );
        $item->set_subtotal( $price * $qty );

        $item->save(); // save order item data
    }
}

// The following need to be outside the order item loop
$order->calculate_totals(); // Save is included into the method

这样应该会更好。

相关:

【讨论】:

    【解决方案2】:

    发现问题! - 它给出了错误的 ID 替换:

     $variation_product_id = $product_variations [0]['variation_id'];
    

    用这个:

    $product_variation_id = $item_obj->get_variation_id();
    $variation_product_id = $product_variation_id;
    $variation_product = new WC_Product_Variation( $variation_product_id );
    

    【讨论】:

    • 要在订单商品为变体时获取当前产品变体对象,您最好直接使用get_product() 方法,例如$product = $item_obj-&gt;get_product(); ...它将简化您的代码。
    猜你喜欢
    • 2018-10-14
    • 2017-04-04
    • 2019-01-26
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2021-01-07
    • 2021-04-02
    • 2019-05-23
    相关资源
    最近更新 更多