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

Диагностика задачи: зачем менять цену товара программно

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

Как реализовать автоматическую корректировку цены товара

Использование хука woocommerce_before_calculate_totals

Этот хук позволяет изменить цену товара перед подсчетом общей суммы корзины. Важно корректно изменить цену в объекте товара в корзине, чтобы WooCommerce правильно применил изменения.

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_adjustment', 20, 1);
function custom_dynamic_price_adjustment($cart) {
    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];

        // Пример условия: изменить цену для пользователя с ролью 'wholesale_customer'
        if (current_user_can('wholesale_customer')) {
            $new_price = $product->get_regular_price() * 0.8; // скидка 20%
            $product->set_price($new_price);
        }

        // Пример условия: если в корзине больше 5 единиц этого товара, цена уменьшается
        if ($cart_item['quantity'] > 5) {
            $discounted_price = $product->get_regular_price() * 0.9; // скидка 10%
            $product->set_price($discounted_price);
        }

        // Можно добавлять дополнительные условия здесь
    }
}

Обработка даты или других параметров

Для динамических условий можно использовать любой PHP-код внутри функции, например, менять цену в праздничные дни, или если сегодня определенная дата:

if (date('m-d') === '12-31') { // 31 декабря
    $product->set_price($product->get_regular_price() * 0.5); // 50% скидка
}

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

  • Добавьте в корзину товар и проверьте изменение цены в зависимости от условий (роль пользователя, количество товара, дата).
  • Проверьте, что итоговые суммы и цены на странице корзины и оформления заказа соответствуют расчетам.
  • Обязательно протестируйте работу в разных браузерах и с выключенными кэшами.
  • Проверьте, что при отключении вашего кода цены возвращаются к обычным.

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

  • Изменение цены не применяется: проверьте, что хук добавлен с правильным приоритетом, и что вы меняете цену именно у объекта $cart_item['data'].
  • Цена меняется некорректно для всех товаров: убедитесь, что условия корректно фильтруют нужные товары.
  • Изменения не видны на фронтенде: очистите кэш WooCommerce и браузера, отключите плагины кэширования для теста.
  • Конфликт с другими плагинами скидок: проверьте последовательность вызова хука и взаимодействие с другими плагинами.

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

  • Не делайте тяжелых запросов к базе или API внутри функции изменения цены — это замедлит процесс оформления заказа.
  • Используйте кэширование результатов, если условия сложные и требуют вычислений.
  • Проверяйте, что пользовательские данные (например, роль) корректно получены и не вызывают ошибок.
  • Всегда проверяйте, что изменения цены не нарушают логику WooCommerce и не вызывают ошибок при оплате.

Сравнение способов реализации изменения цены

МетодПлюсыМинусы
Использование хука woocommerce_before_calculate_totalsГибкость, полностью программируемо, подходит для любых условийТребует навыков PHP, возможны ошибки при некорректном коде
Плагины скидок и акцийУдобный интерфейс, готовые решенияМогут не поддерживать сложные условия, ограничены функционалом
Использование купонов WooCommerceПростая настройка, встроено в WooCommerceМало опций для автоматизации, требует ручного ввода пользователем
Как избежать ошибок WooCommerce при массовом изменении цен товаров
30.04.2026
Как создать собственный шорткод в WordPress
03.11.2025
Как создать динамические виджеты в WordPress с помощью REST API
16.04.2026
Как отключить системные чтения WooCommerce для повышения производительности
06.05.2026
Как создать автоматическое наступление событий после публикации в WordPress
19.01.2026