wpconsult.ru wordpress WP Consult

WooCommerce: автоматическое создание подзаказов по правилам

Что такое подзаказы в 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)Готовое решение, поддержка, интерфейсПлатно, ограниченная кастомизация
Комбинация кода + плагинаКомпромисс, кастомизация и удобствоСложнее в поддержке
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше