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

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

В 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;
}

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

  1. Добавьте код в functions.php или плагин.
  2. Откройте страницу корзины или оформления заказа на сайте.
  3. Измените сумму товаров, чтобы попасть в разные диапазоны (например, меньше и больше 3000 или 5000 рублей).
  4. Убедитесь, что стоимость доставки обновилась согласно логике кода (увеличена на 200 рублей или стала бесплатной).
  5. Проверьте, что доставка отображается корректно во всех случаях, включая налоги и дополнительные сборы.

Частые ошибки при изменении стоимости доставки через хуки WooCommerce

  • Код не работает после обновления корзины: нужно убедиться, что код подключен правильно и фильтр добавлен с приоритетом 10 и двумя аргументами.
  • Налоги не пересчитываются: при изменении стоимости доставки отдельно нужно обработать налоги в объекте $rates[$rate_key]->taxes.
  • Конфликт с другими плагинами доставки: некоторые плагины могут переопределять стоимость, тогда фильтр нужно применять с более высоким приоритетом.
  • Стоимость доставки не меняется для разных регионов: проверьте, что условие учитывает данные по региону в $package.

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

  • Не используйте дорогостоящие запросы к базе или внешним API в фильтре woocommerce_package_rates, так как он вызывается при каждом обновлении корзины и оформлении заказа.
  • Кешируйте вычисления, если они сложные, например, через Transients API.
  • Проверяйте, что код работает только на фронтенде и в нужных условиях, чтобы не создавать нагрузку в админке.
  • Всегда тестируйте изменения на тестовой среде перед выпуском на рабочий сайт.

Сравнение способов изменения стоимости доставки

МетодПреимуществаНедостатки
Использование фильтра woocommerce_package_ratesГибкость, полное управление тарифами, код в теме или плагинеТребует программирования, может конфликтовать с плагинами доставки
Плагины для расчёта доставки (например, Table Rate Shipping)Простота настройки, готовый функционалМогут быть платными, ограничены в кастомизации
Настройки WooCommerce (бесплатная доставка, фиксированные тарифы)Быстро и простоНет гибкости для сложных условий
Как использовать WPRemark для автоматического отзыва на сайте WordPress
22.03.2026
Как использовать WP_Temp для работы с временными данными в WordPress
15.04.2026
Как удалить мета данные при удаленном удалении записей в WordPress
24.12.2025
Как настроить безопасные AJAX-запросы в WordPress
07.03.2026
Как удалить старые версии постов в WordPress
24.02.2026