שיטות המשלוח הסטנדרטיות של OpenCart — תעריף קבוע, משלוח חינם, פר פריט — מכסות רק תרחישים פשוטים. כאשר אתה צריך חישוב תעריף דרך API של חברת השילוח תוך התחשבות במשקל ובמידות בפועל, בחירת נקודת איסוף על מפה, או לוגיקה מורכבת כמו "משלוח חינם מעל סף הזמנה אבל רק בתוך העיר" — תוסף משלוח מותאם אישית הוא חיוני. עם ניסיון של למעלה מעשור ומאות אינטגרציות מוצלחות, טיפלנו במשימות כמו אינטגרציות עם דואר רוסי, CDEK, Boxberry, ושירותי שליחויות פנימיים. תוסף המשלוח המותאם אישית שלנו ל-OpenCart מעבד בממוצע 500 בקשות תעריף לדקה. מאמר זה מראה כיצד מודול משלוח טיפוסי בנוי ואילו תוצאות ניתן להשיג.
תוסף מותאם אישית גמיש פי 10 משיטות סטנדרטיות: הוא מחשב אוטומטית עלות דרך API של חברת השילוח תוך שימוש בתעריפים אמיתיים, לא ממוצעים. בנוסף, הלקוח יכול לבחור נקודת איסוף על מפה אינטראקטיבית, לעקוב אחר משלוחים בחשבון שלו, והחנות יכולה להגדיר משלוח חינם בסף עגלה. הכל מנוהל מפאנל ניהול אחד עם תמיכה במספר חברות שילוח. אנו מבטיחים פעולה יציבה על OpenCart 3.x ו-4.x.
כיצד אנו מפתחים את התוסף?
התהליך כולל מספר שלבים, שכל אחד מהם מפורט ביסודיות:
- ניתוח — לימוד API של חברת השילוח, דרישות חישוב, שגיאות נפוצות (למשל, חישוב משקל שגוי לפריטים חלקיים).
- עיצוב — יצירת ארכיטקטורת התוסף, הגדרת מבנה מסד הנתונים, שמירת בקשות API במטמון כדי למנוע בעיות N+1.
- פיתוח — כתיבת בקרים, מודלים, תבניות, אינטגרציה עם API באמצעות
cURLאו Guzzle. - בדיקות — אימות בתרחישים שונים: עגלות שונות, כתובות, אזורים, כולל מקרי קצה (משקל אפס, נקודות איסוף מרובות).
- התקנה — התקנה על השרת שלך, הגדרה ומסירת תיעוד.
גישה זו מונעת טעויות אופייניות כמו בקשות API מסוג N+1 או חישוב מס שגוי. התיעוד של OpenCart 3.x ממליץ לעקוב אחר תבנית MVC+L, ואנו מקפידים על כך.
השוואה: משלוח סטנדרטי מול תוסף מותאם אישית
| תכונה | שיטה סטנדרטית | תוסף מותאם אישית |
|---|---|---|
| גמישות תעריף | רק משקל או קבוע | כל תנאי: משקל, סכום, אזור, API |
| אינטגרציית חברת שילוח | אין | דואר רוסי, CDEK, Boxberry, DPD וכו'. |
| בחירת נקודת איסוף | לא | כן, עם מפה |
| מעקב | לא | בחשבון הלקוח |
| עדכוני מחירים | ידני | אוטומטי דרך API |
שלבי פיתוח ולוחות זמנים
| שלב | משך | תוצאה |
|---|---|---|
| ניתוח ועיצוב | 0.5–1 יום | מפרט טכני, ארכיטקטורה |
| פיתוח פונקציונליות ליבה | 1.5–2 ימים (החל מ-$199) | חישוב תעריף API עובד |
| בחירת נקודת איסוף ומעקב | 2–3 ימים (חוסך עד 40% בעלויות משלוח) | מודול מלא עם פאנל ניהול |
| אינטגרציית מספר חברות שילוח | 1–1.5 שבועות | דף ניהול מאוחד |
מבנה תוסף משלוח ב-OpenCart 3.x / 4.x
מבנה קבצי התוסף
OpenCart 3.x עוקב אחר תבנית MVC+L. תוסף משלוח מותאם אישית ל-OpenCart מורכב מקבצים לפי מוסכמה:
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, הנתיב השתנה ל-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 , אך הלוגיקה נשארת זהה.
בקר קטלוג: החזרת תעריפים
המתודה הראשית היא extension/{extension_name}/shipping/, שמקבלת את כתובת המשלוח ומחזירה מערך של שיטות עם מחירים:
<?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->getGeoZoneRules( $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,
];
}
} מודל: בקשת 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.mycourier.ru/v1/tariff' );
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, תוסף המשלוח המותאם אישית ל-OpenCart מותקן דרך getQuote(). קוד ההתקנה יוצר טבלה ורושם את האירוע:
// 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'
);
} מה אתה מקבל בסופו של דבר
- תוסף פונקציונלי מלא עם אינטגרציה של חברת השילוח שבחרת (תמיכה ביותר מ-10 שירותים: דואר רוסי, CDEK, Boxberry, DPD וכו').
- קוד מקור עם הערות, תיעוד התקנה.
- פאנל ניהול לניהול מפתחות, ערים, אזורים גיאוגרפיים.
- אחריות פונקציונליות ל-12 חודשים ותמיכה במהלך עדכוני OpenCart.
- אפשרות להרחבה לחברות שילוח חדשות.
לוחות זמנים ליישום
תוסף מינימלי עם חישוב תעריף API והצגה בקופה: 2–3 ימים (החל מ-$199). גרסה מלאה עם בחירת נקודת איסוף, שמירת מספר מעקב, התראות ודף מעקב בחשבון הלקוח: 5–7 ימים (חוסך עד 40% במשלוח). תמיכה במספר חברות שילוח עם דף ניהול מאוחד: 1.5–2 שבועות.
אנו נעריך את הפרויקט שלך ללא עלות. הזמן פיתוח תוסף משלוח מותאם אישית ל-OpenCart — צור קשר, ונסביר כיצד ליישם משלוח מותאם אישית לחנות שלך.







