Диагностика задачи: зачем нужна автоматизация скидок по атрибутам в WooCommerce
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически применять скидки к товарам, имеющим определённые атрибуты — например, скидка на все товары с атрибутом "Цвет: Красный" или "Материал: Кожа". Ручное управление скидками становится трудоёмким при большом каталоге и акциях с частой сменой условий.
Основные признаки, что нужна автоматизация:
- Большое количество товаров с разными атрибутами.
- Регулярные акции, зависящие от характеристик товара.
- Отсутствие плагина для управления динамическими скидками или его недостаточная гибкость.
Как автоматически менять скидки в WooCommerce по атрибутам: практическое решение
Использование хука woocommerce_before_calculate_totals
Для изменения цены товара в корзине можно использовать хук woocommerce_before_calculate_totals. Этот хук позволяет программно изменить цену товара в момент подсчёта итогов заказа. Мы будем проверять атрибуты товара и устанавливать нужную скидку.
Пример кода для применения скидки 15% на товары с атрибутом "pa_color" равным "red"
add_action('woocommerce_before_calculate_totals', 'apply_discount_by_attribute', 20, 1);
function apply_discount_by_attribute($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
if (did_action('woocommerce_before_calculate_totals') >= 2) return;
foreach ($cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$attributes = $product->get_attributes();
// Проверяем атрибут pa_color
if (isset($attributes['pa_color'])) {
$terms = wp_get_post_terms($product->get_id(), 'pa_color', ['fields' => 'slugs']);
if (in_array('red', $terms)) {
$original_price = floatval($product->get_regular_price());
$discounted_price = $original_price * 0.85; // скидка 15%
$product->set_price($discounted_price);
}
}
}
}Объяснение кода
- Проверяем, что код не выполняется в админке и не вызывается многократно.
- Получаем атрибуты товара и проверяем, есть ли нужный.
- Получаем термины атрибута и смотрим, содержит ли он целевой slug (в нашем случае "red").
- Если условие совпадает, меняем цену товара в корзине на 85% от регулярной.
Проверка результата после внедрения
Чтобы убедиться, что скидка применяется корректно:
- Добавьте в магазин товар с атрибутом
pa_color = red, убедитесь, что его регулярная цена указана. - Положите товар в корзину и перейдите на страницу корзины или оформления заказа.
- Проверьте, что цена товара в корзине уменьшена ровно на 15%, а на другие товары без этого атрибута цена не изменена.
- При необходимости очистите кэш и отключите плагины кеширования, чтобы изменения отобразились.
Частые ошибки и как их исправить
- Скидка не применяется или применяется ко всем товарам: Проверьте правильность slug атрибута и терминов. Используйте
var_dump($terms)для отладки. - Цена меняется в админке или на странице товара: Хук должен использоваться только в корзине, добавьте условие
if (is_admin() && !defined('DOING_AJAX')) return;. - Скидка применяется некорректно при повторном пересчёте корзины: Добавьте проверку
did_action('woocommerce_before_calculate_totals') >= 2, чтобы не менять цену несколько раз. - Кеширование мешает увидеть изменения: Очистите кеш браузера и кеш сайта, временно отключите кеширующие плагины.
Практические советы по безопасности и производительности
- Не изменяйте цену товара глобально, только в контексте корзины — не меняйте напрямую базовые цены в базе.
- Используйте кеширование результатов, если атрибутов много и запросы к базе частые.
- Тестируйте на staging-сайте перед внедрением в продакшен.
- Для более сложных условий используйте фильтры WooCommerce для цен, например
woocommerce_product_get_price, но с осторожностью.
Альтернативные решения: код vs плагины
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| Код на PHP (хук woocommerce_before_calculate_totals) | Гибкий, бесплатный, быстро настраивается | Требует навыков, возможны баги при обновлениях WooCommerce | Код из статьи |
| Плагин "WooCommerce Dynamic Pricing" или аналоги | Интерфейс для сложных правил, поддержка, обновления | Платные, нагрузка на сайт, ограниченная кастомизация | WooCommerce Dynamic Pricing |
| Использование сторонних CRM/ERP для управления ценами | Централизованное управление, интеграция с другими сервисами | Сложность настройки, стоимость | 1С, AmoCRM интеграция |