Что такое подзаказы в WooCommerce и зачем они нужны
Подзаказы — это самостоятельные заказы, автоматически создаваемые на основе основного заказа по заданным правилам. Они полезны, если нужно разделить один заказ на несколько частей для разных складов, поставщиков или способов доставки. Такой подход уменьшает ручной труд и снижает вероятность ошибок при обработке заказов.
Диагностика задачи: когда нужен автоматический подзаказ
Если у вас в WooCommerce возникает необходимость разделять заказы по определённым критериям (категории товаров, поставщики, география доставки и т.п.), и вы делаете это вручную, то автоматизация решения с помощью подзаказов поможет:
- ускорить обработку;
- исключить ошибки;
- автоматизировать уведомления и статусы;
- обеспечить прозрачность для клиентов и менеджеров.
Пошаговое решение: как создать автоматическое создание подзаказов в WooCommerce
1. Создание пользовательской функции для разделения заказа
Добавим в functions.php темы или в свой плагин следующий код. Он разделит заказ на подзаказы по категориям товаров.
add_action('woocommerce_thankyou', 'create_suborders_based_on_category', 20, 1);
function create_suborders_based_on_category($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Получаем товары и группируем по категориям
$items = $order->get_items();
$categories_map = [];
foreach ($items as $item_id => $item) {
$product_id = $item->get_product_id();
$terms = get_the_terms($product_id, 'product_cat');
if (!$terms || is_wp_error($terms)) continue;
foreach ($terms as $term) {
$cat_id = $term->term_id;
if (!isset($categories_map[$cat_id])) {
$categories_map[$cat_id] = [];
}
$categories_map[$cat_id][$item_id] = $item;
}
}
// Если товаров из разных категорий, создаём подзаказы
if (count($categories_map) <= 1) return; // нет смысла разделять
foreach ($categories_map as $cat_id => $cat_items) {
$suborder = wc_create_order();
foreach ($cat_items as $item_id => $item) {
$product = $item->get_product();
$quantity = $item->get_quantity();
$suborder->add_product($product, $quantity);
}
// Копируем данные покупателя
$suborder->set_address($order->get_address('billing'), 'billing');
$suborder->set_address($order->get_address('shipping'), 'shipping');
$suborder->calculate_totals();
$suborder->update_status('pending', 'Автоматически создан подзаказ');
// Связываем подзаказ с основным
update_post_meta($suborder->get_id(), '_parent_order', $order_id);
}
// Можно добавить уведомление менеджеру или клиенту о подзаказах
}2. Настройка правил разделения
В примере выше разделение идёт по категориям товаров. Можно адаптировать код под другие правила, например:
- По поставщикам (используя пользовательские атрибуты или мета-продукта);
- По складам (если есть кастомные поля для складов);
- По зонам доставки;
- По типам товаров (например, цифровые и физические).
Для этого замените логику группировки товаров в переменной $categories_map на нужную вам.
Проверка результата после внедрения
Чтобы проверить, что подзаказы создаются правильно:
- Создайте тестовый заказ с товарами из разных категорий;
- Перейдите в админку WooCommerce > Заказы;
- Убедитесь, что после оформления основного заказа появились новые заказы со статусом
pending; - Проверьте, что товары в подзаказах соответствуют категориям;
- Проверьте наличие мета-поля
_parent_orderв подзаказах с ID основного заказа; - Проверьте корректность адресов и расчётов.
Частые ошибки и как их исправить
- Подзаказы создаются с пустым списком товаров
Проверьте, что товары действительно имеют категории и что функцияget_the_terms()возвращает корректные данные. - Подзаказы не создаются
Убедитесь, что хукwoocommerce_thankyouсрабатывает. Можно добавитьerror_log()для отладки.
Проверьте, что $order_id валиден. - Дублирование подзаказов при повторном вызове
Добавьте проверку, создавались ли подзаказы ранее, например, по мета-полю_parent_orderв дочерних заказах. - Ошибки с правами и ролями
Функция должна выполняться с правами администратора, если требуется создавать заказы в админке.
Практические советы по безопасности и производительности
- Оптимизируйте создание подзаказов: если заказ большой, используйте транзакции и кеширование, чтобы избежать нагрузки.
- Защита от повторного создания подзаказов: храните флаг в мета-данных основного заказа, например,
_suborders_created = true. - Проверяйте права доступа, особенно если используете AJAX или REST API для создания подзаказов.
- Логируйте ошибки и состояние для удобства отладки.
- Интеграция с уведомлениями: можно использовать хуки WooCommerce для отправки email менеджерам при создании подзаказа.
Сравнение вариантов реализации автоматического создания подзаказов
| Вариант | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Полный контроль, бесплатно, гибкость | Требует навыков, поддержка на вас |
| Плагин сторонний (например, Split Order) | Готовое решение, поддержка, интерфейс | Платно, ограниченная кастомизация |
| Комбинация кода + плагина | Компромисс, кастомизация и удобство | Сложнее в поддержке |