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

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

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

Часто встречающаяся проблема — некорректное или неполное изменение цены, из-за чего клиенты видят неверную стоимость в корзине, на странице товара или при оформлении заказа, что приводит к потерям продаж и недовольству.

Пошаговое решение: как программно изменить цену товара в корзине и на страницах

1. Определяем условия

Для примера рассмотрим задачу: автоматически снижать цену товара на 10%, если в корзине больше 3 единиц этого товара.

2. Добавляем фильтр для изменения цены в корзине

Используем фильтр woocommerce_before_calculate_totals, который позволяет менять цену товаров в корзине перед подсчётом итогов.

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_change', 20, 1);
function custom_dynamic_price_change($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $quantity = $cart_item['quantity'];
        $product = $cart_item['data'];

        if ($quantity > 3) { // условие
            $original_price = floatval($product->get_regular_price());
            $new_price = $original_price * 0.9; // скидка 10%
            $product->set_price($new_price);
        } else {
            // вернуть цену к оригиналу, если условие не выполнено
            $product->set_price($product->get_regular_price());
        }
    }
}

3. Обновляем отображение цены на странице товара

Изменение цены только в корзине — не всегда достаточно. Для информирования пользователя можно добавить динамическое отображение цены с учётом условий прямо на странице товара, используя AJAX или хуки WooCommerce.

Пример — вывод уведомления о скидке:

add_action('woocommerce_single_product_summary', 'custom_show_discount_message', 25);
function custom_show_discount_message() {
    global $product;
    $regular_price = $product->get_regular_price();
    $discounted_price = $regular_price * 0.9;
    echo '<p style="color:green; font-weight:bold;">При покупке от 4 штук цена снижена до <del>' . wc_price($regular_price) . '</del> <ins>' . wc_price($discounted_price) . '</ins> за единицу.</p>';
}

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

Чтобы убедиться, что изменение цены работает корректно, выполните следующие шаги:

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

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

  • Цена меняется в админке или для всех пользователей без условий. Решение: добавьте проверку is_admin() && !defined('DOING_AJAX') в начале функции, чтобы исключить изменение цены в админке.
  • Изменённая цена не отображается везде — только в корзине или только на странице товара. Решение: используйте соответствующие хуки и добавьте уведомления для пользователя о скидках.
  • Изменение цены не учитывается при оформлении заказа. Решение: убедитесь, что фильтр woocommerce_before_calculate_totals работает корректно и применяется до расчёта итоговой суммы.
  • Кэширование мешает увидеть изменения. Решение: отключите кэширование страниц для корзины и страниц товаров с динамическими ценами, либо используйте AJAX для обновления цен.

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

  • Не сохраняйте изменённые цены в базу данных — используйте хуки для динамического изменения в процессе расчёта.
  • Для сложных условий используйте кэширование результатов вычислений в сессии, чтобы не перегружать сервер.
  • Проверяйте совместимость с плагинами кеширования и кешируйте только статику, а динамические части выводите через AJAX.
  • При использовании пользовательских ролей или региональных условий учитывайте возможность обхода через прямые запросы к API — валидируйте данные на сервере.

Сравнение вариантов реализации

ВариантПлюсыМинусы
Использование фильтра woocommerce_before_calculate_totalsЛёгкая реализация, не требует плагинов, работает для всех товаров в корзинеИзменения видны только в корзине, требуется доп. код для страницы товара
Использование плагинов скидок (например, "WooCommerce Dynamic Pricing")Богатый функционал, удобный UI, поддержка сложных правилПлатные решения, возможны конфликты с другими плагинами, нагрузка
AJAX-обновление цен на странице товараПользователь сразу видит актуальную цену, гибкость отображенияУсложнение фронтенда, необходимость писать JS и серверную часть
WooCommerce: автоматическое изменение стоимости товара и удаление из корзины через AJAX без перезагрузки
03.05.2026
Как изменить тип записи (post type) в WordPress без потери SEO и ссылок
10.12.2025
Как использовать омнинаправленные хуки в WordPress для распространённых задач
22.02.2026
Как удалить старые медиа файлы в WordPress без плагинов
25.01.2026
Как автоматизировать удаление старого контента в WordPress
25.02.2026

На оформлении, скоро здесь появится полноценный ресурс