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

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

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

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

WooCommerce предоставляет хук woocommerce_before_calculate_totals, с помощью которого можно программно изменить цену товара в корзине. При этом нужно обновить цену непосредственно у объекта WC_Cart_Item. Неправильное использование этого хука приведет к некорректному подсчету итогов.

Обязательные условия для корректной работы

  • Изменять цену нужно в woocommerce_before_calculate_totals, но только если это не AJAX-запрос или обновление, чтобы избежать бесконечных циклов.
  • Цена меняется только у объектов в корзине, у товара в базе данных цена не меняется.
  • При изменении цены стоит сохранять оригинальную цену в дополнительном поле, чтобы избежать накопления изменений.

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

Рассмотрим пример, когда при сумме корзины свыше 5000 рублей всем товарам применяется скидка 10%.

add_action('woocommerce_before_calculate_totals', 'custom_discount_for_cart_total', 20, 1); function custom_discount_for_cart_total( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // Проверка, чтобы не запускать в админке // Сумма корзины без учета скидок $cart_subtotal = $cart->get_subtotal(); if ( $cart_subtotal > 5000 ) { foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) { $product = $cart_item['data']; if ( ! isset( $cart_item['original_price'] ) ) { $cart_item['original_price'] = $product->get_price(); } $discounted_price = $cart_item['original_price'] * 0.9; $product->set_price( $discounted_price ); } } else { // Вернуть оригинальную цену, если условие не выполнено foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) { if ( isset( $cart_item['original_price'] ) ) { $cart_item['data']->set_price( $cart_item['original_price'] ); } } } }

Этот код нужно вставить в файл functions.php вашей темы или в отдельный плагин.

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

  • Добавьте в корзину товары на общую сумму более 5000 рублей и убедитесь, что цена каждого товара снизилась на 10%.
  • Если сумма корзины становится ниже 5000, цены должны возвращаться к исходным.
  • Проверьте, что итоговая сумма в корзине и на странице оформления заказа корректна и отражает скидку.
  • Тестируйте в режиме гостя и под разными ролями пользователя, чтобы убедиться в отсутствии конфликтов.

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

  • Цена не меняется в корзине или на странице оформления заказа
    Проверьте приоритет хука и условие запуска. Хук должен использоваться с приоритетом не меньше 20, и код не должен выполняться в админке или при AJAX, если это не нужно.
  • Скидка применяется несколько раз на один товар
    Всегда сохраняйте оригинальную цену в отдельном поле, чтобы избежать накопления изменений.
  • Итоговая сумма корзины не соответствует расчетам
    Убедитесь, что цена меняется у объекта WC_Product в корзине, а не у товара в базе данных.
  • Конфликты с плагинами кеширования или оптимизации
    Очистите кеш после изменений и исключите страницы корзины и оформления заказа из кеширования.

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

  • Изменение цены происходит только на стороне сессии пользователя, не трогайте базу данных.
  • Используйте кэширование данных, если для условий нужны запросы к базе или внешним API.
  • Минимизируйте сложность условий, чтобы не замедлять загрузку корзины и страницы оформления заказа.
  • Тестируйте изменения на тестовом сайте перед запуском на боевом.

Сравнение способов реализации динамической цены в WooCommerce

МетодПлюсыМинусыИспользование
Изменение цены через woocommerce_before_calculate_totalsГибко, без плагинов, полная кастомизацияТребует разработки, возможны ошибкиДля уникальных условий скидок и акций
Плагины скидок и акций (например, WooCommerce Dynamic Pricing)Простая настройка, поддержкаПлатные, ограничены функционаломБыстрый старт без кода
Использование купонов WooCommerceВстроено, просто для пользователейМеньше гибкости, не всегда подходитДля стандартных акций
Как создать собственный REST API в WordPress
14.11.2025
WooCommerce: автоматическое удаление неоплаченных заказов с помощью кода
22.06.2026
Как создать динамические формы в WordPress с помощью AJAX
18.03.2026
Автоматический экспорт постов WordPress в PDF: пошаговое руководство
05.01.2026
Автоматическое удаление нерабочих записей WordPress по условию успешности
03.04.2026

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