WooCommerce: как добавить собственный тип доставки с динамическим расчетом стоимости

Диагностика задачи: зачем нужен собственный тип доставки в WooCommerce

Стандартные методы доставки WooCommerce покрывают большинство сценариев, но иногда требуется добавить уникальный тип доставки с собственным алгоритмом расчёта стоимости — например, доставка по зонам с учётом веса и времени суток. Такая задача требует создания собственного класса доставки и подключения его через хуки WooCommerce.

Пошаговое решение: создание и подключение собственного метода доставки

1. Создаём класс метода доставки

В файле functions.php вашей темы или в кастомном плагине добавьте следующий код:

if ( ! class_exists( 'WC_Custom_Shipping_Method' ) ) {
    class WC_Custom_Shipping_Method extends WC_Shipping_Method {
        public function __construct() {
            $this->id                 = 'custom_shipping';
            $this->method_title       = __( 'Custom Shipping', 'woocommerce' );
            $this->method_description = __( 'Custom Shipping Method with dynamic cost calculation', 'woocommerce' );
            $this->enabled            = 'yes';
            $this->title              = 'Custom Delivery';
            $this->init();
        }

        function init() {
            // Инициализация опций
            $this->init_form_fields();
            $this->init_settings();
            add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
        }

        public function calculate_shipping( $package = array() ) {
            $cost = 0;
            $weight = 0;
            foreach ( $package['contents'] as $item_id => $values ) {
                $_product = $values['data'];
                $weight += $_product->get_weight() * $values['quantity'];
            }

            // Пример: стоимость доставки зависит от веса
            if ( $weight <= 1 ) {
                $cost = 5;
            } elseif ( $weight <= 5 ) {
                $cost = 10;
            } else {
                $cost = 20;
            }

            // Добавим надбавку за вечернюю доставку (18:00-23:59)
            $hour = (int) current_time( 'H' );
            if ( $hour >= 18 && $hour <= 23 ) {
                $cost += 5;
            }

            $rate = array(
                'id'    => $this->id,
                'label' => $this->title,
                'cost'  => $cost,
                'calc_tax' => 'per_order'
            );

            // Регистрируем стоимость доставки
            $this->add_rate( $rate );
        }
    }
}

2. Регистрируем метод доставки в WooCommerce

Добавьте этот код для подключения метода доставки:

function add_custom_shipping_method( $methods ) {
    $methods['custom_shipping'] = 'WC_Custom_Shipping_Method';
    return $methods;
}
add_filter( 'woocommerce_shipping_methods', 'add_custom_shipping_method' );

3. Активация и настройка

Перейдите в WooCommerce -> Настройки -> Доставка. Создайте зону доставки (например, «Россия»), добавьте туда метод Custom Shipping и активируйте его. При оформлении заказа в зоне будет показываться ваш новый тип доставки с динамическим расчетом стоимости.

Проверка результата после внедрения

  • Добавьте в корзину товары с разным весом, проверьте, что стоимость доставки меняется согласно логике.
  • Оформите заказ в разное время суток, чтобы убедиться, что надбавка за вечернюю доставку учитывается.
  • Посмотрите страницу оформления заказа, метод доставки должен отображаться с корректной ценой.

Частые ошибки и как исправить

  • Метод не появляется в списке доставок – проверьте регистрацию класса и фильтр woocommerce_shipping_methods, а также активность метода в настройках.
  • Стоимость доставки всегда 0 – убедитесь, что функция calculate_shipping корректно вызывает $this->add_rate() с правильными параметрами.
  • Ошибка о неопределённом классе – подключите класс до регистрации метода, избегайте условий, которые блокируют загрузку.
  • Вес товаров не учитывается – проверьте, что у товаров заполнено поле веса; используйте методы get_weight() у объекта продукта.

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

  • Не используйте глобальные переменные, весь код должен быть инкапсулирован в классах и функциях.
  • Для сложных расчетов стоимости с внешними API выполняйте запросы с кешированием, чтобы не замедлять оформление заказа.
  • Не записывайте чувствительные данные в сессии или куки, используйте встроенные методы WooCommerce для хранения данных.
  • Тестируйте метод доставки на staging-среде, чтобы избежать сбоев на живом сайте.

Сравнение методов добавления доставки в WooCommerce

МетодПлюсыМинусыКогда использовать
Плагин готовыйБыстро, без кодаМожет не подходить под уникальные сценарииСтандартные задачи доставки
Кастомный класс доставкиПолный контроль, гибкостьТребует навыков разработкиУникальные требования к расчету стоимости
Хуки и фильтры для существующих методовПростая модификацияОграничена функционалом стандартных методовНезначительные изменения в логике
WooCommerce: Как изменить страницу «Спасибо» после оформления заказа
16.06.2026
Как изменить вывод CSS-классов в меню WordPress
12.11.2025
Как отключить autoload в WordPress для оптимизации базы данных
15.03.2026
WooCommerce: как удалить обязательное поле email при оформлении заказа
20.07.2026
Как настроить отложенный запуск Cron в WordPress без плагинов
12.01.2026