WPExperts

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

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

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

Типичные примеры:

  • Скидка при покупке от определённого количества;
  • Повышение цены для определённой группы пользователей (оптовики, партнёры);
  • Временные акции с изменённой ценой на ограниченный период;
  • Изменение цены в зависимости от пользовательских мета-данных или кастомных полей.

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

1. Используем хук woocommerce_product_get_price и woocommerce_product_get_regular_price

Для изменения цены в реальном времени нужно переопределить методы получения цены товара. Так WooCommerce отобразит изменённую цену на страницах магазина и в корзине.

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) {
    // Получаем ID товара
    $product_id = $product->get_id();

    // Пример: скидка 10% при покупке более 5 штук
    $cart_quantity = 0;
    foreach (WC()->cart->get_cart() as $cart_item) {
        if ($cart_item['product_id'] === $product_id) {
            $cart_quantity = $cart_item['quantity'];
            break;
        }
    }

    if ($cart_quantity >= 5) {
        $price = $price * 0.9; // скидка 10%
    }

    return $price;
}

2. Применяем цену в корзине и на странице оплаты

Чтобы цена обновлялась корректно и в корзине, нужно добавить хук woocommerce_before_calculate_totals и изменить цену каждого товара в корзине.

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_cart', 10, 1);

function custom_dynamic_price_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 ($quantity >= 5) {
            $new_price = $product->get_regular_price() * 0.9; // 10% скидка
            $product->set_price($new_price);
        }
    }
}

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

  • Добавьте товар в корзину количеством меньше 5 — цена должна быть стандартной;
  • Увеличьте количество товара до 5 и более — цена автоматически снизится на 10%;
  • Проверьте отображение цены на странице товаров, в корзине, на оформлении заказа и в письмах;
  • Включите режим отладки WooCommerce и проверьте, что нет ошибок PHP;
  • При необходимости очистите кеш сайта и браузера для корректного отображения.

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

  • Скидка не применяется в корзине или на странице оформления заказа. Проверьте, что хук woocommerce_before_calculate_totals добавлен и функция корректно меняет цену через $product->set_price().
  • Цена меняется на страницах, но итог в заказе неверный. Убедитесь, что изменение происходит до подсчёта итогов и нет конфликтов с другими плагинами скидок.
  • Изменение цены влияет на все товары, а нужно только на конкретные. Добавьте условия проверки $product_id в функции для выборочного изменения цены.
  • Ошибки PHP или предупреждения. Проверьте корректность кода, используйте встроенные функции WooCommerce и избегайте прямого обращения к БД.

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

  • Не изменяйте цену товаров напрямую в базе — используйте хуки и методы WooCommerce.
  • Кэшируйте результаты вычислений, если цена зависит от внешних данных или сложных условий.
  • Тестируйте на стейджинге, чтобы не сломать процесс оформления заказа у клиентов.
  • При необходимости используйте WP_DEBUG_LOG для отладки.

Сравнение подходов: код vs плагины

МетодПреимуществаНедостаткиПример
Код на PHP (хуки WooCommerce)Гибкость, точечное управление, нет зависимости от сторонних плагиновТребует навыков программирования, сложнее поддерживатьПример из статьи
Плагины скидок (например, WooCommerce Dynamic Pricing)Удобный интерфейс, готовые шаблоны правил скидокДополнительная нагрузка, могут конфликтовать с темами и другими плагинамиWooCommerce Dynamic Pricing
×
до 3225₽

Продавай темы и плагины WordPress!

Лови с каждой продажи

Начать ⋙