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

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

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

Как понять, что стандартных настроек недостаточно

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

Пошаговое решение: изменение стоимости товара в корзине через хуки WooCommerce

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

Рассмотрим пример: изменим цену товара на 10% скидку, если в корзине более 3 единиц этого товара.

add_action('woocommerce_before_calculate_totals', 'custom_change_price_based_on_quantity', 20, 1); 
function custom_change_price_based_on_quantity($cart) {
    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }
    // Пробегаем по товарам в корзине
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $quantity = $cart_item['quantity'];
        $original_price = $cart_item['data']->get_regular_price();
        if ($quantity > 3) {
            // Скидка 10%
            $new_price = $original_price * 0.9;
            $cart_item['data']->set_price($new_price);
        } else {
            // Восстановить оригинальную цену, если условие не выполняется
            $cart_item['data']->set_price($original_price);
        }
    }
}

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

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

Чтобы применить скидку только для, например, зарегистрированных пользователей с ролью customer, добавьте проверку роли:

if ( current_user_can('customer') && $quantity > 3 ) {
    $new_price = $original_price * 0.9;
    $cart_item['data']->set_price($new_price);
} else {
    $cart_item['data']->set_price($original_price);
}

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

  • Добавьте в корзину товар с количеством больше 3 — цена должна автоматически уменьшиться на 10%.
  • Попробуйте изменить количество на 3 и меньше — цена должна вернуться к исходной.
  • Для проверки роли пользователя — попробуйте залогиниться под разными пользователями.
  • Обязательно очистите кэш сайта и браузера, если используется кэширование.

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

  • Цена не меняется в корзине или при оформлении заказа
    Убедитесь, что хук woocommerce_before_calculate_totals подключён правильно и приоритет не ниже 20, чтобы другие изменения не перекрывали ваш. Проверьте, что код не выполняется в админке (проверка is_admin()).
  • Скидка применяется несколько раз
    Если не восстанавливать оригинальную цену в else, скидка будет применяться многократно при обновлении корзины.
  • Цена меняется в админке или в других местах
    Добавьте проверку if (is_admin() && !defined('DOING_AJAX')) return; чтобы избежать побочных эффектов.
  • Конфликты с плагинами кеширования
    Убедитесь, что страницы корзины и оформления заказа не кэшируются, иначе изменения цены не будут видны пользователю.

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

  • Не храните изменённые цены в базе данных напрямую — изменение цены должно происходить динамически в памяти, чтобы избежать ошибок и рассинхронизации.
  • Используйте минимально необходимый приоритет для хуков, чтобы не мешать другим плагинам.
  • Тестируйте на тестовом сайте с включённым режимом отладки WP_DEBUG.
  • Если скидки сложные и разнообразные, рассмотрите использование специализированных плагинов, например Clearfy Pro для оптимизации и управления ценами.

Сравнение подходов: код vs плагины для изменения стоимости в корзине

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

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

⭐⭐⭐⭐⭐
Как создать свой шорткод в WordPress: подробное руководство с примерами
10.11.2025
Как избежать проблем с кэшированием в WordPress: практические советы и примеры
07.04.2026
WooCommerce: как изменить количество товаров в корзине без перезагрузки страницы
12.07.2026
Как добавить автоматическое удаление старых записей в WordPress
08.03.2026
Оптимизация загрузки шрифтов в WordPress: улучшение скорости и производительности
23.11.2025
×
-15%
на премиум плагин
Clearfy

Защитите сайт!

Включить Clearfy »