Установите переменную цену продукта перед программным добавлением в заказ WooCommerce

В корзину я добавил кнопку для создания котировок. Я использую плагин ценообразования с диапазоном количества, поэтому все мои изменяемые продукты имеют широкий диапазон цен.

Например. Стоимость товара А составляет 5 долларов, если количество меньше 100. Стоимость товара составляет 3 доллара при количестве от 100 до 199.

В моей корзине отображается правильная стоимость товара, и мне удается получить цену каждого товара в корзине. Однако я не могу установить цену вариации и добавить данные в порядок.

Кто-нибудь знает, как я могу это решить?

        // Now we create the order
            $order = wc_create_order();

        // add products from cart to order
        $items = WC()->cart->get_cart();
        foreach($items as $item => $values) {

            $_product   = apply_filters( 'woocommerce_cart_item_product', $values['data'], $values, $item );

            $tieredPrice = WC()->cart->get_product_price($_product);

            $product_id = $values['product_id'];

            $product = wc_get_product($product_id);
            $quantity = (int)$values['quantity'];

            $var_id = $values['variation_id'];

            $variationsArray = array($values['variation']);
            $var_product = new WC_Product_Variation($var_id);
            $var_product->set_variation_price($tieredPrice); //how do I set variation price?

            $order->add_product($var_product, $quantity, $variationsArray);
        }

Заранее спасибо.


person Jacinta Phua    schedule 15.01.2018    source источник


Ответы (1)


В корзине $values['data'] уже есть экземпляр объекта WC_Product, поэтому для варианта продукта это непосредственно экземпляр объекта WC_Product_Variation, так что теперь это будет просто.

Метод set_variation_price() не существует для объектов WC_Product, это set_price()

Итак, ваш обновленный код будет:

// Now we create the order
$order = wc_create_order();

// Add products from cart to order
$cart = WC()->cart; // cart object
foreach( $cart->get_cart() as $cart_item_key => $cart_item) {
    $product   = $cart_item['data']; // An instance of the WC_Product object
    $qty = intval($cart_item['quantity']); // The quantity
    $tierced_price = $cart->get_product_price($_product); // your "tierced" price
    $product->set_price( $tierced_price ); // <==  <==  <==  <==  <==  <==  SET THE PRICE
    $args = array( $cart_item['variation'] ); // empty if not a variation

    $order->add_product( $product, $qty, $args );
}

Это должно работать

person LoicTheAztec    schedule 15.01.2018
comment
При сохранении цитаты возникает небольшая проблема. Цена товара неверна. Допустим, цена продукта A $ tiered_price составляет 5 долларов США (это правильная цена продукта). Устанавливаемая цена продукта составляет 365 долларов США. Пытался сохранить другой товар. Перед многоуровневой ценой снова стоит цифра «36». Сохраняемая цена продукта всегда составляет 36 долларов США (например, 3617 долларов США при многоуровневой цене 17 долларов США). - person Jacinta Phua; 16.01.2018
comment
@JacintaPhua Поскольку $tierced_price = $cart->get_product_price($_product); на самом деле не работает, вы должны сохранить настраиваемую цену в объекте корзины как настраиваемое поле, когда продукт добавляется в корзину. Тогда его можно было бы легко вызвать в вашем коде без ошибок. Теперь этот ответ верен в отношении деталей вашего вопроса и кода. Вы не указываете код, который используете для установки этого $tiercedPrice - person LoicTheAztec; 16.01.2018
comment
@JacintaPhua Так что насчет этого ... вы не ответили на мой комментарий. - person LoicTheAztec; 31.01.2018
comment
Да, решение работает лучше! Большое спасибо за помощь! - person Jacinta Phua; 01.02.2018