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

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

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

Если не использовать плагины, можно добиться этой задачи за счёт кастомного PHP-кода в functions.php или собственном плагине. Это поможет избежать избыточного функционала, ускорить сайт и сохранить контроль над логикой скидок.

Как WooCommerce рассчитывает цены и где внедрять изменения

WooCommerce использует класс WC_Product, который содержит методы get_price(), get_regular_price(), get_sale_price(). На фронтенде вывод цены берётся через фильтр woocommerce_get_price и woocommerce_product_get_price. Для изменения цен в реальном времени нужно использовать эти фильтры.

Основные хуки для изменения цены товара

  • woocommerce_product_get_price – возвращает текущую цену товара.
  • woocommerce_product_get_sale_price – цена со скидкой.
  • woocommerce_get_price – универсальный фильтр для цены.

Изменения через эти фильтры гарантируют, что цена будет корректно отображаться в каталоге, карточке товара и корзине.

Пошаговое решение: пример кода для автоматической 10% скидки на категорию товаров

Пример, как применить скидку 10% на все товары из категории с таксономией 'category' и slug 'sale':

add_filter('woocommerce_product_get_price', 'custom_dynamic_discount_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_discount_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'custom_dynamic_discount_price', 10, 2);

function custom_dynamic_discount_price($price, $product) {
    // Проверяем, входит ли товар в категорию 'sale'
    if ( has_term('sale', 'product_cat', $product->get_id()) ) {
        $discount = 0.10; // 10% скидка
        $new_price = $price * (1 - $discount);
        // Округляем до 2 знаков
        return round($new_price, 2);
    }
    return $price;
}

Этот код автоматически уменьшит цену для всех товаров в категории 'sale' на 10%. Цена будет корректно отображаться во всех местах.

Как добавить условие действия скидки по датам акции

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

function custom_dynamic_discount_price($price, $product) {
    $start_date = strtotime('2024-01-01');
    $end_date = strtotime('2024-01-10');
    $current_date = current_time('timestamp');
    if ( $current_date >= $start_date && $current_date <= $end_date ) {
        if ( has_term('sale', 'product_cat', $product->get_id()) ) {
            $discount = 0.10;
            $new_price = $price * (1 - $discount);
            return round($new_price, 2);
        }
    }
    return $price;
}

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

  • Очистите кэш сайта и браузера.
  • Перейдите на страницу товара из категории 'sale' – цена должна быть снижена на 10%.
  • Добавьте товар в корзину – в корзине и на странице оформления заказа должна отображаться обновлённая цена.
  • Проверьте, что цены товаров вне категории не изменились.
  • Для проверки даты измените системное время или даты в коде и убедитесь, что скидка активируется и деактивируется.

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

  • Цена не меняется в корзине: возможно, вы не добавили фильтр woocommerce_product_get_price или кеш WooCommerce не очищен. Добавьте все три фильтра, показанных в примере, и очистите кеш.
  • Цена меняется, но не отображается как скидка: WooCommerce выводит только regular_price и sale_price для отображения скидки. Чтобы показывать акционные цены корректно, используйте только get_price для динамического изменения, а sale_price оставьте пустым или равным regular_price.
  • Конфликты с плагинами кеширования: отключите кеширование страниц для страниц корзины и оформления заказа или настройте исключения.
  • Изменение цены влияет на другие места сайта: убедитесь, что условия в функции ограничивают действие скидки только на нужные товары и даты.

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

  • Не используйте тяжелые запросы в фильтрах изменения цены, чтобы не замедлять загрузку страниц.
  • Кешируйте результаты проверки условий скидки, если они сложные, например, даты и категории.
  • Всегда делайте бэкап functions.php перед правками.
  • Для больших магазинов с тысячами товаров рассматривайте использование transient API для кеширования вычисленных цен.
  • Проверяйте совместимость с WooCommerce и обновляйте код при переходах на новые версии.

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

ВариантПреимуществаНедостаткиКомпромисс
Код в functions.phpКонтроль, нет плагинов, легковесноТребуется навыки, ограниченная гибкостьПодходит для простых скидок и разработчиков
Плагины акций (например, WooCommerce Dynamic Pricing)Богатый функционал, GUI, гибкостьПлагины нагружают сайт, возможны конфликтыЛучше для сложных маркетинговых схем
Использование кастомных полей и cron для массовых измененийАвтоматизация, масштабируемостьСложность настройки, требует поддержкиДля больших магазинов с частыми акциями

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

⭐⭐⭐⭐⭐
Как отключить XML sitemap для ненужных типов записей в WordPress
08.09.2026
Как сделать автоматическое удаление старых мета данных в WordPress
18.09.2026
Как создать автоматический импорт постов в WordPress с примерами и плагинами
03.10.2026
Как избежать проблем с вариациями товаров WooCommerce при массовом импорте
24.09.2026
Автоматическое удаление спама в комментариях WordPress: лучшие плагины и примеры кода
18.09.2026
×
до 3225₽

Продавай темы и плагины WordPress!

Лови с каждой продажи

Начать ⋙