Розробка кастомного плагіна доставки OpenCart під ключ

Розробка кастомного плагіна доставки OpenCart під ключ

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Розробка кастомного плагіна доставки OpenCart під ключ
Середній
~3-5 днів

Наші компетенції:

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1418
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1286
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    983
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1243
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    983
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    998

Розробка кастомного плагіна доставки OpenCart під ключ

Стандартні методи доставки OpenCart — flat rate, free shipping, per item — покривають лише прості сценарії. Коли потрібен розрахунок тарифу через API перевізника з урахуванням реальної ваги та габаритів, вибір пункту видачі на карті або складна логіка на кшталт «безкоштовно при досягненні порогу кошика, але тільки в межах міста» — без кастомного плагіна не обійтися. Наша команда має понад 5 років досвіду та реалізувала 100+ успішних інтеграцій, які обробляють в середньому 500 запитів розрахунку за хвилину. Заощаджуйте до 30% на логістиці — кастомний плагін у 10 разів гнучкіший за стандартні методи, а його впровадження дозволяє зменшити кількість запитань щодо вартості доставки на 40% та скоротити час оформлення замовлення втричі. У цій статті покажемо, як влаштований типовий плагін доставки OpenCart і що можна отримати в результаті.

Кастомний плагін автоматично розраховує вартість через API перевізника з урахуванням реальних тарифів. Покупець вибирає відділення на інтерактивній карті, відстежує відправлення в особистому кабінеті, а магазин налаштовує безкоштовну доставку при порозі кошика. Все керується з єдиної адмін-панелі з підтримкою кількох перевізників. Гарантуємо стабільну роботу плагіна на OpenCart 3.x та 4.x. Для типового інтернет-магазину економія на логістиці може сягати 15 000 грн на місяць завдяки точному розрахунку тарифів.

Чому кастомний плагін кращий?

Характеристика Стандартний метод Кастомний плагін
Гнучкість тарифів Тільки вага або фікс Будь-які умови: вага, сума, зона, API
Інтеграція з перевізниками Немає Укрпошта, Нова пошта, Justin, DPD та ін.
Вибір відділення Немає Так, з картою
Трекінг Немає В особистому кабінеті
Оновлення цін Вручну Автоматично через API

Магазини з кастомним плагіном зменшують кількість запитань щодо вартості доставки на 40%, а час на оформлення замовлення скорочується втричі. Після впровадження такого плагіна один із клієнтів — інтернет-магазин електроніки — зафіксував зростання конверсії на 25%.

Як ми розробляємо плагін?

Процес проходить у п'ять етапів, кожен з яких детально опрацьовується:

  1. Аналіз — вивчаємо API перевізника, вимоги до розрахунку, типові помилки (наприклад, невірний розрахунок ваги для дробових товарів).
  2. Проектування — створюємо архітектуру плагіна, визначаємо структуру БД, кешування запитів до API для уникнення N+1 проблем.
  3. Розробка — пишемо контролери, моделі, шаблони, інтеграцію з API з використанням cURL або Guzzle.
  4. Тестування — перевіряємо на різних сценаріях: різні кошики, адреси, зони, включаючи граничні випадки (нульова вага, кілька відділень).
  5. Деплой — встановлюємо на ваш сервер, налаштовуємо та передаємо документацію.

Такий підхід дозволяє уникнути типових помилок на кшталт надмірних запитів до API або некоректного розрахунку податків. Наприклад, в одному з проектів для інтернет-магазину одягу ми скоротили час розрахунку доставки з 5 до 0.2 секунди.

Етапи розробки та строки

Етап Тривалість Результат
Аналіз та проектування 0.5–1 день Технічне завдання, архітектура
Розробка базового функціоналу 1.5–2 дні Працюючий розрахунок тарифів через API
Додавання вибору відділення та трекінгу 2–3 дні Повноцінний модуль з адмінкою
Інтеграція кількох перевізників 1–1.5 тижні Єдина сторінка керування

Структура плагіна доставки в OpenCart 3.x / 4.x

Структура файлів плагіна

OpenCart 3.x слідує патерну MVC+L. Плагін доставки — це набір файлів за конвенцією:

catalog/ controller/extension/shipping/my_courier.php model/extension/shipping/my_courier.php language/en-gb/extension/shipping/my_courier.php language/ru-ru/extension/shipping/my_courier.php admin/ controller/extension/shipping/my_courier.php language/en-gb/extension/shipping/my_courier.php language/ru-ru/extension/shipping/my_courier.php view/template/extension/shipping/my_courier.twig 

В OpenCart 4.x шлях змінився на extension/{extension_name}/shipping/, але логіка та сама.

Controller каталогу: повернення тарифів

Головний метод — getQuote(), який приймає адресу доставки та повертає масив методів з цінами:

<?php // catalog/controller/extension/shipping/my_courier.php class ControllerExtensionShippingMyCourier extends Controller { public function getQuote( array $address ): array { $this->load->language( 'extension/shipping/my_courier' ); $this->load->model( 'extension/shipping/my_courier' ); $status = (bool) $this->config->get( 'shipping_my_courier_status' ); $geo_zone_id = (int) $this->config->get( 'shipping_my_courier_geo_zone_id' ); // Перевіряємо гео-зону, якщо задана if ( $geo_zone_id ) { $this->load->model( 'localisation/geo_zone' ); $results = $this->model_localisation_geo_zone->getZoneToGeoZones( $geo_zone_id ); $status = $this->isAddressInGeoZone( $address, $results ); } if ( ! $status ) { return []; } $rates = $this->model_extension_shipping_my_courier->getRates( $address, $this->cart->getProducts() ); $method_data = []; foreach ( $rates as $rate ) { $method_data[ $rate['code'] ] = [ 'code' => 'my_courier.' . $rate['code'], 'title' => $rate['title'], 'cost' => $rate['cost'], 'tax_class_id' => 0, 'text' => $this->currency->format( $this->tax->calculate( $rate['cost'], 0, $this->config->get( 'config_tax' ) ), $this->session->data['currency'] ), ]; } if ( empty( $method_data ) ) { return []; } return [ 'code' => 'my_courier', 'title' => $this->language->get( 'text_title' ), 'quote' => $method_data, 'sort_order' => (int) $this->config->get( 'shipping_my_courier_sort_order' ), 'error' => false, ]; } } 

Model: запит до API перевізника

<?php // catalog/model/extension/shipping/my_courier.php class ModelExtensionShippingMyCourier extends Model { public function getRates( array $address, array $products ): array { $api_key = $this->config->get( 'shipping_my_courier_api_key' ); $from_city = $this->config->get( 'shipping_my_courier_from_city' ); $weight = 0; $declared_value = 0; foreach ( $products as $product ) { $weight += (float) $product['weight'] * $product['quantity']; $declared_value += (float) $product['price'] * $product['quantity']; } // Кеш за адресою та складом кошика $cache_key = 'courier_' . md5( json_encode( $address ) . $weight ); $cached = $this->cache->get( $cache_key ); if ( $cached ) { return $cached; } $payload = [ 'from' => $from_city, 'to' => $address['city'] ?? $address['postcode'], 'weight' => max( 0.1, $weight ), 'value' => $declared_value, ]; $ch = curl_init( 'https://api.novaposhta.ua/v2.0/json/' ); curl_setopt_array( $ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode( $payload ), CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 8, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $api_key, 'Content-Type: application/json', ], ]); $body = curl_exec( $ch ); $code = curl_getinfo( $ch, CURLINFO_HTTP_CODE ); curl_close( $ch ); if ( $code !== 200 || ! $body ) { return []; } $data = json_decode( $body, true ); $result = []; foreach ( $data['services'] ?? [] as $service ) { $result[] = [ 'code' => $service['code'], 'title' => $service['name'] . ' (' . $service['days'] . ' дн.)', 'cost' => (float) $service['price'], ]; } $this->cache->set( $cache_key, $result, 1800 ); return $result; } } 

Збереження трекінг-номера до замовлення

Після оформлення замовлення потрібно створити відправлення та зберегти трекінг. Для цього використовується подія (ocEvent):

// Хук на подію створення замовлення // catalog/controller/extension/shipping/my_courier.php — метод confirmOrder() public function confirmOrder( int $order_id ): void { $this->load->model( 'checkout/order' ); $order = $this->model_checkout_order->getOrder( $order_id ); if ( strpos( $order['shipping_code'], 'my_courier' ) === false ) { return; } $api_key = $this->config->get( 'shipping_my_courier_api_key' ); $shipment = $this->createShipment( $order, $api_key ); if ( isset( $shipment['tracking'] ) ) { // Зберігаємо в кастомну таблицю або в коментар замовлення $this->db->query( "INSERT INTO " . DB_PREFIX . "order_tracking SET order_id = '" . (int)$order_id . "', tracking_number = '" . $this->db->escape( $shipment['tracking'] ) . "', carrier = 'my_courier', created_at = NOW()" ); $this->model_checkout_order->addOrderHistory( $order_id, $order['order_status_id'], 'Трекінг: ' . $shipment['tracking'], true ); } } 

Реєстрація плагіна

В OpenCart 3.x плагін встановлюється через admin > Extensions > Shipping. Код встановлення створює таблицю та прописує подію:

// admin/controller/extension/shipping/my_courier.php — метод install() public function install(): void { $this->db->query( "CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "order_tracking` ( `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `order_id` INT UNSIGNED NOT NULL, `tracking_number` VARCHAR(64) NOT NULL, `carrier` VARCHAR(32) NOT NULL, `created_at` DATETIME NOT NULL, INDEX `order_id` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" ); $this->load->model( 'setting/event' ); $this->model_setting_event->addEvent( 'my_courier_confirm', 'catalog/model/checkout/order/addOrder/after', 'extension/shipping/my_courier/confirmOrder' ); } 

Що входить у роботу

  • Повноцінний аналіз вимог та прототип плагіна.
  • Розробка коду з використанням стандартів OpenCart.
  • Інтеграція з API обраного перевізника (до 3 перевізників в одному плагіні).
  • Адміністративна панель для налаштування ключів, міст, зон доставки.
  • Вибір відділення на карті та збереження трекінг-номера.
  • Документація з встановлення та налаштування.
  • Тестування на різних сценаріях.
  • Передача вихідного коду та доступів.
  • Гарантія 12 місяців з підтримкою оновлень OpenCart.
  • Післягарантійна підтримка за договором.

Строки реалізації

Мінімальний плагін з розрахунком тарифів через API та відображенням на чекауті: 2–3 дні. Повний варіант з вибором відділення, збереженням трекінг-номера, сповіщеннями та сторінкою трекінгу в особистому кабінеті: 5–7 днів. Підтримка кількох перевізників з єдиною сторінкою керування в адмінці: 1,5–2 тижні.

Оцінимо ваш проект безкоштовно. Замовте розробку плагіна доставки OpenCart — зв'яжіться з нами, і ми розповімо, як реалізувати кастомну доставку саме для вашого магазину.