Функция позволяет добавить позицию в заказ, позиция может быть товаром, вариацией товара, доставкой или сбором.
Читайте отдельный урок про позиции заказа.
В случае успеха возвращает ID позиции заказа (целое число), иначе – false
.
wc_add_order_item( $order_id, $item_array )
line_item
, что может являться товаром или вариацией товара, но также может принимать значения shipping
(доставка) или fee
(сбор).Теперь давайте использовать функцию wc_add_order_item()
для добавления определённой позиции заказа, например:
wc_add_order_item( $order_id, // указываем тут ID заказа array( 'order_item_type' => 'shipping', 'order_item_name' => 'Доставочка' ) );
Этот код уже сработает и в админке, при редактировании того заказа, к которому мы добавляли позицию, у нас появится вот такая новая позиция доставки:
Вы возможно заметили, что ни в параметрах функции, ни на скриншоте выше, нет никаких намёков на цену позиции заказа.
Это потому что цена сохраняется как метаданные позиции заказа, поэтому мы и добавляем её соответствующей функцией – wc_add_order_item_meta().
Попробуем видоизменить наш код:
$order_item_id = wc_add_order_item( $order_id, // указываем тут ID заказа array( 'order_item_type' => 'shipping', 'order_item_name' => 'Доставочка' ) ); wc_add_order_item_meta( $order_item_id, 'cost', 20, true );
Тут важно понимать, что значение мета-ключа cost
– это только для типа позиции заказа доставка. Если вы добавляете цену для сбора, то ключ будет _fee_amount
, если для товара, то _line_total
стоимость и _line_subtotal
цена единицы.
Но и это ещё не всё – стоимость доставки добавится, но она не будет отображена в общей стоимости заказа, это потому, что мы должны его ещё и пересчитать методом calculate_totals()
.
Окей, а теперь код целиком!
$order_id = 5; $order = wc_get_order( $order_id ); $order_item_id = wc_add_order_item( $order_id, // указываем тут ID заказа array( 'order_item_type' => 'shipping', 'order_item_name' => 'Доставочка' ) ); wc_add_order_item_meta( $order_item_id, 'cost', 20, true ); $order->calculate_totals();
После того, как позиция заказа добавлена (или нет), у нас сработает хук
add_action( 'woocommerce_new_order_item', 'true_after_order_item_created', 25, 3 ); function true_after_order_item_created( $item_id, $item, $order_id ) { // делаем что-либо }
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.