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

Диагностика задачи: когда и зачем нужно автоматическое изменение цен

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

Перед тем как внедрять решение, убедитесь, что:

  • Вам действительно нужны изменения цены только на фронтенде (отображение и оформление заказа), а не постоянное изменение цены в базе;
  • Условие для изменения цены чётко определено (атрибут товара, категория, роль пользователя, сумма корзины и т.п.);
  • Вы хотите избежать использования множества плагинов ради одной функции;
  • Возможна реализация через кастомный код в functions.php или отдельном плагине.

Пошаговое решение: как автоматически изменять цену товара по условию

1. Выбор хука для изменения цены

Для изменения цены в WooCommerce на лету используется фильтр woocommerce_get_price или woocommerce_product_get_price. Рекомендуется использовать последний, так как он работает с объектом продукта.

2. Пример кода: скидка 10% для товаров категории "Распродажа"

add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
    if ( is_admin() ) return $price; // не менять цену в админке

    if ( has_term('sale', 'product_cat', $product->get_id()) ) {
        $new_price = $price * 0.9; // скидка 10%
        return round($new_price, 2);
    }
    return $price;
}

3. Расширение: изменение цены при оптовой закупке (например, от 10 штук скидка 15%)

add_filter('woocommerce_before_calculate_totals', 'custom_bulk_price_adjustment', 10, 1);
function custom_bulk_price_adjustment($cart) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return;

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

        if ($quantity >= 10) {
            $original_price = $product->get_regular_price();
            $discounted_price = $original_price * 0.85; // скидка 15%
            $product->set_price($discounted_price);
        }
    }
}

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

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

  • Откройте товар из нужной категории и убедитесь, что цена на странице товара уменьшилась на 10% (используйте кэш-браузера в режиме инкогнито);
  • Добавьте в корзину 9 и 10 штук товара и проверьте, что цена в корзине и на странице оформления заказа меняется только при количестве от 10;
  • Проверьте работу в админке — цены должны оставаться без изменений;
  • Проверьте работу на мобильных устройствах и в разных браузерах;
  • Включите режим отладки WooCommerce и проверьте, нет ли ошибок.

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

  • Изменение цены в админке: если не добавить проверку is_admin(), могут возникать проблемы с отображением и сохранением цен в админке. В коде обязательно исключайте админку.
  • Цена не меняется на фронтенде: возможно, кеширование страниц или WooCommerce сохраняет цену в сессионных данных. Очистите кеш, отключите плагины кеширования, протестируйте в режиме инкогнито.
  • Конфликты с другими плагинами скидок: если есть другие плагины, которые изменяют цену, возможны конфликты. Проверьте приоритеты фильтров и порядок подключения.
  • Изменение цены не учитывается в заказах: для изменения цены в корзине нужно использовать woocommerce_before_calculate_totals, иначе скидка отобразится только визуально.

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

  • Не используйте сложные запросы к базе данных внутри фильтров цены, чтобы не замедлять загрузку страницы;
  • Сохраняйте условия изменения цены в transient, если они вычисляются редко и сложно;
  • Проверяйте, чтобы в коде не было XSS-уязвимостей, особенно если условия зависят от пользовательского ввода;
  • Добавьте логирование в debug-режиме для отслеживания работы скидок;
  • Тестируйте на staging-сайте перед внедрением на живой магазин.

Сравнение методов изменения цены в WooCommerce

МетодГде применяетсяПлюсыМинусы
Фильтр woocommerce_product_get_priceОтображение цены товараПростота, работает на фронтеНе меняет цену в корзине/заказе
Хук woocommerce_before_calculate_totalsКорзина и оформление заказаЦена меняется корректно в корзинеСложнее реализовать, влияет на производительность
Плагин скидокАдминка + фронтГотовые решения, удобный интерфейсМожет быть тяжеловесным, лишние функции
Автоматическое удаление оставшихся частей кода в WordPress после деактивации плагинов
20.11.2025
Как использовать хуки в WordPress для решения конкретных задач
09.01.2026
Как создать уникальный Meta Box в WordPress с примером кода
22.12.2025
Руководство по созданию и использованию REST API в WordPress
23.11.2025
Как исключить товары и варианты WooCommerce по атрибуту из корзины и оформления заказа
25.05.2026