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

Диагностика проблемы: как автоматически менять цены на товары при акции

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

Как понять, что автоматическое изменение цен необходимо именно в вашем кейсе

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

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

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

Пример кода, который снижает цену на 20% для товаров из категории с ID 15:

add_filter('woocommerce_product_get_price', 'custom_discount_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_discount_price', 10, 2);
function custom_discount_price($price, $product) {
    if (has_term(15, 'product_cat', $product->get_id())) {
        $discounted_price = $price * 0.8; // скидка 20%
        return $discounted_price;
    }
    return $price;
}

Этот код не меняет цену в базе, а динамически снижает цену при отображении.

Автоматическое включение и выключение акции по расписанию

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

function custom_discount_price($price, $product) {
    $start = strtotime('2024-06-01 00:00:00');
    $end = strtotime('2024-06-10 23:59:59');
    $now = current_time('timestamp');
    if ($now >= $start && $now <= $end) {
        if (has_term(15, 'product_cat', $product->get_id())) {
            return $price * 0.8;
        }
    }
    return $price;
}

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

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

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

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

  • Цена меняется в базе данных: Избегайте прямого обновления метаполей _price и _regular_price, используйте фильтры для динамического изменения.
  • Скидка не отображается: Проверьте, что хук добавлен корректно и нет конфликтов с другими плагинами, которые могут переопределять цену.
  • Цена в корзине неправильная: Убедитесь, что применяете фильтр и для цены в корзине (например, woocommerce_cart_item_price при необходимости).
  • Дата и время не совпадают с часовым поясом сайта: Используйте current_time('timestamp') для получения времени WordPress, а не time().

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

  • Не храните изменённые цены в базе — это уменьшит риск ошибок и конфликтов с WooCommerce.
  • Для больших магазинов с тысячами товаров используйте кэширование результатов фильтра, чтобы не нагружать сервер.
  • Тестируйте код на staging-сервере перед запуском на боевом сайте.
  • Если нужны более сложные акции, рассмотрите плагины типа Clearfy Pro для тонкой настройки SEO и оптимизации, или коммерческие плагины скидок.

Сравнение вариантов реализации автоматических скидок в WooCommerce

МетодОписаниеПлюсыМинусы
Фильтр woocommerce_product_get_priceДинамическое изменение цены при отображенииБезопасно, не меняет базу, гибко по условиямМожет не работать в некоторых плагинах с кешем
Обновление метаполей в базеПрямое изменение цены через update_post_metaПростая реализация, видно в админкеРиск потери данных, конфликт с другими процессами
Плагины скидок (например, WooCommerce Dynamic Pricing)Готовые решения для сложных условийМного функций, поддержкаПлатно, нагрузка на сайт
Автоматическое удаление неиспользуемых шорткодов в WordPress
01.03.2026
Как создать собственный виджет в WordPress с примером кода
15.11.2025
Удаление неиспользуемых мета данных в WordPress и оптимизация базы данных
21.12.2025
Автоматическое создание и удаление записей в WordPress по расписанию
30.03.2026
Автоматическое создание пользовательских метаполей в WordPress
15.03.2026