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

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

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

Чтобы понять, почему цены не меняются автоматически, проверьте:

  • Правильно ли настроены даты акции (акционные цены и даты начала/окончания акции в карточке товара).
  • Используется ли кэширование, которое может блокировать обновление цен.
  • Есть ли кастомные фильтры или функции, которые перезаписывают цены.

Пошаговое решение: создание автоматического изменения цен через хук WooCommerce

Реализуем логику автоматического изменения цены при акции программно — без плагинов. Для примера сделаем скидку 20% на все товары из определённой категории «sale» в заданный период.

1. Добавление фильтра для изменения цены товара

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

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

function custom_sale_price_dynamic($price, $product) {
    // Проверяем наличие категории 'sale'
    if (has_term('sale', 'product_cat', $product->get_id())) {
        $current_date = current_time('Y-m-d');
        $start_date = '2024-07-01'; // дата начала акции
        $end_date = '2024-07-15';   // дата окончания акции
        
        if ($current_date >= $start_date && $current_date <= $end_date) {
            // Применяем скидку 20%
            $discounted_price = $price * 0.8;
            return round($discounted_price, 2);
        }
    }
    return $price;
}

2. Поддержка отображения скидок и цен в корзине

Чтобы корректно отображалась скидка в корзине и на страницах оформления заказа, добавим фильтр для цены в заказах:

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_sale_price_cart', 10, 1);
function custom_dynamic_sale_price_cart($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    $current_date = current_time('Y-m-d');
    $start_date = '2024-07-01';
    $end_date = '2024-07-15';

    if ($current_date < $start_date || $current_date > $end_date) return;

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        if (has_term('sale', 'product_cat', $product->get_id())) {
            $original_price = $product->get_price();
            $new_price = $original_price * 0.8;
            $product->set_price(round($new_price, 2));
        }
    }
}

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

Чтобы проверить, что скидка применяется корректно:

  • Добавьте в категорию «sale» несколько товаров.
  • Убедитесь, что дата сервера находится в периоде акции (либо временно измените даты в коде на текущие).
  • Откройте карточку товара — цена должна отображаться со скидкой 20%.
  • Добавьте товар в корзину — цена там также должна быть снижена.
  • Оформите заказ и проверьте итоговую сумму.

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

  • Скидка не отображается на страницах: возможно, кэширование сайта или браузера мешает обновлению. Очистите кэш.
  • Цена не меняется в корзине: не добавлен фильтр woocommerce_before_calculate_totals или код добавлен некорректно.
  • Неверное определение категории: проверьте, что slug категории действительно «sale» и товары к ней привязаны.
  • Скидка применяется всегда: проверьте формат дат и сравнения в коде, используйте current_time('Y-m-d') для корректного сравнения.

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

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

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

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

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

⭐⭐⭐⭐⭐
Как автоматизировать удаление старых черновиков в WordPress без плагинов
18.09.2026
Как создать автоматический импорт постов в WordPress с примерами и плагинами
03.10.2026
Как закрыть страницы с параметрами от индексации в WordPress
29.08.2026
Как использовать выпадающие списки в WordPress своими руками: примеры и код
26.09.2026
Создать и использовать шорткод для вывода продуктов WPShop в WordPress
20.09.2026
×
-15%
на премиум-тему
Bono

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

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