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

Диагностика задачи: почему нужно автоматически изменять цену товаров при акциях

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

Как работает изменение цены в WooCommerce: ключевые хуки и методы

Изменить цену товара на лету можно с помощью фильтра woocommerce_product_get_price и woocommerce_product_get_regular_price. Эти фильтры позволяют возвращать изменённую цену в зависимости от условий.

Пример базового фильтра, который снижает цену на 10% у всех товаров:

add_filter('woocommerce_product_get_price', 'custom_sale_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_sale_price', 10, 2);

function custom_sale_price($price, $product) {
    // Проверка, что цена есть и товар опубликован
    if (!$product->is_on_sale() && $price > 0) {
        $discount = 0.10; // 10% скидка
        $price = $price * (1 - $discount);
    }
    return $price;
}

Однако такой подход прост и не учитывает даты акции, категории или пользовательские роли. Чтобы сделать гибко — добавим дополнительные проверки.

Пошаговое решение: динамическая скидка на товары категории «Распродажа» с датами акции

1. Создайте категорию товаров для акции

В админке WooCommerce создайте категорию с названием, например, sale. Все товары, на которые будет распространяться скидка, добавьте в эту категорию.

2. Добавьте функцию с проверкой даты и категории

add_filter('woocommerce_product_get_price', 'dynamic_sale_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'dynamic_sale_price', 10, 2);

function dynamic_sale_price($price, $product) {
    if (!$price || $price == 0) return $price;

    $current_date = current_time('Y-m-d');
    $sale_start = '2024-07-01';
    $sale_end = '2024-07-10';

    // Проверяем дату акции
    if ($current_date >= $sale_start && $current_date <= $sale_end) {
        // Проверяем, есть ли товар в категории 'sale'
        if (has_term('sale', 'product_cat', $product->get_id())) {
            $discount = 0.15; // 15% скидка
            $price = $price * (1 - $discount);
        }
    }
    return $price;
}

3. Добавьте функцию в файл темы или в плагин

Рекомендуется добавлять код в файл functions.php дочерней темы или выделенный плагин, чтобы избежать потерь при обновлении.

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

  1. Перейдите на страницу товара, который относится к категории sale.
  2. Убедитесь, что текущая дата находится в промежутке акции (например, 2024-07-05).
  3. Проверьте отображаемую цену — она должна быть на 15% ниже базовой.
  4. Для товаров вне категории sale цена не должна изменяться.
  5. Для дат вне акции цена также должна оставаться без изменений.

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

  • Цены не меняются: проверьте, что хук подключён правильно и код не конфликтует с другими плагинами, также убедитесь, что функция возвращает цену всегда.
  • Цена меняется для всех товаров: убедитесь, что условие с has_term() корректно проверяет категорию, и используйте правильный слаг категории.
  • Скидка применяется вне даты акции: проверьте формат даты и время сервера — используйте current_time() WordPress для точности.
  • Цена не обновляется на странице товара: очистите кеш сайта и браузера, отключите кеширование на время теста.

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

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

Альтернативы: сравнение методов изменения цены

МетодПлюсыМинусы
Использование фильтров WooCommerce (код)Гибкий, не требует плагинов, полный контрольНужно писать код, возможны ошибки при обновлениях
Плагины скидок и акцийПростота настройки, визуальный интерфейсМогут быть тяжёлыми, ограничены функционалом, конфликтуют с другими плагинами
Создание отдельного варианта товара с фиксированной скидкойЧёткое разделение товаров, не влияет на основную ценуУвеличивает количество товаров, неудобно при большом каталоге

Резюме

Автоматическое изменение цены товара при акциях в WooCommerce — задача решаемая без сторонних плагинов через фильтры woocommerce_product_get_price и woocommerce_product_get_regular_price. Главное — реализовать корректные проверки категорий и дат, а также протестировать работу в разных сценариях.

WooCommerce: автоматическое изменение стоимости товаров при акциях через функции и хуки
19.05.2026
Как создать собственный тип записи (Custom Post Type) в WordPress: подробное руководство с примерами
29.12.2025
Как использовать WP-Cron для автоматизации задач на сайте WordPress
05.03.2026
Удаление пустых HTML-тегов в WordPress: эффективное решение без ущерба SEO
31.01.2026
Как использовать REST API в WordPress для создания, настройки и расширения
17.11.2025