wp-lessons.ru wordpress WP-Lessons

Как использовать WooCommerce хуки для автоматического изменения стоимости и состава корзины

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

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

Ключевые хуки WooCommerce для изменения корзины

Для автоматического изменения стоимости и состава корзины в WooCommerce используются следующие хуки:

  • woocommerce_before_calculate_totals — позволяет изменить цены товаров в корзине перед подсчётом итогов.
  • woocommerce_cart_calculate_fees — добавляет дополнительные сборы или скидки к корзине.
  • woocommerce_before_cart и woocommerce_after_cart — для вывода сообщений или динамического управления.
  • woocommerce_add_to_cart и woocommerce_remove_cart_item — для реагирования на добавление или удаление товаров.

Пошаговое решение: динамическое изменение цены товаров в корзине

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

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price', 10, 1);
function custom_dynamic_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

    foreach ( $cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        $quantity = $cart_item['quantity'];

        if ( $quantity >= 3 ) {
            $original_price = $product->get_regular_price();
            $discounted_price = $original_price * 0.9; // скидка 10%
            $product->set_price( $discounted_price );
        }
    }
}

Добавление бесплатного подарка при покупке товаров на сумму свыше 5000 руб.

Чтобы автоматически добавить подарок, используйте следующий код:

add_action('woocommerce_before_calculate_totals', 'custom_add_free_gift');
function custom_add_free_gift( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

    $threshold = 5000; // порог суммы
    $free_gift_id = 123; // ID товара-подарка

    $cart_total = $cart->subtotal;
    $found = false;

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( $cart_item['product_id'] == $free_gift_id ) {
            $found = true;
            break;
        }
    }

    if ( $cart_total >= $threshold && ! $found ) {
        $cart->add_to_cart( $free_gift_id );
    } elseif ( $cart_total < $threshold && $found ) {
        $cart->remove_cart_item( $cart_item_key );
    }
}

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

  • Добавьте в корзину товары, чтобы проверить, что при количестве от 3 изменяется цена на 10%.
  • Убедитесь, что при сумме корзины свыше 5000 руб. появляется товар-подарок (ID 123).
  • Проверьте, что при уменьшении суммы подарочный товар автоматически удаляется.
  • Откройте консоль браузера и убедитесь в отсутствии ошибок JavaScript, влияющих на обновление корзины.

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

  • Цена не меняется: Проверьте, что хук woocommerce_before_calculate_totals зарегистрирован с приоритетом ниже 10, чтобы изменения применялись после загрузки цены.
  • Бесплатный подарок добавляется несколько раз: Обязательно проверяйте наличие подарка в корзине перед добавлением.
  • Изменения не сохраняются: Если используете кэширование, почистите кэш и отключите плагины кеширования на время тестирования.
  • Функция добавления подарка вызывает ошибку: Убедитесь, что ID товара существует и активен на сайте.

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

  • Всегда проверяйте, что код выполняется вне административной панели и не во время AJAX-запросов, чтобы избежать дублирования и конфликтов.
  • Не меняйте цену товара напрямую в базе, меняйте только объект $product в корзине.
  • Используйте проверку условий до изменения корзины, чтобы не перегружать сервер лишними запросами.
  • Тестируйте на staging-среде, чтобы избежать сбоев на рабочем сайте.

Сравнение подходов: плагин vs код

КритерийИспользование кодаИспользование плагина
ГибкостьВысокая — можно реализовать любые условияОграничена функционалом плагина
ПроизводительностьОптимально при правильной реализацииМожет замедлять сайт из-за избыточных функций
Сложность поддержкиТребует навыков PHP и WooCommerceПроще для пользователей без кода
БезопасностьЗависит от качества кодаЗависит от качества плагина и обновлений
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее