Диагностика задачи: зачем менять поведение корзины в WooCommerce
Корзина WooCommerce — ключевая часть интернет-магазина, и порой требуется внести нестандартные изменения: добавить уведомление, изменить вывод цены, автоматически применять скидку или изменить поведение кнопки «Оформить заказ». Чтобы сделать это без правки ядра и с сохранением возможности обновлений, используются хуки WordPress — actions и filters.
Какие хуки использовать для изменения корзины WooCommerce
WooCommerce предоставляет множество хуков для работы с корзиной. Ниже основные из них:
woocommerce_before_cart— вывод перед корзиной;woocommerce_after_cart— вывод после корзины;woocommerce_cart_item_name— фильтр для изменения названия товара в корзине;woocommerce_cart_totals_before_order_total— действие перед итоговой суммой;woocommerce_before_calculate_totals— действие перед подсчетом итогов, можно менять цены;woocommerce_cart_item_price— фильтр для изменения цены товара в корзине;woocommerce_proceed_to_checkout— действие для изменения кнопки перехода к оформлению заказа.
Пошаговое решение: пример автоматического применения скидки 10% на корзину с суммой свыше 5000 ₽
1. Добавьте код в functions.php или в плагин для кастомных функций.
add_action('woocommerce_before_calculate_totals', 'apply_custom_discount_to_cart', 10, 1);
function apply_custom_discount_to_cart( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;
$threshold = 5000; // минимальная сумма для скидки
$discount_percent = 10; // размер скидки
$cart_total = 0;
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$cart_total += $cart_item['line_total'];
}
if ( $cart_total > $threshold ) {
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$original_price = $cart_item['data']->get_price();
$discounted_price = $original_price * (1 - $discount_percent / 100);
$cart_item['data']->set_price( $discounted_price );
}
}
}2. Очистите кэш сайта и корзины, если используете кеширующие плагины.
3. Проверьте, что скидка применяется. Добавьте товары на сумму более 5000 ₽ и убедитесь, что цены в корзине уменьшились на 10%.
Проверка результата после внедрения
- Добавьте несколько товаров в корзину на сумму выше 5000 ₽.
- Откройте страницу корзины, убедитесь, что цены изменились (на 10% меньше).
- Проверьте, что при сумме ниже 5000 ₽ цены не меняются.
- Откройте консоль браузера на странице оформления заказа — ошибок JavaScript быть не должно.
- Проверьте, что в админке заказ отображается с корректными суммами.
Частые ошибки и как их исправить
- Скидка не применяется — проверьте, что функция привязана к хуку
woocommerce_before_calculate_totalsс приоритетом 10, и что условие на сумму работает. - Цена не обновляется в админке — убедитесь, что скидка применяется до подсчета итогов, иначе WooCommerce не увидит изменённые цены.
- Двойное применение скидки — используйте проверку
did_action('woocommerce_before_calculate_totals'), чтобы избежать повторного срабатывания. - Проблемы с кэшем — отключите кэш для страниц корзины и оформления заказа.
Практические советы по безопасности и производительности
- Не изменяйте цены напрямую в базе данных, используйте предоставленные методы WooCommerce, чтобы избежать ошибок.
- Кэшируйте только страницы без динамического контента (например, корзина и оформление заказа должны быть исключены из кэша).
- Используйте локальные проверки для условий — например,
is_cart()илиis_checkout(), чтобы код не работал на всех страницах. - Тестируйте изменения на тестовом сайте, чтобы избежать сбоев в работе магазина.
Сравнение способов изменения корзины WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Хуки (actions и filters) | Изменение поведения через стандартные хуки WooCommerce | Легко обновлять, не ломает ядро, гибко | Требует знания API WooCommerce |
| Шаблонные переопределения | Изменение файлов шаблонов корзины | Полный контроль над выводом | Сложнее обновлять, возможны конфликты |
| Плагины сторонних разработчиков | Готовые решения с настройками | Быстрое внедрение без кода | Ограниченная кастомизация, нагрузка |