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

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

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

Автоматизация изменения цен при акциях позволяет:

  • Избежать ошибок ручного ввода цен;
  • Ускорить процесс подготовки акций;
  • Обеспечить единообразие скидок;
  • Гибко управлять условиями скидок через код.

Как работает автоматическое изменение цен в WooCommerce через код

Основная идея — перехватывать вывод цены товара и динамически изменять её в зависимости от условий акции (например, дата, категория товара, пользовательская роль и т.п.). Для этого используется хук woocommerce_get_price_html или фильтр woocommerce_product_get_price.

Рассмотрим пример кода, который применяет 20% скидку на все товары из категории "Распродажа" в период с 1 по 10 июля 2024 года.

Пример кода для автоматической скидки

add_filter('woocommerce_product_get_price', 'auto_discount_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'auto_discount_price', 10, 2);
add_filter('woocommerce_get_price_html', 'auto_discount_price_html', 10, 2);

function auto_discount_price($price, $product) {
    // Проверяем дату акции
    $start = strtotime('2024-07-01');
    $end = strtotime('2024-07-10');
    $now = time();
    if ($now < $start || $now > $end) {
        return $price; // вне периода акции
    }

    // Проверяем, что товар в нужной категории
    if (has_term('rasprodazha', 'product_cat', $product->get_id())) {
        $discount = 0.2; // 20% скидка
        return round($price * (1 - $discount), 2);
    }

    return $price;
}

function auto_discount_price_html($price_html, $product) {
    $start = strtotime('2024-07-01');
    $end = strtotime('2024-07-10');
    $now = time();
    if ($now < $start || $now > $end) {
        return $price_html;
    }

    if (has_term('rasprodazha', 'product_cat', $product->get_id())) {
        $regular_price = wc_price($product->get_regular_price());
        $discounted_price = wc_price(auto_discount_price($product->get_regular_price(), $product));
        return '<del>' . $regular_price . '</del> <ins>' . $discounted_price . '</ins>';
    }
    return $price_html;
}

Пошаговое внедрение решения

  1. Добавьте код в файл functions.php активной темы или в собственный плагин.
  2. Убедитесь, что в вашей товарной категории есть категория с ярлыком (slug) rasprodazha и товары в ней.
  3. Настройте даты акции, изменив переменные $start и $end в формате YYYY-MM-DD.
  4. Очистите кэш сайта и браузера, если используется кэширование.
  5. Проверьте отображение цен на странице товаров из категории "Распродажа" в указанный период.

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

  • Откройте страницу товара из категории "Распродажа" в период действия акции. Цена должна отображаться с зачёркнутой старой ценой и новой — с учётом скидки.
  • Проверьте корзину — цены должны соответствовать скидочным.
  • Вне периода акции цены должны отображаться без изменений.
  • Для товаров вне категории скидка не применяется.

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

  • Не изменяется цена на странице товара или в корзине: Возможно, вы используете кэширование или плагин оптимизации, который кеширует цены. Очистите кэш и отключите оптимизации для проверки.
  • Скидка применяется ко всем товарам: Проверьте, что в коде правильно указан ярлык категории rasprodazha. Ошибка в slug приводит к неправильной фильтрации.
  • Ошибка формата цены или некорректное округление: Для правильного отображения используйте функцию wc_price() и round() с двумя знаками после запятой.
  • Скидка не видна в виджетах или списках товаров: Фильтр woocommerce_get_price_html должен быть применён, чтобы менять отображение цены везде.

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

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

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

Метод Преимущества Недостатки
Код на хуках (как в статье) Полный контроль, нет нагрузки на базу, бесплатно Требует навыков, ограниченная гибкость без доработок
Плагины для скидок (например, WooCommerce Dynamic Pricing) Готовые решения, удобный UI, много функций Платные, могут тормозить сайт, конфликтовать с другими плагинами
Ручное выставление скидок в админке WooCommerce Просто использовать, без кода Не подходит для больших каталогов и частых акций

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как удалить кэш в WordPress: практические способы и примеры
30.09.2026
Как создать автоматические решения для очистки базы данных WordPress
27.09.2026
Как отключить архивы дат в WordPress и убрать лишние страницы из индекса
21.09.2026
Как сделать автоматический rollback обновлений WordPress при ошибках
18.09.2026
Как избежать конфликтов между плагинами WordPress: практические решения и примеры кода
01.10.2026
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »