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

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

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

Основная задача — реализовать автоматическое изменение стоимости товаров по кастомным правилам, при этом сохранив корректное отображение цены для пользователя и правильное поведение корзины и заказов.

Обзор проблем при автоматическом изменении цены в WooCommerce

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

Как реализовать автоматическую скидку по кастомным правилам через хуки WooCommerce

Самый правильный способ — использовать хук woocommerce_get_price или woocommerce_product_get_price для изменения цены товара при выводе, а для корзины — woocommerce_before_calculate_totals.

Пример: скидка 20% на все товары категории «Распродажа»

add_action('woocommerce_before_calculate_totals', 'custom_discount_on_sale_category', 10, 1);
function custom_discount_on_sale_category($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    if (did_action('woocommerce_before_calculate_totals') >= 2) return;

    foreach ($cart->get_cart() as $cart_item) {
        $product = $cart_item['data'];
        if (has_term('sale', 'product_cat', $product->get_id())) {
            $regular_price = $product->get_regular_price();
            $discounted_price = $regular_price * 0.8; // 20% скидка
            $product->set_price($discounted_price);
        }
    }
}

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

add_filter('woocommerce_product_get_price', 'custom_price_on_product_page', 10, 2);
function custom_price_on_product_page($price, $product) {
    if (has_term('sale', 'product_cat', $product->get_id())) {
        $regular_price = $product->get_regular_price();
        return $regular_price * 0.8; // 20% скидка
    }
    return $price;
}

Пошаговое решение для кастомных правил изменения цены

  1. Определите правило: например, 10% скидка на категорию «Акции» с 1 по 10 число месяца.
  2. Добавьте проверку даты и категории в функции изменения цены.
  3. Используйте хуки woocommerce_before_calculate_totals для корзины и woocommerce_product_get_price для страницы товара.
  4. Проверьте, что цена меняется на всех этапах: страница товара, корзина, оформление заказа, email уведомления.
  5. Если используется кеширование, добавьте исключения для страниц корзины и оформления заказа.

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

  • Откройте страницу товара из категории акции – должна показываться сниженная цена.
  • Добавьте товар в корзину – в корзине цена должна быть со скидкой.
  • Перейдите к оформлению заказа – скидка сохраняется.
  • Оформите заказ и проверьте в админке, что цена заказа соответствует скидке.
  • Проверьте email уведомления, чтобы цена была корректной.

Частые ошибки при автоматическом изменении цен и как их исправить

  • Цена меняется только на странице товара, но не в корзине. Решение: обязательно использовать woocommerce_before_calculate_totals для изменения цены в корзине.
  • Цена в заказах не совпадает с отображаемой. Нужно сохранять оригинальную цену и скидку отдельно, не перезаписывать цену товара в базе.
  • Проблемы с кешированием страниц. Исключайте страницы корзины и оформления заказа из кеша, либо используйте AJAX обновление корзины.
  • Фильтры не вызываются для вариативных товаров. Обрабатывайте цены вариаций отдельно с помощью woocommerce_variation_get_price.

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

  • Не записывайте изменённые цены в базу, используйте только хуки для динамического изменения.
  • Оптимизируйте проверки, например, кэшируйте результат has_term, чтобы не нагружать БД.
  • Добавьте проверку is_admin() и DOING_AJAX, чтобы исключить ненужное выполнение в админке.
  • Используйте точные условия даты и времени для временных акций, чтобы избежать ошибок.

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

СпособПлюсыМинусы
Прямое изменение цены в базеПростота реализацииПотеря истории, проблемы с отчетами, баги в заказах
Использование хуков (рекомендуется)Динамичность, безопасность, совместимостьТребует точного кода, может конфликтовать с кешем
Плагины скидокУдобство, поддержка, гибкостьНагрузка на сайт, стоимость, ограниченная кастомизация
Оптимизация загрузки изображений в WordPress для повышения скорости сайта
11.12.2025
Как использовать метод AJAX в WooCommerce для обновления корзины без перезагрузки
05.05.2026
Добавление кастомных полей в WooCommerce без плагинов
19.01.2026
WooCommerce: не работают кнопки «Купить» после обновления — как исправить
28.05.2026
Автоматическое удаление старого контента в WordPress
13.04.2026