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

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

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

Как работает изменение цены в WooCommerce

WooCommerce хранит цену товара в объекте WC_Product, но при добавлении в корзину цена фиксируется в объекте WC_Cart_Item. Чтобы динамически изменить цену, нужно использовать фильтр woocommerce_before_calculate_totals и изменить цену в массиве товаров корзины.

Основные хуки для изменения цены в корзине

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

Пошаговое решение: пример кода для изменения цены товара в корзине

Рассмотрим кейс: при добавлении товара с ID 123 в корзину цена изменяется на 50% от базовой.

add_action('woocommerce_before_calculate_totals', 'custom_change_price_in_cart', 10, 1);
function custom_change_price_in_cart($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    // Пробегаем по всем товарам в корзине
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        // Проверяем ID товара
        if ($cart_item['product_id'] == 123) {
            $original_price = $cart_item['data']->get_price();
            // Устанавливаем цену 50% от оригинала
            $new_price = $original_price * 0.5;
            $cart_item['data']->set_price($new_price);
        }
    }
}

Этот код добавляется в functions.php вашей темы или в отдельный плагин. Он изменит цену товара с ID 123 при расчете корзины.

Как проверить, что цена изменилась

  • Добавьте товар с ID 123 в корзину.
  • Перейдите на страницу корзины и проверьте цену товара — она должна быть 50% от базовой.
  • В админке и на странице магазина цена останется без изменений (изменение происходит только в корзине).

Частые ошибки и их устранение

  • Цена не меняется в корзине: проверьте, что код подключен и хук woocommerce_before_calculate_totals срабатывает. Иногда кэширование мешает — очистите кэш сайта и браузера.
  • Изменение цены влияет на заказ в админке: если вы меняете цену товара напрямую в объекте продукта, цена изменится глобально. В коде выше мы меняем цену в объекте товара в корзине, что не влияет на базовую цену.
  • Множественные изменения цены: если корзина пересчитывается несколько раз, цена может умножаться. Чтобы избежать этого, можно добавить флаг, который предотвращает повторное изменение цены.

Расширение функционала: изменение цены в зависимости от пользователя или других условий

Пример изменения цены для ролей пользователей:

add_action('woocommerce_before_calculate_totals', 'change_price_for_user_role', 10, 1);
function change_price_for_user_role($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    $user = wp_get_current_user();
    if (in_array('subscriber', (array) $user->roles)) {
        foreach ($cart->get_cart() as $cart_item) {
            $product = $cart_item['data'];
            $original_price = $product->get_price();
            // Скидка 20% для подписчиков
            $product->set_price($original_price * 0.8);
        }
    }
}

Таблица сравнения решений для изменения цены в WooCommerce

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

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

  • Не изменяйте базовые цены товаров напрямую, чтобы избежать проблем с отчетностью и заказами.
  • Контролируйте применение фильтров, чтобы цена не менялась несколько раз — используйте флаги или проверяйте текущую цену.
  • Проверяйте код на тестовом сайте перед применением на живом магазине.
  • Для сложных условий используйте кэширование значений, чтобы снизить нагрузку на сервер.
Как правильно использовать хуки (actions и filters) в WordPress с примерами кода
08.03.2026
Как создать многоуровневую навигацию в WordPress с примерами кода
10.02.2026
WPAll Автообновления WordPress: как настроить безопасное обновление плагинов и тем
04.11.2025
Автообновление статуса заказа в WooCommerce по срокам
17.04.2026
Как удалить старые папки и файлы из медиабиблиотеки WordPress
26.02.2026