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

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

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

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

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

Для изменения цены товара динамически нужно использовать фильтры WooCommerce, которые отвечают за возврат цены продукта. Рассмотрим пример снижения цены на 20% на товары из категории sale.

add_filter('woocommerce_product_get_price', 'custom_dynamic_sale_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_sale_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', '__return_empty_string');

function custom_dynamic_sale_price($price, $product) {
    if (is_admin()) {
        return $price; // Не меняем цену в админке
    }

    // Проверяем, есть ли категория 'sale'
    if (has_term('sale', 'product_cat', $product->get_id())) {
        // Снижаем цену на 20%
        $new_price = $price * 0.8;
        return round($new_price, 2);
    }

    return $price;
}

Объяснение кода:

  • Фильтры применяются к получению цены товара.
  • В админке цена не меняется, чтобы не путать управление запасами и отчетность.
  • Проверяется принадлежность товара к категории sale.
  • Если условие выполняется — цена уменьшается на 20%, иначе возвращается оригинальная цена.

Как добавить поддержку отображения изменённой цены в корзине и оформлении заказа

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

add_filter('woocommerce_cart_item_price', 'custom_cart_item_price_display', 10, 3);

function custom_cart_item_price_display($price_html, $cart_item, $cart_item_key) {
    $product = $cart_item['data'];
    if (has_term('sale', 'product_cat', $product->get_id())) {
        $price = $product->get_price();
        $price_html = wc_price($price);
    }
    return $price_html;
}

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

  1. Перейдите на страницу товара из категории sale и убедитесь, что цена отображается с 20% скидкой.
  2. Добавьте товар в корзину и проверьте, что в корзине и при оформлении заказа цена та же, что и на странице товара.
  3. В админке в карточке товара цена не изменилась — это важно для сохранения данных.
  4. Для товаров вне категории sale цена не меняется.

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

  • Цена не меняется на фронтенде: проверьте, что фильтр добавлен в functions.php текущей активной темы или плагине, и нет конфликтов с другими плагинами, которые могут переопределять цены.
  • Цена изменяется в админке: убедитесь, что условие if (is_admin()) return $price; присутствует, чтобы не мешать работе в админке.
  • В корзине и заказе цена не совпадает с отображаемой на странице товара: добавьте фильтр для отображения цены в корзине, как показано выше.
  • Неверное округление цены: используйте round($new_price, 2) для двух знаков после запятой.

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

  • Не делайте тяжелых запросов в функции, вызываемые на каждом показе цены — кешируйте результаты при необходимости.
  • Для больших магазинов с тысячами товаров лучше использовать transient API или meta поля для хранения скидок, чтобы избежать нагрузки.
  • Всегда тестируйте изменения на тестовом сайте перед внедрением в продакшен.
  • Если нужна более гибкая логика, стоит рассмотреть использование плагинов для управления скидками, например, WooCommerce Dynamic Pricing, а кастомный код использовать для точечных задач.

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

СпособПлюсыМинусыКогда использовать
Кастомный фильтр цены в functions.phpПолный контроль, бесплатно, легкий кодТребует навыков, может конфликтовать с плагинамиНебольшие проекты, простая логика
Плагины для динамических скидокГотовые решения, поддержка, гибкая настройкаПлатные, нагрузка на сайтКрупные магазины, сложные условия
Использование купонов WooCommerceПростой способ, встроенный функционалНе автоматизируется изменение цены на уровне продуктаРазовые акции, промо-коды

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

⭐⭐⭐⭐⭐
Как оптимизировать процесс редактирования блоков Gutenberg в WordPress
16.04.2026
Как создать динамический виджет в WordPress с применением кода
04.12.2025
WooCommerce: как избежать дублирования товаров при импорте из osCommerce
20.05.2026
Как использовать WPRemark для автоматического ответа на комментарии в WordPress
05.02.2026
Как убрать Redirect Loop в WordPress: практическое руководство
19.04.2026
×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙