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

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

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

Как изменить цену товара в корзине через хук woocommerce_before_calculate_totals

Для изменения цены в корзине используется хук woocommerce_before_calculate_totals. В этом хуке можно перебрать все товары корзины и задать для них новую цену.

Пример: меняем цену товара с ID 123 на 500 рублей, если в корзине больше 3 единиц этого товара.

add_action('woocommerce_before_calculate_totals', 'custom_change_cart_item_price', 20, 1); 
function custom_change_cart_item_price($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        if ($product->get_id() == 123) {
            if ($cart_item['quantity'] > 3) {
                $new_price = 500; // новая цена
                $product->set_price($new_price);
            }
        }
    }
}

Пояснения к коду

  • is_admin() и DOING_AJAX — защита, чтобы код не срабатывал в админке и не ломал обновления корзины.
  • Метод set_price() меняет цену товара для текущего объекта корзины, не затрагивая базовую цену в базе.

Пошаговое решение задачи с условиями

  1. Определить условие, при котором нужно менять цену (например, количество, роль пользователя, наличие другого товара).
  2. Добавить код с хуком woocommerce_before_calculate_totals в файл functions.php вашей темы или в кастомный плагин.
  3. Обязательно проверить, что код не срабатывает в админке и не конфликтует с ajax-запросами.
  4. Протестировать работу в корзине, изменяя количество товаров, чтобы увидеть изменение цены.

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

  • Добавьте в корзину товар с ID, указанным в коде (например, 123).
  • Увеличьте количество товара больше порогового (например, 4).
  • Обновите страницу корзины и убедитесь, что цена изменилась на заданную (500 рублей).
  • Убедитесь, что в чекауте и заказе изменённая цена сохраняется.
  • Проверьте, что в админке и при просмотре товара цена осталась неизменной.

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

  • Изменение цены в админке: если не добавить проверку is_admin() && !DOING_AJAX, цена может изменяться и в админке, что приводит к ошибкам.
  • Неверное использование объекта товара: менять цену нужно через $cart_item['data']->set_price(), а не напрямую в массиве.
  • Конфликт с другими плагинами, меняющими цены: проверьте приоритет хука (рекомендуется 20 или выше).
  • Цена не сохраняется в заказе: убедитесь, что не используется кеширование и что цена корректно передаётся в заказ WooCommerce.

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

  • Не используйте этот код для изменения цены в публичном доступе без проверки прав пользователя. Это может привести к обходу цен.
  • Избегайте сложных и тяжёлых вычислений внутри хука — это влияет на скорость загрузки корзины.
  • Если нужно менять цену для роли пользователя, используйте current_user_can() или wp_get_current_user().
  • Проверяйте совместимость с кеширующими плагинами, чтобы изменения цены не кешировались.

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

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

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

add_action('woocommerce_before_calculate_totals', 'change_price_for_wholesale_users', 20, 1);
function change_price_for_wholesale_users($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    $user = wp_get_current_user();
    if (in_array('wholesaler', (array) $user->roles)) {
        foreach ($cart->get_cart() as $cart_item) {
            $product = $cart_item['data'];
            $original_price = $product->get_regular_price();
            $discounted_price = $original_price * 0.8; // скидка 20%
            $product->set_price($discounted_price);
        }
    }
}

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как отключить автообновления тем и плагинов WordPress через функции
25.02.2026
Как добавить автозамену текста в WordPress простым кодом
04.04.2026
Как использовать WPRemark для автоматизации отзывов в WordPress
16.04.2026
WooCommerce: как исправить проблему с возвратом денег при отключённой AJAX-обработке
23.04.2026
Как добавить поддержку формата WebP в WordPress без плагинов
14.03.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее