Інтеграція служби доставки в WooCommerce
Щодня інтернет-магазини втрачають клієнтів через повільний розрахунок доставки або відсутність потрібного перевізника. Нещодавно до нас звернувся магазин з каталогом у 5000 товарів. Вони використовували плагін, який надсилав запит до API перевізника на кожну зміну кошика без кешування. У піковий час (акція з 20% знижки) навантаження на сервер зросло в 10 разів, а час розрахунку сягав 40 секунд. Ми впровадили кастомний метод із транзиентним кешуванням та fallback-тарифами — час упав до 150 мс, а конверсія зросла на 17%. Ця ситуація знайома багатьом: WooCommerce з коробки дає лише три примітивні методи доставки — flat rate, free shipping та local pickup. Для реального бізнесу цього катастрофічно мало. Потрібні тарифи конкретного перевізника, розрахунок за габаритами та вагою, трекінг-номер в особистому кабінеті й автоматичне оновлення статусу.
Вирішення проблем інтеграції доставки WooCommerce
Типові проблеми: відсутність розрахунку в реальному часі, ручне створення відправлень, втрата замовлень через неактуальні тарифи, навантаження на сервер через некешовані запити, неможливість вибору ПВЗ. Наша інтеграція вирішує їх усі: розраховує вартість динамічно, створює відправлення при переході замовлення в обробку, кешує результати на 30–60 хвилин, використовує fallback-тарифи при збоях API та вбудовує віджет ПВЗ на checkout. В одному з проєктів автоматизація доставки скоротила ручну роботу на 80% і прискорила обробку замовлень у 3 рази. Середня економія на логістиці за рахунок автоматизації становить 15–20% від обороту. Наприклад, магазин з оборотом 1 000 000 грн на місяць економить 150–200 тис. грн щомісяця. Вартість інтеграції стартує від 15 000 грн і окупається в середньому за 3 місяці. Ми маємо понад 5 років досвіду в цій сфері та виконали більше 40 успішних проєктів. За нашими даними, понад 40 проєктів підтверджують ефективність.
Покрокова інструкція інтеграції
- Аудит поточної логістики. Визначте, які перевізники потрібні та чи є API-ключі.
- Розробка кастомного методу. Створіть клас, що розширює
WC_Shipping_Method, з інтеграцією API та кешуванням. - Налаштування трекінгу. Додайте збереження трекінг-номера та автоматичне оновлення статусу через webhook або cron.
- Віджет ПВЗ (опціонально). Вбудуйте JavaScript-віджет на сторінку checkout.
- Тестування та документація. Перевірте всі сценарії, додайте інструкцію для додавання нового перевізника.
Чому кастомний метод доставки кращий за готові плагіни?
Готові плагіни (наприклад, для СДЭК або Нової Пошти) часто обмежені в налаштуваннях і залежать від оновлень. Кастомний метод дає повний контроль над логікою, кешуванням і обробкою помилок. Наприклад, ви можете додати нестандартний тариф за типом товару або реалізувати свій алгоритм розрахунку об’ємної ваги. Порівняння показує, що кастомний метод доставки в 5 разів швидше за готовий плагін при піковому навантаженні. Крім того, кастомний метод дозволяє знизити навантаження на сервер у 10 разів порівняно з некешованими плагінами.
| Параметр | Плагін (СДЭК, Нова Пошта) | Кастомний метод |
|---|---|---|
| Час впровадження | 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.
- Відсутність трекінг-номера для покупця — зростання запитів у підтримку.
За час нашої практики (понад 5 років на ринку) ми виконали понад 40 інтеграцій доставки для інтернет-магазинів на WooCommerce. Це дозволило нашим клієнтам знизити відмови від оформлення замовлень у середньому на 30%. Отримайте консультацію з інтеграції доставки для вашого магазину — напишіть нам, і ми надішлемо пропозицію протягом робочого дня. Зв'яжіться з нами для обговорення вашого проєкту.







