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