WooCommerce: как исключить товар из распродажи без плагинов

Проблема: невозможность исключить товар из распродажи стандартными средствами WooCommerce

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

Диагностика проблемы

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

Основные симптомы:

  • Скидка отображается на всех товарах, включая те, которые должны быть исключены;
  • Нет опции в админке для исключения отдельных товаров из распродажи;
  • Плагины для расширения управления скидками могут быть нежелательны из-за нагрузки или стоимости.

Пошаговое решение: исключение товара из распродажи через фильтр

Используем фильтр WooCommerce woocommerce_product_get_sale_price, который управляет стоимостью распродажи товара. Перехватив вызов, мы можем отменить скидку для нужных товаров.

1. Определите ID или артикул товара, который нужно исключить. Например, $excluded_product_ids = array(123, 456);

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

add_filter('woocommerce_product_get_sale_price', 'exclude_product_from_sale_price', 10, 2);
function exclude_product_from_sale_price($sale_price, $product) {
    $excluded_product_ids = array(123, 456); // Замените на ID ваших товаров
    if (in_array($product->get_id(), $excluded_product_ids)) {
        return '';// Отменяем цену распродажи
    }
    return $sale_price;
}

add_filter('woocommerce_product_get_price', 'sync_price_with_sale_exclusion', 10, 2);
function sync_price_with_sale_exclusion($price, $product) {
    $excluded_product_ids = array(123, 456);
    if (in_array($product->get_id(), $excluded_product_ids)) {
        // Если цена распродажи отменена, возвращаем обычную цену
        return $product->get_regular_price();
    }
    return $price;
}

3. Очистите кеш WooCommerce и браузера.

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

Чтобы убедиться, что решение сработало:

  • Перейдите на страницу товара, который должен быть исключен из распродажи. Цена должна быть без скидки, даже если у него задана sale_price.
  • На странице других товаров, участвующих в распродаже, скидка должна отображаться корректно.
  • Проверьте корзину и оформление заказа — цены должны соответствовать отображаемым на витрине.

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

  • Кэширование цен: Если используется кеширование (например, через плагин кеша или встроенные механизмы WooCommerce), старые цены могут показываться. Очистите кеш сайта и браузера.
  • Неправильные ID товаров: Убедитесь, что в массиве $excluded_product_ids указаны именно ID товаров, а не артикулы или другие значения.
  • Конфликт с другими фильтрами: Если другие плагины или темы изменяют цены через фильтры, может возникнуть конфликт. Проверьте при деактивации сторонних расширений.
  • Не применяется в AJAX или корзине: Иногда цены в корзине и мини-корзине кэшируются отдельно. Проверьте работу на всех этапах оформления заказа.

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

  • Не используйте тяжелые плагины для простой задачи исключения товаров из распродажи, это снизит нагрузку.
  • Добавляйте исключения в код через ID, а не по категории, если нужно точечно управлять товарами.
  • Проводите тест на staging-сервере перед внедрением на рабочем сайте.
  • Регулярно обновляйте WooCommerce и тему, чтобы избежать несовместимостей с фильтрами.

Таблица сравнения способов исключения товара из распродажи

МетодПлюсыМинусыПример
Код на фильтре woocommerce_product_get_sale_priceЛегко контролировать, без сторонних плагинов, быстро работаетТребует знаний PHP, не подходит для массового управленияПример кода из статьи
Плагины скидок и акцийИнтуитивный интерфейс, много функцийНагрузка, стоимость, избыточность для простых задачAdvanced Coupons, WooCommerce Dynamic Pricing
Использование категорий для исключенияЛегко управлять через админку, масштабируемоМенее гибко, влияет на все товары категорииУдаление категории из акции
Как сделать защищённый контент в WordPress: практические методы и примеры
06.03.2026
WooCommerce: автоматическая удалённая отгрузка и синхронизация остатков товаров
16.05.2026
Как создать функционал обратной связи с оценкой в WordPress
20.01.2026
WooCommerce: автоматическое удаление зависших вариаций товаров
04.06.2026
Как автоматизировать управление ролями и правами в WordPress с примерами кода
23.03.2026