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

Диагностика задачи: зачем нужна автоматизация скидок по атрибутам в 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 интеграция
Как создать автоматический генератор шорткодов в WordPress с поддержкой параметров
19.03.2026
Как жестко отключить XML-RPC в WordPress для повышения безопасности
29.12.2025
WooCommerce: автоматическое изменение стоимости оплаты по способу оплаты
07.06.2026
Как создать автоматический генератор метаданных для постов в WordPress
20.01.2026
Интеграция GPT в WordPress для автоматизации создания контента
15.12.2025