wpconsult.ru wordpress WP Consult

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

Проблема: необходимость автоматизировать комплектацию товаров в WooCommerce

В магазинах на WooCommerce часто возникает задача автоматически формировать комплекты товаров (бандлы) на основе определённых правил: например, при покупке определённого товара добавлять к заказу дополнительные позиции с фиксированной скидкой или бесплатно. Ручное создание таких комплектов неудобно и требует постоянного контроля. В стандартном WooCommerce такой функционал отсутствует.

Диагностика проблемы

Перед автоматизацией нужно понять, как именно должны формироваться комплекты:

  • Какие товары или категории входят в комплект;
  • На каких условиях комплект должен добавляться (количество, статус пользователя, сумма заказа);
  • Как учитывать скидки для комплектующих;
  • Можно ли заменить товары в комплекте на альтернативные.

Отсутствие готового решения приводит к ошибкам в заказах, путанице с учётом скидок и дополнительной нагрузке на службу поддержки.

Пошаговое решение: автоматическое добавление комплектов товаров через хук WooCommerce

Реализуем добавление комплекта при добавлении основного товара в корзину с помощью хука woocommerce_add_to_cart.

1. Определяем товары-комплекты

В коде зададим ID основного товара и товаров-комплектов:

define('MAIN_PRODUCT_ID', 123); // ID основного товара для комплекта
$bundle_products = [456, 789]; // ID товаров, которые входят в комплект

2. Добавляем товары комплекта при добавлении основного

add_action('woocommerce_add_to_cart', 'add_bundle_products_to_cart', 10, 6);
function add_bundle_products_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
    if ($product_id == MAIN_PRODUCT_ID) {
        foreach ($bundle_products as $bundle_id) {
            // Проверяем, что товар ещё не в корзине
            $found = false;
            foreach (WC()->cart->get_cart() as $cart_item) {
                if ($cart_item['product_id'] == $bundle_id) {
                    $found = true;
                    break;
                }
            }
            if (!$found) {
                WC()->cart->add_to_cart($bundle_id, 1);
            }
        }
    }
}

3. Применяем скидку на товары комплекта

Чтобы снизить цену комплекта, используем фильтр woocommerce_before_calculate_totals:

add_action('woocommerce_before_calculate_totals', 'apply_bundle_discount');
function apply_bundle_discount($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    foreach ($cart->get_cart() as $cart_item) {
        if (in_array($cart_item['product_id'], $GLOBALS['bundle_products'])) {
            $original_price = $cart_item['data']->get_regular_price();
            $discounted_price = $original_price * 0.8; // скидка 20%
            $cart_item['data']->set_price($discounted_price);
        }
    }
}

Проверка результата после внедрения

  • Добавьте в корзину товар с ID 123 — автоматически должны добавиться товары с ID 456 и 789;
  • Проверьте, что у товаров комплекта цена снижена на 20%;
  • Попробуйте удалить основной товар — комплектующие не удаляются автоматически (это можно доработать при необходимости);
  • Создайте заказ и убедитесь, что все позиции отображаются корректно.

Частые ошибки и как исправить

  • Товары комплекта добавляются дублирующимися позициями: нужно обязательно проверять наличие товара в корзине перед добавлением (как в коде выше);
  • Скидка не применяется: возможно, функция для скидки не подключена или конфликтует с другими плагинами, проверьте приоритеты хуков;
  • Комплектующие остаются после удаления основного товара: добавьте обработчик удаления с помощью хука woocommerce_remove_cart_item для синхронизации;
  • Проблемы с учётом вариаций: учитывайте вариации при добавлении товаров в корзину, если это необходимо.

Дополнительные советы по безопасности и производительности

  • Не храните ID товаров напрямую в глобальных переменных, лучше использовать классы или опции;
  • Минимизируйте количество запросов к базе, используя кэширование данных;
  • Тестируйте код на тестовом сайте, особенно если у вас сложные правила формирования комплектов;
  • Следите за совместимостью с WooCommerce и другими плагинами, обновляя их своевременно;
  • При большом количестве комплектов рассмотрите внедрение специализированных плагинов бандлов с более гибкими настройками.

Сравнение вариантов реализации автоматического комплекта

МетодПлюсыМинусыПример
Ручной код (хуки)Полный контроль, без зависимостейТребует программирования, сложен в поддержкеПример из статьи
Плагины для бандлов (например, WooCommerce Product Bundles)Готовый функционал, удобный интерфейсПлатные, могут нагружать сайтСсылка
Комбинированный подходИспользование плагина + доработка кода под задачиСложнее в поддержке, возможны конфликтыКастомизация плагина
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее