wc_add_order_item() – добавляет позицию в заказ

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

Читайте отдельный урок про позиции заказа.

В случае успеха возвращает ID позиции заказа (целое число), иначе – false.

wc_add_order_item( $order_id, $item_array )

Параметры функции wc_add_order_item()

$order_id
(целое число) ID заказа.
$item_array
(массив) Массив параметров.
order_item_name
(строка) Название позиции заказа. То есть, даже если вы планируете добавить какой-то определённый товар, то его название не обязательно должно совпадать с оригинальным названием товара.
order_item_type
(строка) Тип позиции заказа. По умолчанию 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()

Как добавлять цены для позиций заказа?

Вы возможно заметили, что ни в параметрах функции, ни на скриншоте выше, нет никаких намёков на цену позиции заказа.

Это потому что цена сохраняется как метаданные позиции заказа, поэтому мы и добавляем её соответствующей функцией – 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();

Хук woocommerce_new_order_item

После того, как позиция заказа добавлена (или нет), у нас сработает хук

add_action( 'woocommerce_new_order_item', 'true_after_order_item_created', 25, 3 );
 
function true_after_order_item_created( $item_id, $item, $order_id ) {
	// делаем что-либо
}

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

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

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал