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

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

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

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

Шаг 1. Подключение функции к хуку

Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин. Этот хук вызывается перед расчетом итогов корзины и позволяет изменять цену товаров динамически.

add_action('woocommerce_before_calculate_totals', 'custom_change_cart_item_price', 20, 1);

Шаг 2. Реализация функции изменения цены

В функции перебираем все товары в корзине и изменяем цену по условию. Ниже пример, где для товара с ID 123 цена повышается на 10%.

function custom_change_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    // Защита от повторного применения
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) {
        return;
    }

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        if ( $product->get_id() === 123 ) {  // ID товара для изменения
            $original_price = $product->get_regular_price();
            $new_price = $original_price * 1.10; // +10%
            $cart_item['data']->set_price( $new_price );
        }
    }
}

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

1. Добавьте в корзину товар с ID 123.
2. Перейдите в корзину и проверьте, что цена товара увеличилась на 10% по сравнению с ценой в каталоге.
3. Измените количество или добавьте другие товары — цены остальных товаров остаются без изменений.
4. Проверьте на странице оформления заказа, что итоговые суммы и налоги пересчитаны корректно.
5. Убедитесь, что в административной панели цена товара в заказе отражается с учетом изменений.

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

  • Изменение цены происходит несколько раз: Это часто случается, если не проверять количество срабатываний хука. Используйте did_action() для защиты.
  • Цена меняется и в административной панели или в других местах: Добавляйте проверку is_admin() и исключайте AJAX-запросы.
  • Цена не изменяется: Убедитесь, что set_price() вызывается у объекта $cart_item['data']. Иногда разработчики пытаются менять цену у объекта товара напрямую вне корзины.
  • Конфликты с другими плагинами ценообразования: Проверьте последовательность приоритетов подключения функций и тестируйте совместимость.

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

  • Изменяйте цену только в корзине и на этапе оформления заказа, чтобы не повлиять на цену товара в каталоге.
  • Добавляйте проверки контекста (is_admin(), DOING_AJAX), чтобы избежать ошибок при работе в админке и AJAX-запросах.
  • Не храните изменённые цены в сессии или метаданных, если это не требуется — меняйте их динамически для минимизации риска рассинхронизации.
  • Для сложных правил скидок или наценок рассмотрите плагины ценообразования, например, WooCommerce Dynamic Pricing & Discounts, если собственный код становится громоздким.

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

МетодПлюсыМинусыКогда использовать
Хук woocommerce_before_calculate_totalsГибкий, прост в коде, работает для любых товаровНужно аккуратно избегать повторных вызовов, требует тестированияДля кастомных правил изменения цены в корзине
Плагины динамического ценообразованияПолный функционал, интерфейс настройкиПлатные, могут влиять на производительностьДля сложных правил и масштабных магазинов
Изменение цены на уровне продукта (через метаполя)Простая реализация, легко сохранятьМеняет цену в каталоге, не подходит для временных скидокДля постоянных изменений цены
Как использовать хук pre_get_posts для кастомных фильтров в WooCommerce
17.04.2026
Добавление пользовательского поля профиля на фронтенде WordPress
17.03.2026
Использование хука pre_get_posts для кастомной фильтрации товаров WooCommerce
25.04.2026
Изменение атрибутов товара в WooCommerce через REST API
17.05.2026
Как добавить поддержку мультипостинговых записей в WordPress
14.04.2026