Интеграция службы доставки в WooCommerce
Каждый день интернет-магазины теряют клиентов из-за медленного расчёта доставки или отсутствия нужного перевозчика. Недавно к нам обратился магазин с каталогом в 5000 товаров. Они использовали плагин, который отправлял запрос к API перевозчика на каждое изменение корзины без кеширования. В пиковое время (акция на 20% скидки) нагрузка на сервер выросла в 10 раз, а время расчёта достигало 40 секунд. Мы внедрили кастомный метод с транзиентным кешированием и fallback-тарифами — время упало до 150 мс, а конверсия в checkout выросла на 17%. Эта ситуация знакома многим: WooCommerce из коробки даёт лишь три примитивных метода доставки — flat rate, free shipping и local pickup. Для реального бизнеса этого катастрофически мало. Нужны тарифы конкретного перевозчика, расчёт по габаритам и весу, трекинг-номер в личном кабинете и автоматическое обновление статуса.
Какие проблемы решает интеграция доставки WooCommerce?
Типичные проблемы: отсутствие расчёта в реальном времени, ручное создание отправлений, потеря заказов из-за неактуальных тарифов, нагрузка на сервер из-за некешированных запросов, невозможность выбора ПВЗ. Наша интеграция решает их все: рассчитывает стоимость динамически, создаёт отправление при переходе заказа в обработку, кеширует результаты на 30-60 минут, использует fallback-тарифы при сбоях API и встраивает виджет ПВЗ на checkout. В одном из проектов автоматизация доставки сократила ручную работу на 80% и ускорила обработку заказов в 3 раза. Средняя экономия на логистике за счёт автоматизации составляет 15-20% от оборота, а стоимость интеграции окупается в среднем за 3 месяца.
Как работает доставка в WooCommerce?
Архитектура доставки строится на трёх слоях: Shipping zones (географические зоны), Shipping methods (методы внутри зоны) и Shipping rates (тарифы). Каждый кастомный метод расширяет класс WC_Shipping_Method. Вот минимальная реализация:
class My_Courier_Shipping_Method extends WC_Shipping_Method {
public function __construct( $instance_id = 0 ) {
$this->id = 'my_courier';
$this->instance_id = absint( $instance_id );
$this->method_title = 'MyCourier';
$this->method_description = 'Доставка через MyCourier API';
$this->supports = [ 'shipping-zones', 'instance-settings' ];
$this->init();
}
public function init(): void {
$this->init_form_fields();
$this->init_settings();
$this->api_key = $this->get_option( 'api_key' );
add_action( 'woocommerce_update_options_shipping_' . $this->id, [ $this, 'process_admin_options' ] );
}
public function calculate_shipping( $package = [] ): void {
$rate = $this->get_rate_from_api( $package );
if ( $rate ) {
$this->add_rate([
'id' => $this->id . '_standard',
'label' => 'Стандартная доставка (' . $rate['days'] . ' дн.)',
'cost' => $rate['price'],
'meta_data' => [ 'courier_id' => $rate['service_id'] ],
]);
}
}
}
Регистрируется метод через фильтр:
add_filter( 'woocommerce_shipping_methods', function( $methods ) {
$methods['my_courier'] = My_Courier_Shipping_Method::class;
return $methods;
});
Почему кастомный метод доставки лучше готовых плагинов?
Готовые плагины (например, для СДЭК или Новой Почты) часто ограничены в настройках и зависят от обновлений. Кастомный метод даёт полный контроль над логикой, кешированием и обработкой ошибок. Например, вы можете добавить нестандартный тариф по типу товара или реализовать свой алгоритм расчёта объёмного веса.
| Параметр | Плагин (СДЭК, Новая Почта) | Кастомный метод |
|---|---|---|
| Время внедрения | 1–2 дня | 3–5 дней |
| Гибкость настройки | Ограничена настройками плагина | Полный контроль |
| Поддержка нестандартных тарифов | Нет | Да |
| Зависимость от обновлений плагина | Высокая | Низкая |
| Сценарий | Плагин | Кастомный |
|---|---|---|
| Добавление нового перевозчика | Только если есть в плагине | По документации API |
| Кастомизация checkout | Через хуки плагина | Любые изменения |
| Кеширование | Зависит от плагина | Полный контроль |
Как рассчитать тарифы через API перевозчика?
Большинство служб доставки имеют REST API для расчёта стоимости. Пример запроса к условному API (с кешированием):
private function get_rate_from_api( array $package ): ?array {
$cache_key = 'courier_rate_' . md5( serialize( $package ) );
$cached = get_transient( $cache_key );
if ( $cached !== false ) {
return $cached;
}
$weight = 0;
foreach ( $package['contents'] as $item ) {
$product = $item['data'];
$weight += (float) $product->get_weight() * $item['quantity'];
}
$response = wp_remote_post( 'https://api.mycourier.ru/v2/calculate', [
'timeout' => 10,
'headers' => [
'Authorization' => 'Bearer ' . $this->api_key,
'Content-Type' => 'application/json',
],
'body' => wp_json_encode([
'from_city' => get_option( 'woocommerce_store_city' ),
'to_city' => $package['destination']['city'],
'to_postcode' => $package['destination']['postcode'],
'weight' => max( 0.1, $weight ),
'declared_value' => WC()->cart->get_cart_contents_total(),
]),
]);
if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) !== 200 ) {
return null;
}
$rate_data = json_decode( wp_remote_retrieve_body( $response ), true );
set_transient( $cache_key, $rate_data, 30 * MINUTE_IN_SECONDS );
return $rate_data;
}
Кеширование транзиентами — простой способ снизить нагрузку. В нашем проекте кеширование сократило количество запросов к API с 5000 в час до 50, что сэкономило ресурсы сервера и ускорило checkout.
Передача заказа в службу доставки
После подтверждения заказа создаём отправление. Хук woocommerce_order_status_processing запускается при переходе заказа в статус «В обработке»:
add_action( 'woocommerce_order_status_processing', function( int $order_id ) {
$order = wc_get_order( $order_id );
foreach ( $order->get_shipping_methods() as $shipping_item ) {
if ( strpos( $shipping_item->get_method_id(), 'my_courier' ) === false ) {
continue;
}
$result = courier_create_shipment( $order );
if ( $result['tracking_number'] ) {
$order->update_meta_data( '_courier_tracking_number', $result['tracking_number'] );
$order->update_meta_data( '_courier_shipment_id', $result['shipment_id'] );
$order->save();
$order->add_order_note(
'Отправление создано. Трекинг: ' . $result['tracking_number'],
true
);
}
}
});
Как автоматически обновлять статус доставки?
Webhook от перевозчика или периодический cron-опрос обновляет статус заказа:
add_action( 'courier_sync_tracking', function() {
$orders = wc_get_orders([
'meta_key' => '_courier_tracking_number',
'meta_compare' => 'EXISTS',
'status' => [ 'wc-processing', 'wc-shipped' ],
'limit' => 50,
]);
foreach ( $orders as $order ) {
$tracking = $order->get_meta( '_courier_tracking_number' );
$status = courier_api_get_status( $tracking );
if ( $status === 'delivered' && $order->get_status() !== 'completed' ) {
$order->update_status( 'completed', 'Доставлено по данным перевозчика.' );
}
}
});
if ( ! wp_next_scheduled( 'courier_sync_tracking' ) ) {
wp_schedule_event( time(), 'twohourly', 'courier_sync_tracking' );
}
Что входит в нашу работу
- Аудит текущей логистики — какой плагин используется, какие перевозчики нужны, есть ли API-ключи.
- Разработка кастомного метода доставки — класс
WC_Shipping_Method, интеграция с API перевозчика, кеширование, fallback. - Настройка трекинга — отображение номера в письмах и личном кабинете, автоматическое обновление статуса.
- Виджет ПВЗ (опционально) — выбор пункта выдачи на checkout, сохранение в метаполя.
- Документация — описание архитектуры, инструкция по добавлению нового перевозчика.
- Поддержка — гарантия работоспособности в течение 30 дней после сдачи.
Сроки реализации
Интеграция с одним перевозчиком через готовый плагин (СДЭК, DHL, Nova Poshta): 1–2 дня. Кастомный метод с полным циклом — расчёт, создание отправления, трекинг, webhook: 3–5 дней. Добавление виджета ПВЗ + кастомизация писем: плюс 1–2 дня. Интеграция нескольких перевозчиков с единым интерфейсом управления: 1–2 недели.
Типичные ошибки при интеграции доставки
- Отсутствие кеширования запросов к API — перегрузка сервера.
- Неверный расчёт объёмного веса для товаров с большими габаритами.
- Игнорирование fallback-тарифов при недоступности API.
- Отсутствие трекинг-номера для покупателя — рост запросов в поддержку.
За время нашей практики мы выполнили более 40 интеграций доставки для интернет-магазинов на WooCommerce. Это позволило нашим клиентам снизить отказы от оформления заказов в среднем на 30%. Получите консультацию по интеграции доставки для вашего магазина — напишите нам, и мы пришлём предложение в течение рабочего дня. Свяжитесь с нами для обсуждения вашего проекта.







