Диагностика задачи: зачем менять стоимость доставки программно
Часто в интернет-магазинах на WooCommerce требуется динамически изменять стоимость доставки в зависимости от различных факторов, например, веса заказа, суммы покупки, региона доставки или выбранного способа оплаты. Стандартные настройки WooCommerce не всегда позволяют реализовать гибкую логику, поэтому приходится подключать программные решения.
Как узнать, что стоимость доставки изменяется по умолчанию
- Перейдите в админке WooCommerce → Настройки → Доставка и проверьте методы доставки в нужных зонах.
- Создайте тестовый заказ с разными параметрами и посмотрите, меняется ли стоимость доставки.
- Если стоимость фиксирована или меняется только по тарифам, значит нужна кастомизация.
Пошаговое решение: программное изменение стоимости доставки в WooCommerce
1. Использование хука woocommerce_package_rates
Этот фильтр позволяет изменять расчёт стоимости доставки перед выводом пользователю. Ниже пример кода, который уменьшает стоимость доставки на 50%, если сумма корзины больше 5000 рублей.
add_filter('woocommerce_package_rates', 'custom_change_shipping_cost', 10, 2);
function custom_change_shipping_cost($rates, $package) {
$cart_total = WC()->cart->get_subtotal();
if ($cart_total > 5000) {
foreach ($rates as $rate_key => $rate) {
$rates[$rate_key]->cost = $rate->cost / 2;
// Если есть дополнительные налоги, их тоже нужно перерасчитать
if (!empty($rates[$rate_key]->taxes)) {
foreach ($rates[$rate_key]->taxes as $tax_id => $tax_amount) {
$rates[$rate_key]->taxes[$tax_id] = $tax_amount / 2;
}
}
}
}
return $rates;
}2. Изменение стоимости доставки в зависимости от региона
Если нужно менять стоимость доставки для определённых регионов (например, Москва и МО), используйте условие по стране и городу:
add_filter('woocommerce_package_rates', 'custom_shipping_by_region', 10, 2);
function custom_shipping_by_region($rates, $package) {
$destination = $package['destination'];
if ($destination['state'] === 'MOW' && in_array(strtolower($destination['city']), ['moskva', 'moscow'])) {
foreach ($rates as $rate_key => $rate) {
$rates[$rate_key]->cost += 100; // добавляем 100 рублей к стоимости
}
}
return $rates;
}Как проверить, что решение сработало
- Перейдите на страницу корзины или оформления заказа.
- Измените сумму товаров, чтобы она была как меньше, так и больше 5000 рублей.
- Обратите внимание на стоимость доставки — она должна изменяться согласно логике.
- Для региональных изменений измените адрес доставки на Москву или другой город и проверьте изменение стоимости.
Частые ошибки и как их исправить
- Изменения не применяются: Убедитесь, что ваш код подключён в functions.php активной темы или в кастомном плагине.
- Стоимость доставки не пересчитывается: Проверьте, что вы используете правильный хук
woocommerce_package_ratesс приоритетом 10 и что он возвращает изменённый массив. - Некорректные налоги после изменения стоимости: Обязательно перерасчитывайте налоги, если у метода доставки они есть.
- Конфликты с плагинами доставки: Некоторые плагины могут перезаписывать стоимость, попробуйте увеличить приоритет фильтра.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы к базе данных внутри фильтра — код должен работать быстро, так как вызывается на каждом обновлении корзины.
- Для сложной логики используйте кэширование результатов расчётов, если возможно.
- Проверяйте данные из
$package['destination']на корректность, чтобы избежать ошибок при пустых или некорректных адресах. - При работе с налогами будьте внимательны, чтобы не нарушить законодательство и корректно рассчитывать итоговую стоимость.
Сравнение вариантов изменения стоимости доставки
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Настройки через WooCommerce | Просто, без кода | Ограниченные условия | Для стандартных тарифов |
Фильтр woocommerce_package_rates |
Гибкость, точное управление | Требует навыков разработки | Динамическое изменение по условиям |
| Плагины доставки (например, Table Rate Shipping) | Расширенные условия, UI для настройки | Зависимость от сторонних решений, стоимость | Сложные правила без кода |