Давно уже хотел написать об этом пост, в итоге пишу только сейчас. В этом уроке вы найдёте полностью готовый код для создания заказа 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()
.Вот такой получился заказ в результате:
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.