Обновление заказа программно не обновляет итоги - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь обновить количество заказанного товара, и при этом я хотел бы, чтобы заказ отражал фактическую стоимость. Я обнаружил, что стоимость продукта уменьшается в соответствии с общей стоимостью, а общая сумма заказа никогда не обновляется. Ниже приведен простой пример:

function prefix_update_woo_order() {

    $order_id       = 123; // This needs to be a real order or there will be errors
    $order_item_id  = 5; // This needs to be a real order item ID or there will be errors.

    $order       = new WC_Order( $order_id );
    $order_items = $order->get_items();
    $order_items[ $order_item_id ]->set_quantity( 2 );

    $order->calculate_taxes();
    $order->calculate_totals();
    $order->save();

}
add_action( 'admin_init', 'prefix_update_woo_order' );

Например, продукт «Шапочка с логотипом» продается по цене 18 долларов, а я покупаю 1. Я хочу программно обновить позицию заказа до количества2 вместо 1 после размещения заказа. Я ожидаю, что общая сумма составит 36,00 долларов, но я обнаружил, что стоимость продукта меняется в соответствии с общей ценой. Вместо стоимости 18 долларов США за «шапочку с логотипом» количество обновляется до 2, а стоимость снижается до 9 долларов США.

Короче говоря, я хочу обновить существующее количество элементов заказа иобновите итоги, чтобы отразить новое количество, скидку, налоги. Какие методы мне нужно использовать для достижения этой цели?

Ответы [ 4 ]

1 голос
/ 05 ноября 2019

Здравствуйте, я думаю, этот код изменит вашу проблему

add_action( 'admin_init', 'test_order_update_order' );
function test_order_update_order() {
    $order_id       = 80; // This needs to be a real order or there will be errors
    $order_item_id  = 11; // This needs to be a real order item ID or there will be errors.
    $quantity = 2;  //quantity which you want to set.
    $order       = new WC_Order( $order_id );
    $order_items = $order->get_items();
    foreach ( $order_items as $key => $value ) {
        if ( $order_item_id == $key ) {
           $product_value = $value->get_data();
           $product_id    = $product_value['product_id']; 
        }
    }
    $product = wc_get_product( $product_id );
    $price = $product->get_price();
    $price = ( int ) $quantity * $price;
    $order_items[ $order_item_id ]->set_quantity( 2 );
    $order_items[ $order_item_id ]->set_subtotal( $price );
    $order->calculate_taxes();
    $order->calculate_totals();
    $order->save();
}
0 голосов
/ 05 ноября 2019

Это то, что я придумал. Я пытался использовать wc_format_decimal(), где это применимо. Похоже, много работы по обновлению количества позиций заказа, но это то, что есть.

Нижний комментарий не нужен, но если вы используете плагин Стоимость товара , тогда этопозаботится об этом.

/**
 * Update the order item quantity and totals
 * @param Integer $order_id
 * @param Integer $order_item_id
 * @param Integer $quantity         - Quantity to set
 * 
 * @return void
 */
function prefix_update_woo_order( $order_id, $order_item_id, $quantity ) {

    // Get Order, Item, and Product Data
    $order          = new WC_Order( $order_id );
    $order_items    = $order->get_items();
    $line_item      = $order_items[ $order_item_id ];
    $variation_id   = $line_item->get_variation_id();
    $product_id     = $line_item->get_product_id();
    $product        = wc_get_product( $variation_id ? $variation_id : $product_id );
    $quantity_old   = $line_item->get_quantity();

    // Calculate Old and New Discounts
    $discount = wc_format_decimal( $line_item->get_subtotal() - $line_item->get_total(), '' );
    if( ! empty( $discount ) ) {
        $discount_per_qty = wc_format_decimal( ( $discount / $quantity_old ), '' );
        $discount = wc_format_decimal( ( $discount_per_qty * $quantity ), '' );
    }

    // Set Quantity and Order Totals
    $line_item->set_quantity( $quantity );
    $total = wc_get_price_excluding_tax( $product, array( 'qty' => $line_item->get_quantity() ) );  // Also see `wc_get_price_excluding_tax()`
    $line_item->set_subtotal( $total );             // Without Discount
    $line_item->set_total( $total - $discount );    // With Discount

    // Save Everything
    $line_item->save();
    wc_save_order_items( $order_id, $order_items );

    /**
     * If using the 'Cost of Goods' Plugin
     * - - - - - -
     * $cog         = $line_item->get_meta( '_wc_cog_item_cost', true );
     * $new_cog     = wc_format_decimal( ( $quantity * $cog ), '' );
     * $line_item->update_meta_data( '_wc_cog_item_total_cost', $new_cog );
     * wc_cog()->set_order_cost_meta( $order_id, true );
     */

}
0 голосов
/ 05 ноября 2019

Используйте следующий фрагмент кода для выполнения вышеуказанной задачи -

function prefix_update_woo_order() {

    $order_id       = 123; // This needs to be a real order or there will be errors
    $order_item_id  = 5; // This needs to be a real order item ID or there will be errors.

    $order       = wc_get_order( $order_id );
    if( $order && !wc_get_order_item_meta( $order_item_id, '_order_item_data_updated', true ) ) {
        $item_price = wc_get_order_item_meta( $order_item_id, '_line_total', true );
        $updated_item_quantity = 2;
        wc_update_order_item_meta( $order_item_id, '_qty', $updated_item_quantity );
        wc_update_order_item_meta( $order_item_id, '_line_total', $item_price * $updated_item_quantity );

        $order->calculate_totals();
        $order->save();
        // set flag
        wc_add_order_item_meta( $order_item_id, '_order_item_data_updated', true, true );
    }

}
add_action( 'admin_init', 'prefix_update_woo_order' );

Коды переходят к функциям вашей активной темы. Php

0 голосов
/ 05 ноября 2019

Я не пробовал того, чего вы пытаетесь достичь раньше. То, что я вижу в вашем коде, это то, что $order_items является массивом Предметов Предметов, созданных из WC_Order::get_items(), но я не вижу, чтобы экземпляр WC_Order был уведомлен об изменении элементов заказа. Я ожидаю, что такой метод, как $order->update_cart($order_items); Я думаю, я нашел несколько полезных ссылок для дальнейшего исследования https://hotexamples.com/examples/-/WC_Order/-/php-wc_order-class-examples.html woocommerce - программно обновить количество элементов корзины

Извините, я был не оченьпомощи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...