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

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

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

Пошаговое решение: как изменить цену товара при добавлении в корзину

1. Использование хука woocommerce_before_calculate_totals

Для изменения цены в корзине нужно использовать фильтр, который срабатывает перед подсчетом стоимости корзины. Ключевой хук — woocommerce_before_calculate_totals. Он позволяет перебрать все товары в корзине и изменить их цену.

2. Пример кода для изменения цены при добавлении определенного товара

add_action('woocommerce_before_calculate_totals', 'change_price_on_add_to_cart', 20, 1); 
function change_price_on_add_to_cart( $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 ) {
        // ID товара, для которого меняем цену
        $target_product_id = 1234;
        if ( $cart_item['product_id'] == $target_product_id ) {
            // Новая цена
            $new_price = 499.99;
            $cart_item['data']->set_price( $new_price );
        }
    }
}

В этом примере при добавлении в корзину товара с ID 1234 цена изменится на 499.99. Можно расширить логику, учитывая количество, роль пользователя, дату и другие параметры.

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

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

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

  • Цена не меняется в корзине: Убедитесь, что функция подключена правильно и не конфликтует с другими плагинами, также проверьте, что set_price() вызывается для объекта $cart_item['data'].
  • Изменения цены вызывают ошибки в админке: Добавьте проверку is_admin() && ! defined('DOING_AJAX') чтобы избежать изменения цены в админке.
  • Цена меняется несколько раз: Используйте счетчик вызова did_action('woocommerce_before_calculate_totals') чтобы не применять цену повторно.
  • Странное поведение с вариативными товарами: Для вариативных товаров используйте $cart_item['variation_id'] вместо product_id, если нужно менять цену вариации.

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

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

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

МетодОписаниеПлюсыМинусы
Код на woocommerce_before_calculate_totals Изменение цены в объекте товара корзины Гибко, без плагинов, работает для любых условий Требует знаний PHP, может конфликтовать с другими плагинами
Плагин с настройками скидок Использование готовых плагинов для динамических скидок Простота настройки, поддержка разработчика Может быть платным, не всегда подходит под сложные условия
Изменение цены товара в базе Редактирование цены напрямую в товаре Просто, работает всегда Не динамично, меняет цену для всех покупателей
Оптимизация admin-ajax.php в WordPress: как решить проблемы с нагрузкой и медленной загрузкой
30.12.2025
Автообновление статуса заказа в WooCommerce по срокам
25.04.2026
Как использовать REST API для создания собственных функций в WordPress
08.11.2025
Как удалить старые комментарии и их метаданные в WordPress
19.03.2026
WooCommerce: автоматическое изменение цены продукта при добавлении в корзину
08.05.2026