Как автоматически изменять стоимость товаров WooCommerce по условиям

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

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

Выбор подхода для динамического изменения цен

Существует три основных метода изменения цены в WooCommerce:

  • Фильтр woocommerce_product_get_price — изменяет цену товара при получении. Позволяет подменять цену на лету.
  • Фильтр woocommerce_get_price_html — меняет отображение цены, но не влияет на расчеты.
  • Хуки в корзине (woocommerce_before_calculate_totals) — изменяют цену товара в момент подсчета итогов заказа, что подходит для скидок и акций.

Таблица сравнения методов

МетодВлияние на ценуПодходит дляМинусы
woocommerce_product_get_priceЦена товара вездеПолная динамика ценСложно отследить, влияет на все запросы
woocommerce_get_price_htmlТолько отображениеВизуальные скидки, без влияния на заказНе меняет итоговую цену
woocommerce_before_calculate_totalsЦена в корзине и заказеСкидки, акции при заказеЦена товара в каталоге не меняется

Пошаговое решение: пример автоматической скидки при покупке более 3-х товаров

  1. Подключитесь к хуку woocommerce_before_calculate_totals.
  2. Проверьте количество товаров в корзине.
  3. Измените цену каждого товара, если условие выполняется.
add_action('woocommerce_before_calculate_totals', 'custom_bulk_discount', 10, 1);
function custom_bulk_discount($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    // Минимум 3 товара в корзине для скидки
    $total_qty = 0;
    foreach (WC()->cart->get_cart() as $cart_item) {
        $total_qty += $cart_item['quantity'];
    }

    if ($total_qty >= 3) {
        foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
            $original_price = $cart_item['data']->get_regular_price();
            $discounted_price = $original_price * 0.9; // Скидка 10%
            $cart_item['data']->set_price($discounted_price);
        }
    }
}

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

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

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

  • Скидка не применяется: убедитесь, что хук добавлен с приоритетом не выше 10 и функция вызывается.
  • Цена меняется в админке или AJAX: добавьте условие if (is_admin() && !defined('DOING_AJAX')) return; для исключения.
  • Цена меняется в каталоге товаров: используйте хук изменения цены только на этапе корзины, не меняйте woocommerce_product_get_price без условий.
  • Кэш мешает видеть изменения: очистите кэш сайта и браузера, отключите Object Cache при тестировании.

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

  • Избегайте выполнения тяжелых вычислений внутри хуков изменения цены.
  • Не храните цены в пользовательских метаполях для динамических скидок, используйте фильтры.
  • Для сложной логики используйте отдельный класс или сервис, чтобы не засорять functions.php.
  • Проверяйте совместимость с кеширующими плагинами (например, Clearfy Pro может помочь с оптимизацией).

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

⭐⭐⭐⭐⭐
Как исправить дублирование артикулов (SKU) в WooCommerce: диагностика и исправление
24.04.2026
Как сделать динамическую подсказку в поисковой форме WordPress
19.02.2026
Как использовать хук pre_get_posts для динамической фильтрации выводимых постов в WordPress
21.04.2026
Как создать собственный шорткод в WordPress: подробное руководство
02.11.2025
Как создать динамические поля формы в WordPress с подгрузкой через AJAX
30.01.2026
×
Сайт, который вау!
-15%

на премиум-тему
JournalX для WordPress

Хватай промо и действуй ⋙