Диагностика задачи: зачем менять цену товара программно
В WooCommerce есть встроенные возможности для скидок и акций, но иногда требуется изменить цену товара динамически по сложным условиям, например, основываясь на дате, количестве в корзине, пользовательской роли или других параметрах. Это нельзя сделать через стандартные купоны или правила скидок. В таких случаях нужно вмешательство через код.
Как реализовать автоматическую корректировку цены товара
Использование хука woocommerce_before_calculate_totals
Этот хук позволяет изменить цену товара перед подсчетом общей суммы корзины. Важно корректно изменить цену в объекте товара в корзине, чтобы WooCommerce правильно применил изменения.
add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_adjustment', 20, 1);
function custom_dynamic_price_adjustment($cart) {
if (is_admin() && !defined('DOING_AJAX')) {
return;
}
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
// Пример условия: изменить цену для пользователя с ролью 'wholesale_customer'
if (current_user_can('wholesale_customer')) {
$new_price = $product->get_regular_price() * 0.8; // скидка 20%
$product->set_price($new_price);
}
// Пример условия: если в корзине больше 5 единиц этого товара, цена уменьшается
if ($cart_item['quantity'] > 5) {
$discounted_price = $product->get_regular_price() * 0.9; // скидка 10%
$product->set_price($discounted_price);
}
// Можно добавлять дополнительные условия здесь
}
}
Обработка даты или других параметров
Для динамических условий можно использовать любой PHP-код внутри функции, например, менять цену в праздничные дни, или если сегодня определенная дата:
if (date('m-d') === '12-31') { // 31 декабря
$product->set_price($product->get_regular_price() * 0.5); // 50% скидка
}
Проверка результата после внедрения
- Добавьте в корзину товар и проверьте изменение цены в зависимости от условий (роль пользователя, количество товара, дата).
- Проверьте, что итоговые суммы и цены на странице корзины и оформления заказа соответствуют расчетам.
- Обязательно протестируйте работу в разных браузерах и с выключенными кэшами.
- Проверьте, что при отключении вашего кода цены возвращаются к обычным.
Частые ошибки и как их исправить
- Изменение цены не применяется: проверьте, что хук добавлен с правильным приоритетом, и что вы меняете цену именно у объекта
$cart_item['data']. - Цена меняется некорректно для всех товаров: убедитесь, что условия корректно фильтруют нужные товары.
- Изменения не видны на фронтенде: очистите кэш WooCommerce и браузера, отключите плагины кэширования для теста.
- Конфликт с другими плагинами скидок: проверьте последовательность вызова хука и взаимодействие с другими плагинами.
Практические советы по безопасности и производительности
- Не делайте тяжелых запросов к базе или API внутри функции изменения цены — это замедлит процесс оформления заказа.
- Используйте кэширование результатов, если условия сложные и требуют вычислений.
- Проверяйте, что пользовательские данные (например, роль) корректно получены и не вызывают ошибок.
- Всегда проверяйте, что изменения цены не нарушают логику WooCommerce и не вызывают ошибок при оплате.
Сравнение способов реализации изменения цены
| Метод | Плюсы | Минусы |
|---|---|---|
Использование хука woocommerce_before_calculate_totals | Гибкость, полностью программируемо, подходит для любых условий | Требует навыков PHP, возможны ошибки при некорректном коде |
| Плагины скидок и акций | Удобный интерфейс, готовые решения | Могут не поддерживать сложные условия, ограничены функционалом |
| Использование купонов WooCommerce | Простая настройка, встроено в WooCommerce | Мало опций для автоматизации, требует ручного ввода пользователем |