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Встроено, просто для пользователейМеньше гибкости, не всегда подходитДля стандартных акций
Как удалить все записи из базы WordPress без плагинов
02.11.2025
Автоматическое удаление нерабочих записей WordPress по условию успешности
03.04.2026
Как добавить динамические таблицы в WordPress с помощью плагинов и кода
04.02.2026
WooCommerce: как автоматически удалять товары из корзины по атрибутам после оплаты
17.05.2026
Как создать собственный виджет в WordPress: подробное руководство с примерами кода
01.12.2025

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