WordPress · 7 мин чтения

Доставка в WooCommerce: зоны, тарифы и подключение служб

Настройка доставки в WooCommerce у большинства интернет-магазинов сводится к трём слоям: зоны (кому и куда вообще можно доставить), тарифы внутри зоны (сколько это стоит) и подключение служб доставки, которые считают стоимость и печатают этикетки за вас. На практике где-то на третьем проекте начинаешь понимать, что дефолтных настроек WooCommerce хватает только для магазина с доставкой по одному городу фиксированной ценой, а дальше приходится разбираться в приоритете зон, классах доставки и API курьерских служб.

Как работают зоны доставки в WooCommerce

WooCommerce → Настройки → Доставка → Зоны доставки. Каждая зона это набор стран, регионов или почтовых индексов плюс список методов доставки, которые к ней привязаны. Логика простая, но именно на ней спотыкается большинство: зоны проверяются сверху вниз по списку, и заказ попадает в первую подходящую, остальные ниже не учитываются вообще.

Пример из практики: магазин с доставкой по Москве курьером за 300 ₽ и по остальной России Почтой России или СДЭК. Если зону «Россия» (страна целиком) поставить выше зоны «Москва» (регион), заказы из Москвы будут улетать в первую зону и терять курьерский тариф, потому что страна «Россия» тоже покрывает Москву. Правильный порядок: сначала самая узкая зона (город, регион, набор индексов), потом более широкая, а внизу зона «Rest of the World» на случай, если покупатель как-то оформит заказ из региона, который не предусмотрели.

Зона без единого метода доставки внутри - это тупик: покупатель дойдёт до оформления заказа и не увидит вариантов доставки вообще, просто пустой блок. Такое я видел на паре магазинов после того, как разработчик добавил новый регион в существующую зону, но забыл, что метод доставки привязан к конкретному классу товара, которого в списке стран для этого региона не было.

Тарифы доставки: какие есть в WooCommerce и когда что ставить

Из коробки в WooCommerce четыре типа методов: Flat rate (фиксированная цена, можно завязать на класс доставки), Free shipping (бесплатная доставка по условию, обычно от суммы заказа), Local pickup (самовывоз) и Local delivery в некоторых сборках. Дальше это дополняется классами доставки (Shipping classes) - можно назначить тяжёлым или крупногабаритным товарам отдельный тариф поверх базового.

Тип тарифа Когда ставить Ограничение
Flat rate фиксированная цена для зоны, часто с надбавкой по классу товара не учитывает реальный вес заказа без настройки классов доставки
Free shipping доставка бесплатна от суммы заказа или по купону нужно считать, окупает ли это средний чек
Local pickup самовывоз со склада или из шоурума требует ручного контроля наличия на конкретной точке
Тариф по API службы доставки стоимость считается в реальном времени по весу, габаритам и адресу нужен плагин или кастомная интеграция, дольше настройка

Для магазина с товарами разного веса (одежда и, скажем, мебель в одном каталоге) фиксированная цена почти всегда либо режет маржу на тяжёлых заказах, либо переплачивает покупатель на лёгких. Здесь работает комбинация: Flat rate по классам для типовых позиций плюс отдельный тариф или ручная обработка для нестандартных габаритов.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Подключение служб доставки: СДЭК, Boxberry, Почта России

Три сценария, которые встречаются чаще всего.

Готовый плагин. Для СДЭК есть официальный плагин «CDEK для WooCommerce», для Boxberry тоже свой модуль - оба добавляют виджет выбора пункта выдачи прямо в корзину и на странице оформления заказа, тянут тариф через API службы по весу и адресу. Настройка занимает 3-5 часов вместе с проверкой тестовых заказов и печатью первой накладной, если магазин уже сведён по товарным весам и габаритам в карточках.

Ручной ввод адреса без виджета. Работает, если магазин небольшой и доставку считает менеджер вручную после звонка покупателю, тогда достаточно поля «Комментарий к заказу» и фиксированного тарифа, интеграция по API не нужна.

Комбинация с эквайрингом. На проектах с оплатой через T‑Bank (Тинькофф) периодически ловил конфликт кеширующих плагинов (WP Rocket, LiteSpeed Cache) с AJAX-пересчётом доставки: страница корзины кешируется целиком, и стоимость доставки не обновляется при смене адреса, пока кеш не сбросится. Решение - исключить страницы корзины и оформления заказа из кеша на уровне плагина, это стандартная настройка почти у всех кеш-плагинов под WooCommerce.

Отдельный момент по персональным данным: адрес и телефон покупателя, которые уходят в CRM или таблицу для расчёта логистики, по 152-ФЗ должны храниться на серверах в России. Если для передачи заказов курьерской службе или в CRM используется связка на n8n, сценарий стоит собирать так, чтобы вебхуки и база данных были на российском хостинге, а не в зарубежном облаке.

Расчёт стоимости доставки в реальном времени и кастомная логика

Плагинов служб доставки хватает, пока правила простые: вес, габариты, адрес, доставка либо есть, либо её нет. Проблемы начинаются, когда логика завязана на что-то, чего плагин не умеет: разные склады отгрузки в зависимости от наличия товара, комбинированный тариф «самовывоз бесплатно, курьер по весу», скидка на доставку для оптовых покупателей.

Для таких случаев в functions.php добавляют фильтр woocommerce_package_rates - он даёт доступ к списку рассчитанных тарифов перед показом покупателю и даёт возможность убрать или подменить любой из них по условию:

add_filter( 'woocommerce_package_rates', function( $rates, $package ) {
    $weight = WC()->cart->get_cart_contents_weight();

    if ( $weight > 30 && isset( $rates['local_pickup:1'] ) ) {
        unset( $rates['local_pickup:1'] );
    }

    return $rates;
}, 10, 2 );

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

Если готовые плагины не считают доставку так, как нужно магазину (например, тариф зависит от склада отгрузки или сочетания регион, вес и объём заказа), обычно быстрее заказать разработку кастомной логики расчёта доставки под конкретные правила, чем городить это через десяток условий в стандартном конструкторе тарифов.

Частые ошибки при настройке доставки в WooCommerce

Неправильный порядок зон. Уже разбирал выше: широкая зона выше узкой перехватывает заказы, и специальный тариф просто не показывается покупателю.

Товары без веса и габаритов. Тарифы по API считают стоимость по факту заполненных полей «Вес» и «Размеры» в карточке товара. Если карточки заводили без них (обычно при быстром импорте из Excel или с другой площадки), служба доставки либо выдаёт ошибку расчёта, либо ставит стоимость по дефолтным значениям, которые почти всегда занижены.

Кеш ломает пересчёт при смене адреса. Симптом: покупатель меняет город в корзине, а сумма доставки не меняется, пока не обновит страницу вручную. Причина в девяти случаях из десяти - агрессивное кеширование фрагментов страницы, которое не исключает AJAX-запросы WooCommerce.

Тестовые заказы не отражают боевую логистику. После смены весов товаров или добавления нового региона стоит оформить пробный заказ по каждому сценарию (свой регион, соседний регион, самовывоз, доставка по весу выше и ниже порога бесплатной доставки), а не полагаться на то, что настройка сохранилась правильно.

Сравнение вариантов подключения доставки

Вариант Срок настройки Когда оправдан
Фиксированный тариф без API 30-60 минут небольшой каталог, доставка по одному-двум регионам
Готовый плагин службы доставки 3-5 часов стандартная логика, покрывается функциями плагина
Кастомная интеграция под задачу от нескольких дней нестандартные правила: склады, скидки, комбинированные условия

Расходы на хостинг, домен и сертификат от типа магазина не зависят и добавляются к любому из вариантов одинаково: домен в зоне .ru стоит от 200 ₽ в год, SSL-сертификат чаще всего входит в тариф хостинга или обходится в несколько сотен рублей отдельно, а комиссия эквайринга определяется тарифом банка, а не тем, как настроена доставка на сайте.

Частые вопросы

Как сделать бесплатную доставку от определённой суммы заказа?

В настройках зоны добавляете метод Free shipping и указываете условие «Минимальная сумма заказа». Если бесплатная доставка должна работать только вместе с определённым способом оплаты или купоном, придётся дописать проверку через фильтр woocommerce_package_rates, потому что из коробки такой комбинации условий нет.

Можно ли показать виджет выбора пункта выдачи СДЭК прямо в корзине?

Да, официальный плагин СДЭК для WooCommerce добавляет карту с пунктами выдачи на странице оформления заказа, покупатель выбирает точку без ввода адреса вручную. У Boxberry аналогичный виджет есть в их модуле.

Почему стоимость доставки не пересчитывается при смене адреса?

Чаще всего дело в кеширующем плагине, который сохраняет страницу корзины целиком и не пропускает AJAX-запрос пересчёта. Нужно добавить страницы корзины и оформления заказа в исключения кеша, у большинства кеш-плагинов такая настройка есть в разделе «Исключения» или «Cache Exclusion».

Сколько стоит настройка доставки в WooCommerce под ключ?

Если магазин уже собран и нужна только настройка зон, тарифов и подключение одной-двух служб доставки, это укладывается в разовую доработку от 15 000 ₽ как техническая поддержка проекта. Если нужен магазин целиком вместе с доставкой, эквайрингом и каталогом, актуальнее считать это как интернет-магазин под ключ - от 80 000 ₽.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно