Диагностика задачи: зачем менять стоимость доставки программно
В WooCommerce стоимость доставки часто задается статически или через настройки плагина доставки. Но в реальных проектах часто требуется изменять стоимость динамически в зависимости от веса, стоимости корзины, региона покупателя или других условий. Например, бесплатная доставка при сумме заказа выше 5000 рублей или дополнительная плата за удалённые регионы. Изменение вручную неудобно и не масштабируемо — нужна автоматизация.
Основные WooCommerce хуки для изменения стоимости доставки
Для изменения стоимости доставки используйте фильтр woocommerce_package_rates. Он позволяет получить массив доступных тарифов доставки и изменить их стоимость перед выводом на страницу оформления заказа.
Другие полезные хуки:
woocommerce_cart_shipping_packages— для настройки пакетов доставки;woocommerce_shipping_methods— для регистрации и изменения методов доставки;woocommerce_checkout_update_order_review— для обновления данных при изменениях на странице оформления.
Пошаговое решение: динамическое изменение стоимости доставки
Пример: добавим 200 рублей к стоимости доставки, если сумма корзины меньше 3000 рублей.
add_filter('woocommerce_package_rates', 'custom_adjust_shipping_cost', 10, 2);
function custom_adjust_shipping_cost( $rates, $package ) {
$cart_total = WC()->cart->get_subtotal();
foreach ( $rates as $rate_key => $rate ) {
if ( $cart_total < 3000 ) {
$rates[$rate_key]->cost += 200; // Добавляем 200 рублей
// Если есть налоги, корректируем их тоже
if ( isset( $rates[$rate_key]->taxes ) && ! empty( $rates[$rate_key]->taxes ) ) {
foreach ( $rates[$rate_key]->taxes as $tax_id => $tax_amount ) {
$rates[$rate_key]->taxes[$tax_id] += 0; // Можно добавить логику расчета налогов
}
}
}
}
return $rates;
}Этот код добавьте в functions.php вашей темы или в кастомный плагин.
Дополнительный пример: бесплатная доставка при сумме заказа от 5000 рублей
add_filter('woocommerce_package_rates', 'custom_free_shipping_threshold', 10, 2);
function custom_free_shipping_threshold( $rates, $package ) {
$cart_total = WC()->cart->get_subtotal();
if ( $cart_total >= 5000 ) {
foreach ( $rates as $rate_key => $rate ) {
if ( 'free_shipping' === $rate->method_id ) {
$rates = array( $rate_key => $rate ); // Оставляем только бесплатную доставку
break;
}
}
}
return $rates;
}Как проверить, что изменение стоимости доставки работает
- Добавьте код в functions.php или плагин.
- Откройте страницу корзины или оформления заказа на сайте.
- Измените сумму товаров, чтобы попасть в разные диапазоны (например, меньше и больше 3000 или 5000 рублей).
- Убедитесь, что стоимость доставки обновилась согласно логике кода (увеличена на 200 рублей или стала бесплатной).
- Проверьте, что доставка отображается корректно во всех случаях, включая налоги и дополнительные сборы.
Частые ошибки при изменении стоимости доставки через хуки WooCommerce
- Код не работает после обновления корзины: нужно убедиться, что код подключен правильно и фильтр добавлен с приоритетом 10 и двумя аргументами.
- Налоги не пересчитываются: при изменении стоимости доставки отдельно нужно обработать налоги в объекте
$rates[$rate_key]->taxes. - Конфликт с другими плагинами доставки: некоторые плагины могут переопределять стоимость, тогда фильтр нужно применять с более высоким приоритетом.
- Стоимость доставки не меняется для разных регионов: проверьте, что условие учитывает данные по региону в
$package.
Практические советы по безопасности и производительности
- Не используйте дорогостоящие запросы к базе или внешним API в фильтре
woocommerce_package_rates, так как он вызывается при каждом обновлении корзины и оформлении заказа. - Кешируйте вычисления, если они сложные, например, через Transients API.
- Проверяйте, что код работает только на фронтенде и в нужных условиях, чтобы не создавать нагрузку в админке.
- Всегда тестируйте изменения на тестовой среде перед выпуском на рабочий сайт.
Сравнение способов изменения стоимости доставки
| Метод | Преимущества | Недостатки |
|---|---|---|
Использование фильтра woocommerce_package_rates | Гибкость, полное управление тарифами, код в теме или плагине | Требует программирования, может конфликтовать с плагинами доставки |
| Плагины для расчёта доставки (например, Table Rate Shipping) | Простота настройки, готовый функционал | Могут быть платными, ограничены в кастомизации |
| Настройки WooCommerce (бесплатная доставка, фиксированные тарифы) | Быстро и просто | Нет гибкости для сложных условий |