Динамическое создание заказов в WooCommerce через код

Давно уже хотел написать об этом пост, в итоге пишу только сейчас. В этом уроке вы найдёте полностью готовый код для создания заказа WooCommerce – с добавлением товаров, настройкой способов доставки и оплаты.

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

Также хочу напомнить, что у меня на сайте есть два видеокурса по WooCommerce – в первом мы создаём тему интернет-магазина с нуля на основе HTML-вёрстки, а во втором – пишет свой плагин для WooCommerce.

Тут всего лишь одна кастомная функция true_create_order(), у неё даже нет никаких параметров, она создаёт заказ с данными, которые мы указываем прямо в ней.

Важный момент, о котором считаю нужно упомянуть сразу – не запускайте функцию до инициализации WooCommerce. То есть если вы просто запустите её в functions.php, то ждите ошибок. Но вы же так не будете делать, да?

function true_create_order() {
 
	// Начинаем с того, что создаём заказ, вполне логично
	$order = wc_create_order();
 
	// Теперь давайте разберёмся с платёжным/адресом доставки покупателя
	$address = array(
		'first_name' => 'Миша',
		'last_name'  => 'Рудрастых',
		'company'    => 'Студия Миши Рудрастых',
		'email'      => 'no-reply@misha.agency',
		'phone'      => '123-123-123',
		'address_1'  => 'Большой пр. ПС',
		'address_2'  => '100',
		'city'       => 'Санкт-Петербург',
		'state'      => 'Санкт-Петербург',
		'postcode'   => '191033',
		'country'    => 'RU'
	);
 
	// Теперь можем задать этот адрес как платёжный
	$order->set_address( $address, 'billing' );
	// И как адрес доставки
	$order->set_address( $address, 'shipping' );
 
	// Неплохо бы добавить пару товаров в заказ
	$product_id = 37; // Допустим ID товара 37
	$product_qty = 1; // 1 единица товара будет норм
	$order->add_product( wc_get_product( $product_id ), $product_qty );
 
	// Установим платёжный метод, например пусть это будет оплата наличными при получении
	$payment_gateways = WC()->payment_gateways->payment_gateways();
	if( ! empty( $payment_gateways[ 'cod' ] ) ) {
		$order->set_payment_method( $payment_gateways[ 'cod' ] );
	}
 
	// Добавляем доставку
	$item = new WC_Order_Item_Shipping();
	$item->set_method_title( "Доставочка" ); // название
	$item->set_method_id( "flat_rate:14" ); // указываем ID существующего способа доставки
	$item->set_total( 5 ); // стоимость доставки (необязательно)
	$order->add_item( $item );
 
	// Пересчитываем заказ
	$order->calculate_totals();
 
	// Устанавливаем нужный нам статус
	// $order->set_status( 'completed' );
	// $order->save();
	$order->update_status( 'completed' );
 
	// Можно добавить заметку в заказ
	$order->add_order_note( 'Заказ создан динамически.' );
}

Итак!

  • Для указания и адреса доставки, и платёжного адреса мы используем один и тот же метод объекта класса WC_Order, а именно set_address(). Всё довольно интуитивно, единственный момент – указывайте страну в кодировке ISO 3166-1 Alpha-2.
  • Для добавления товаров в заказ мы воспользуемся методом add_product(), который в качестве первого параметра принимает объект товара WC_Product, а в качестве второго – его количество. Есть ещё третий параметр, который вам пригодится при добавлении вариаций.
  • С платёжными методами в целом всё легко, но вам нужно ярлык платёжного метода, например я использовал cod – это способ наличными при получении (cod – Cash on Delivery). О том, как узнать эти ярлыки, я уже рассказывал ранее.
  • Со способом доставки немного хитрее, нам нужно создать объект класса WC_Order_Item_Shipping и туда название способа доставки, его ID (читайте тут, если не знаете, как узнать) и стоимость, но стоимость можно не указывать, сделав способ доставки бесплатным.
  • После любых изменений в стоимость заказа мы персчитываем его методом calculate_totals().
  • Я специально закомментировал в коде метод set_status(). В чём вообще разница между set_status() и update_status(). При использовании set_status() изменения не будут сохранены в базу данных, поэтому там дополнительно нужно будет использовать метод save().
  • Напоследок я добавил заметку в заказ методом add_order_note(), но её кстати можно добавить также и вторым параметром метода update_status().

Вот такой получился заказ в результате:

Создание заказа WooCommerce через код

Миша

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

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

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

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

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

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