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

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

В стандартном WooCommerce для установки скидок на товары используются «акционная цена» (sale price), которую нужно задавать вручную. При большом ассортименте и частых акциях это неудобно и требует много времени. Кроме того, иногда нужно реализовать гибкие правила скидок, например, зависимость от даты, категории или пользовательской роли. В этой статье рассмотрим, как автоматизировать изменение цен товаров по акциям с помощью собственного кода.

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

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

  • Автоматическое применение скидки на основе даты или события (например, распродажа с 1 по 7 число месяца).
  • Скидки по категориям товаров или по меткам.
  • Учет пользовательских ролей (например, скидка для оптовых покупателей).
  • Изменение цены без необходимости вручную задавать «акционную цену» в админке.

Если вы используете плагины для акций и скидок, но хотите иметь легкий и контролируемый кодом способ, следующий раздел для вас.

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

Используем хук woocommerce_product_get_price и woocommerce_product_get_sale_price, чтобы подменять цену на лету перед выводом на фронтенде и в корзине.

Вот пример кода, который уменьшает цену на 20% для товаров из категории sale-category в период с 1 по 7 число каждого месяца:

add_filter('woocommerce_product_get_price', 'auto_discount_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'auto_discount_price', 10, 2);

function auto_discount_price($price, $product) {
    if (is_admin()) {
        return $price; // не менять цену в админке
    }
    // Проверяем дату
    $day = date('j'); // число месяца без ведущих нулей
    if ($day < 1 || $day > 7) {
        return $price; // скидка только с 1 по 7
    }
    // Проверяем категорию
    if (has_term('sale-category', 'product_cat', $product->get_id())) {
        $discounted_price = $price * 0.8; // скидка 20%
        return round($discounted_price, 2);
    }
    return $price;
}

Этот код автоматически применит скидку 20% на все товары в категории sale-category только в первые 7 дней месяца.

Как добавить поддержку пользовательских ролей

Если нужно давать скидку только определённым ролям, добавьте проверку:

function auto_discount_price($price, $product) {
    if (is_admin()) {
        return $price;
    }
    $day = date('j');
    if ($day < 1 || $day > 7) {
        return $price;
    }
    if (!current_user_can('wholesale_customer')) { // пример роли
        return $price; // скидка только для wholesale_customer
    }
    if (has_term('sale-category', 'product_cat', $product->get_id())) {
        return round($price * 0.8, 2);
    }
    return $price;
}

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

Чтобы убедиться, что код работает, сделайте следующее:

  • Перейдите на страницу товара из категории sale-category в период с 1 по 7 число.
  • Проверьте цену товара — она должна быть уменьшена на 20%.
  • Добавьте товар в корзину и проверьте итоговую сумму — скидка должна применяться.
  • Зайдите под пользователем без нужной роли (если используете роль) — цена должна отображаться без скидки.
  • Проверьте в админке, что цены товара не изменились, код не влияет на базовые цены.

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

  • Скидка не отображается на странице товара или в корзине
    Убедитесь, что код добавлен в файл functions.php или в плагин без ошибок. Проверьте, не кешируются ли страницы (очистите кеш плагина и браузера).
  • Цена меняется в админке
    Добавьте проверку is_admin() в начале функции, чтобы исключить админку из изменений.
  • Скидка применяется всегда, а не в заданный период
    Проверьте правильность сравнения дат. В примере используется число месяца, можно заменить на более точную проверку через DateTime.
  • Проблемы с пользовательскими ролями
    Проверьте, что роль действительно существует и пользователь имеет эту роль. Для дебага используйте var_dump(wp_get_current_user()->roles);.

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

  • Храните код в дочерней теме или в собственном плагине, чтобы избежать потери при обновлении.
  • Используйте кэширование с осторожностью — динамическое изменение цены может конфликтовать с кэшом. Настройте исключения для страниц с товарами.
  • Проверяйте производительность сайта после внедрения кода, особенно если база товаров большая и есть сложные условия скидок.
  • Для сложных правил лучше использовать готовые плагины, например, WooCommerce Dynamic Pricing & Discounts, если код становится громоздким.

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

МетодПреимуществаНедостатки
Ручное указание акционной цены в админкеПростота, поддержка из коробкиТрудозатратно при большом каталоге, нет автоматизации
Код на хуках (как в статье)Гибкость, автоматизация, без плагиновТребует навыков программирования, возможны ошибки
Плагины динамических скидокМного функций, простота настройкиНагрузка на сайт, стоимость, часто избыточно
WooCommerce: автоматическое изменение цены товара по акции с помощью кода
19.06.2026
Запрет доступа к страницам WooCommerce для неавторизованных пользователей
16.03.2026
Как автоматически отключить плагины на отдельных страницах WordPress для оптимизации
26.04.2026
Автоматическое удаление неактивных вариаций товаров в WooCommerce через код
13.05.2026
WooCommerce не отображает товары после обновления: как исправить
13.06.2026