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

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

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

Как понять, что требуется именно изменение стоимости в корзине

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

Пошаговое решение: изменение цены товара в корзине по условию

Для изменения цены товара в корзине лучше всего использовать фильтр woocommerce_before_calculate_totals. Вот пример, который уменьшает цену на 10% для товаров категории "Акции" для пользователей с ролью "оптовик":

add_action('woocommerce_before_calculate_totals', 'custom_change_cart_item_price', 10, 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'];
        $user = wp_get_current_user();

        if (in_array('optovik', (array) $user->roles) && has_term('akcii', 'product_cat', $product->get_id())) {
            $original_price = $product->get_regular_price();
            $new_price = $original_price * 0.9; // скидка 10%
            $product->set_price($new_price);
        }
    }
}

Обратите внимание, что цена меняется только для конкретного объекта товара в корзине без изменения самой записи товара.

Объяснение кода

  • Проверяем, что код не выполняется в админке вне AJAX (чтобы не ломать админку).
  • Перебираем все товары в корзине.
  • Проверяем роль пользователя и категорию товара.
  • Устанавливаем новую цену через set_price().

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

  • Добавьте товар из категории "Акции" в корзину под учетной записью с ролью "оптовик".
  • Перейдите в корзину и убедитесь, что цена товара уменьшена на 10%.
  • Для пользователя без роли "оптовик" цена должна остаться без изменений.
  • Проверьте, что расчет итогов заказа и налоги обновляются корректно.

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

  • Изменение цены в админке или бекенде: Нужно исключать выполнение кода в панели администратора, иначе можно сломать админку (см. проверку is_admin() и DOING_AJAX).
  • Меняется цена товара глобально: Никогда не меняйте цену через update_post_meta или напрямую для товара — это повлияет на всех покупателей.
  • Цена не меняется в корзине: Проверьте, что используете хук woocommerce_before_calculate_totals и что цена меняется у объекта $cart_item['data'], а не у самого массива.
  • Кэширование мешает обновлению цены: Отключите кэширование корзины и страницы корзины, чтобы увидеть изменения.

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

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

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

МетодОписаниеПлюсыМинусы
Фильтр woocommerce_before_calculate_totalsИзменение цены объектов товара в корзинеГибкость, не меняет данные товара, работает для любых условийНужно аккуратно писать код, возможны проблемы с кэшированием
Купоны WooCommerceСтандартные скидки и наценкиПростота использования, поддержка админкойОграничены по условиям, нельзя менять цену на отдельные атрибуты
Плагины динамических ценГотовые решения для сложных скидокМного функций без кодаМогут быть тяжелыми, платные, ограничены в кастомизации
WooCommerce: как изменять стоимость товаров в корзине по условию
07.05.2026
Как создать автоматическое отправление email в WordPress с помощью WP-Cron
11.02.2026
Автоматическое отключение плагинов на отдельных страницах WordPress для оптимизации
07.04.2026
Как удалить постоянные редиректы в WordPress
28.03.2026
Как автоматизировать удаление старого контента в WordPress с помощью WP-Cron и кода
21.03.2026

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.