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

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

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

Для диагностики стоит проверить, что цена товара в корзине действительно берётся из объекта WC_Cart_Item_Data, и что ваши изменения не конфликтуют с другими плагинами или темами.

Пошаговое решение: использование хука woocommerce_before_calculate_totals

Для изменения цены товаров в корзине нужно использовать хук 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;
    }
    // Чтобы не повторять изменение при ajax
    if (did_action('woocommerce_before_calculate_totals') >= 2) {
        return;
    }
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $original_price = $cart_item['data']->get_price();
        // Пример: скидка 10%
        $new_price = $original_price * 0.9;
        $cart_item['data']->set_price($new_price);
    }
}

Если требуется изменить цену только для определённых товаров или условий, внутри цикла добавьте проверки, например, по ID товара или категории.

Пример условного изменения цены для товаров категории "sale"

foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
    $product = $cart_item['data'];
    if (has_term('sale', 'product_cat', $product->get_id())) {
        $original_price = $product->get_price();
        $new_price = $original_price * 0.85; // скидка 15%
        $product->set_price($new_price);
    }
}

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

После добавления кода:

  • Очистите кеш (если используете кеширующие плагины или серверный кеш).
  • Добавьте товар в корзину, подходящий под условия изменения цены.
  • На странице корзины проверьте, что цена товара изменилась на ожидаемую.
  • Обратите внимание, что цена товара в каталоге не изменится — меняется только в корзине и на странице оформления заказа.
  • Для отладки можно добавить error_log() в функцию и посмотреть результат в логах.

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

  • Изменения цены применяются несколько раз: часто из-за отсутствия проверки did_action('woocommerce_before_calculate_totals'). Решение — добавить эту проверку, чтобы избежать повторного изменения.
  • Цена не меняется на странице оформления заказа: проверьте, что функция подключена и не находится в условии is_admin() или других, блокирующих фронтенд.
  • Изменённая цена не сохраняется при обновлении корзины: убедитесь, что изменение происходит именно на хук woocommerce_before_calculate_totals, а не на более ранний или поздний.
  • Конфликты с другими плагинами скидок: попробуйте отключать другие плагины или темы, чтобы выявить источник проблемы.

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

  • Всегда проверяйте, что код не выполняется в админке (кроме AJAX), чтобы не ломать админ-панель.
  • Используйте как можно меньше циклов и тяжелых операций, особенно на больших корзинах.
  • Если необходимо сложное динамическое ценообразование, рассмотрите использование специализированных плагинов с поддержкой WooCommerce.
  • Для комплексных изменений можно использовать фильтр woocommerce_get_price, но это может влиять на цены везде, а не только в корзине.

Сравнение способов изменения цен в WooCommerce

МетодПримерПлюсыМинусы
Хук woocommerce_before_calculate_totalsИзменение цены в корзинеЛокальное изменение цены, легко контролироватьНе меняет цену на страницах каталога
Фильтр woocommerce_get_priceГлобальное изменение ценыМеняет цену везде, включая каталогСложнее контролировать, может вызвать конфликт
Плагины скидок и динамического ценообразованияНапример, WooCommerce Dynamic PricingМного функций, поддержкаПлатные, могут нагружать сайт
Как решить проблему: не работает AJAX в WordPress
07.12.2025
Автоматическое удаление товаров в WooCommerce по истечении срока с WP-Cron
10.06.2026
WooCommerce: автоматическое изменение стоимости товаров в корзине
14.07.2026
Как создать собственный REST API endpoint в WordPress с примером кода
31.12.2025
Как настроить отправку писем через SMTP в WordPress без плагинов
08.04.2026