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

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

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

Основные признаки необходимости автоматического изменения цены:

  • Цены должны меняться в зависимости от атрибутов заказа или пользователя.
  • Нужно отразить изменение цены сразу на странице товара или корзины.
  • Изменения должны корректно учитываться при оформлении заказа и оплате.

Как реализовать автоматическое изменение цены через фильтр woocommerce_product_get_price

WordPress и WooCommerce предоставляют фильтры, позволяющие менять цену товара на лету без сохранения изменений в базе. Основной фильтр — woocommerce_product_get_price, он вызывается при получении цены товара.

Пример: скидка 10% для зарегистрированных пользователей

add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_price', 10, 2);

function custom_dynamic_price($price, $product) {
    if (is_user_logged_in()) {
        $price = $price * 0.9; // Скидка 10%
    }
    return $price;
}

Важно использовать оба фильтра woocommerce_product_get_price и woocommerce_product_get_regular_price для корректного отображения и расчётов.

Условие по количеству товара в корзине

Чтобы изменить цену при покупке от 5 штук, используйте следующий код:

add_filter('woocommerce_product_get_price', 'discount_bulk_quantity', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'discount_bulk_quantity', 10, 2);

function discount_bulk_quantity($price, $product) {
    $product_id = $product->get_id();
    $cart = WC()->cart;
    if (!$cart) return $price;

    $quantity = 0;
    foreach ($cart->get_cart() as $cart_item) {
        if ($cart_item['product_id'] === $product_id) {
            $quantity += $cart_item['quantity'];
        }
    }

    if ($quantity >= 5) {
        $price = $price * 0.85; // Скидка 15%
    }
    return $price;
}

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

  • Зайдите на страницу товара, убедитесь, что цена меняется в зависимости от условия (например, при авторизации пользователя).
  • Добавьте товар в корзину нужным количеством, проверьте, что цена в корзине и на странице оформления заказа обновилась.
  • Проверьте, что в админке и в заказе сохраняется корректная цена без постоянных изменений в базе.
  • Используйте инструменты разработчика браузера, чтобы убедиться, что цена выводится без кеша старых значений.

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

  • Цена меняется в списке товаров, но не в корзине — убедитесь, что используется фильтр woocommerce_product_get_price, а не только woocommerce_get_price, и что в корзине цена пересчитывается. Для корзины можно дополнительно использовать woocommerce_before_calculate_totals.
  • Изменения не отображаются из-за кеширования — отключите кеширование страниц или добавьте исключения для страниц товара и корзины.
  • Пользователь видит неправильные цены — проверьте логику условий и что переменные окружения (например, доступ к корзине) доступны в момент вызова фильтра.
  • Цены в админке и заказах не совпадают — помните, что фильтры влияют только на отображение, а для изменения цены в заказе нужно использовать woocommerce_before_calculate_totals для перерасчёта позиций.

Оптимальное решение для изменения цены в корзине через woocommerce_before_calculate_totals

Для правильного изменения цены именно в корзине используйте следующий код:

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

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

        if (is_user_logged_in() && $quantity >= 5) {
            $original_price = $product->get_regular_price();
            $new_price = $original_price * 0.85; // Скидка 15%
            $product->set_price($new_price);
        }
    }
}

Сравнение вариантов автоматического изменения цены

МетодГде применяетсяПлюсыМинусы
Фильтр woocommerce_product_get_priceОтображение цены на сайтеПросто реализовать, влияет на вывод ценыНе меняет цену в корзине и заказе, возможно рассогласование
Хук woocommerce_before_calculate_totalsВ корзине и оформлении заказаИзменяет цену в корзине и заказах, корректно учитываетсяСложнее реализовать, требует проверки условий
Изменение цены товара в базеПостоянное обновление ценыЦена меняется для всехТребует ручного обновления, не подходит для динамических условий

Чек-лист для внедрения автоматического изменения стоимости в WooCommerce

  • Определить условие изменения цены (пользователь, количество, способ доставки и т.д.)
  • Использовать фильтр woocommerce_product_get_price для изменения цены на страницах товаров
  • Использовать woocommerce_before_calculate_totals для изменения цены в корзине и заказе
  • Проверить, что цена корректно отображается и считается в заказах
  • Отключить кеширование на страницах с динамическими ценами
  • Тестировать на разных ролях пользователей и сценариях

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

  • Кэшируйте результаты вычислений цены, если условие сложное, чтобы не создавать нагрузку на каждый вызов фильтра.
  • Не записывайте динамические цены в базу данных, используйте хуки для изменения на лету.
  • Проверяйте, что код не выполняется в админке без необходимости, чтобы не создавать лишних операций.
  • Используйте проверки на существование объекта корзины WC()->cart перед обращением к ней, чтобы избежать ошибок на страницах без корзины.
  • Соблюдайте стандарты WooCommerce для совместимости с другими плагинами и темами.
Как удалить файлы из медиабиблиотеки WordPress правильно
10.11.2025
Как создать автоматический импорт продукции в WooCommerce
09.04.2026
Как автоматически удалять пустые термины в WordPress
16.03.2026
Как автоматически удалить старые пункты в меню WordPress по дате создания
20.02.2026
WooCommerce: автоматическое удаление неактивных заказов
10.06.2026