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

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

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

Диагностика задачи

Если вы хотите, чтобы при активации акции цена товара автоматически уменьшалась по заданному правилу, например, на 10%, 15% или до фиксированной цены, стоит проверить:

  • Используется ли стандартное поле «Старая цена» (sale_price) для отображения скидки?
  • Поддерживает ли тема и плагин кэширование динамические изменения цен?
  • Не конфликтуют ли другие плагины с изменением цены?

Без правильной реализации код может работать нестабильно или цены не обновляться на фронте.

Пошаговое решение: автоматическое изменение цены товара при акции

1. Используем фильтр woocommerce_get_price для динамического изменения цены

Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:

add_filter('woocommerce_get_price', 'custom_dynamic_sale_price', 10, 2);
function custom_dynamic_sale_price($price, $product) {
    // Проверяем, что товар в наличии и акция активна
    if (!$product->is_on_sale() && $product->is_in_stock()) {
        $regular_price = floatval($product->get_regular_price());
        // Например, скидка 15%
        $discount = 0.15;
        $new_price = $regular_price * (1 - $discount);
        return round($new_price, 2);
    }
    return $price;
}

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

2. Обновление цены на странице товара и в каталоге

Фильтр woocommerce_get_price применяется везде, где WooCommerce выводит цену, так что цена будет изменена и на странице товара, и в списках.

3. Использование пользовательского поля для активации акции

Если нужно включать акцию выборочно, добавьте произвольное поле для товара, например enable_dynamic_sale. Тогда в коде добавьте проверку:

if (get_post_meta($product->get_id(), 'enable_dynamic_sale', true) === 'yes') {
    // логика скидки
}

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

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

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

  • Цена не меняется на фронте: возможно, включено кеширование на уровне сервера или плагина. Очистите кеш.
  • Цена меняется и в админке: фильтр влияет только на отображение, но если используете другие хуки или изменяете цену напрямую, это может сломать данные.
  • Конфликт с плагинами скидок: убедитесь, что другие скидочные плагины не переопределяют цену после вашего фильтра. Порядок приоритетов в фильтрах влияет.
  • Неправильное округление: используйте round($new_price, 2) для корректного отображения цен.

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

  • Используйте минимальное количество тяжелых операций в фильтрах цен, так как они вызываются очень часто.
  • Если скидка зависит от внешних условий, кешируйте результаты, чтобы не нагружать сервер.
  • Не изменяйте данные продуктов напрямую в фильтрах цены, чтобы избежать ошибок в отчетах и заказах.

Сравнение подходов для изменения цены при акции

МетодПлюсыМинусы
Использование фильтра woocommerce_get_priceДинамическая цена без изменения базы, легко отключитьМожет конфликтовать с кэшем, требует опытного кода
Изменение sale_price в админке вручнуюСтандартный функционал, поддерживается WooCommerceРучная работа, неудобно при большом каталоге
Плагины скидок и акцийГотовые решения с расширенным функционаломМогут быть тяжелыми, не всегда подходят под кастомные задачи
Как установить ограничение доступа к записям WordPress по ролям пользователя
29.12.2025
Как запретить отображение изображений в WordPress для защиты от копирования
13.03.2026
Как использовать AJAX для фильтрации постов в WordPress
09.03.2026
Как установить ограничение на загрузку файлов в WordPress
02.01.2026
Как создать динамичный виджет в WordPress с применением AJAX
28.01.2026