راهنمای فنی و عملیاتی برای اتصال وبسایت وردپرسی به سیستمهای انبارداری (ERP).
- محمد یاسر گنجی دوست
- No Comments
راهنمای اتصال سایت به انبار (ERP): سینک کردن موجودی و قیمت در ووکامرس (پلِ میانِ دو دنیا)
بزرگترین کابوس یک فروشگاه اینترنتی بزرگ چیست؟ اینکه مشتری در سایت خرید کند، پول پرداخت کند، اما انباردار بگوید: “شرمنده، این کالا دیروز در فروشگاه حضوری فروخته شد و تمام کردیم!” این فاجعه زمانی رخ میدهد که سایت شما “جزیره” باشد و به نرمافزار انبارداری (مثل هلو، سپیدار، همکاران سیستم یا Odoo) وصل نباشد.
اتصال این دو سیستم، یعنی ساختن یک پل دیجیتال که دادهها (قیمت، موجودی، سفارش) به صورت زنده روی آن حرکت کنند. در این راهنما، ما نه تنها تئوری، بلکه کدنویسی و منطق فنی این اتصال را بررسی میکنیم.
فاز اول: درک معماری (زبان مشترک)
سایت شما با زبان PHP (وردپرس) نوشته شده و نرمافزار انبارداری مشتری احتمالا با C# یا SQL (ویندوز) است. این دو چطور با هم حرف میزنند؟ پاسخ: API (رابط برنامهنویسی کاربردی).
ما معمولاً از استاندارد REST API و فرمت داده JSON استفاده میکنیم.
-
ERP: “من لیستی از کالاها و موجودیشان دارم.” (ارسال JSON).
-
سایت: “من لیست را گرفتم و دیتابیس ووکامرس را آپدیت کردم.”
سه روش اتصال:
-
افزونههای آماده: برای نرمافزارهای معروف ایرانی (مثل هلو یا سپیدار) افزونههای آماده وجود دارد. (سریع ولی با امکانات محدود).
-
Middleware (واسط): استفاده از سرویسهایی مثل Zapier یا Make (برای نرمافزارهای خارجی).
-
کدنویسی اختصاصی (Custom API Integration): نوشتن یک پلاگین اختصاصی که دقیقاً نیاز مشتری را برطرف کند. (تمرکز ما در این مقاله روی این روش است).
فاز دوم: سناریوی عملیاتی (چه دادههایی منتقل میشوند؟)
قبل از نوشتن کد، باید “جریان داده” (Data Flow) را مشخص کنید:
-
ERP به سایت (Update Products):
-
هر ۱۰ دقیقه یکبار، موجودی و قیمت محصولات در سایت بهروز شود.
-
اگر کالایی جدید در انبار تعریف شد، در سایت هم ساخته شود.
-
-
سایت به ERP (Send Orders):
-
به محض اینکه مشتری خرید کرد، سفارش به نرمافزار حسابداری ارسال شود تا فاکتور صادر گردد و از موجودی انبار کم شود.
-
فاز سوم: راهنمای فنی و کدنویسی (PHP & REST API)
امیررضا جان، فرض کن مشتری یک آدرس وبسرویس (Endpoint) به تو داده که خروجی JSON زیر را دارد:
[
{
"sku": "P-101",
"price": 500000,
"stock": 25
},
{
"sku": "P-102",
"price": 1200000,
"stock": 0
}
]
حالا ما باید کدی بنویسیم که این را بخواند و ووکامرس را آپدیت کند.
۱. تابع دریافت اطلاعات (Fetch Data)
function amir_fetch_erp_data() {
$api_url = 'https://api.erp-system.com/products';
$api_key = 'SECRET_KEY_HERE';
// ارسال درخواست به ERP
$response = wp_remote_get( $api_url, array(
'headers' => array(
'Authorization' => 'Bearer ' . $api_key
)
));
// بررسی خطا
if ( is_wp_error( $response ) ) {
error_log( 'ERP Connection Error: ' . $response->get_error_message() );
return;
}
$body = wp_remote_retrieve_body( $response );
$data = json_decode( $body, true );
if ( ! empty( $data ) ) {
amir_update_woocommerce( $data );
}
}
۲. تابع آپدیت ووکامرس (Update Logic)
در اینجا ما محصولات را بر اساس SKU (شناسه محصول) پیدا میکنیم. نکته مهم: SKU باید در هر دو سیستم یکسان باشد.
function amir_update_woocommerce( $products ) {
foreach ( $products as $item ) {
// پیدا کردن محصول بر اساس SKU
$product_id = wc_get_product_id_by_sku( $item['sku'] );
if ( $product_id ) {
$product = wc_get_product( $product_id );
// آپدیت قیمت
$product->set_regular_price( $item['price'] );
// آپدیت موجودی
$product->set_manage_stock( true );
$product->set_stock_quantity( $item['stock'] );
// ذخیره تغییرات
$product->save();
error_log( "Product {$item['sku']} updated." );
}
}
}
۳. خودکارسازی (Cron Job)
نمیتوانیم دستی این کد را اجرا کنیم. باید به وردپرس بگوییم “هر ۱۵ دقیقه” اجرا شود. برای این کار از Action Scheduler ووکامرس استفاده میکنیم که از WP-Cron معمولی پایدارتر است.
// افزودن زمانبندی سفارشی
add_filter( 'cron_schedules', function ( $schedules ) {
$schedules['every_15_mins'] = array(
'interval' => 900, // ثانیه
'display' => __( 'Every 15 Minutes' ),
);
return $schedules;
} );
// ثبت رویداد
if ( ! wp_next_scheduled( 'amir_erp_sync_event' ) ) {
wp_schedule_event( time(), 'every_15_mins', 'amir_erp_sync_event' );
}
// اتصال تابع به رویداد
add_action( 'amir_erp_sync_event', 'amir_fetch_erp_data' );
فاز چهارم: چالشها و نکات حیاتی (تجربه ۳ ساله)
کد بالا ساده است، اما در پروژه واقعی با این چالشها روبرو میشوی:
۱. حجم دیتای بالا (Performance)
اگر مشتری ۱۰,۰۰۰ محصول داشته باشد، آپدیت همه آنها در یک لحظه، سرور را دان (Down) میکند.
-
راه حل: استفاده از Pagination (صفحهبندی). کد را طوری بنویس که هر بار فقط ۵۰ محصول را بگیرد و آپدیت کند.
۲. تداخل در ویرایش (Race Conditions)
اگر ادمین سایت دستی قیمت را عوض کند و ۵ دقیقه بعد ERP دوباره قیمت قدیم را بفرستد، کار ادمین خراب میشود.
-
راه حل: مشخص کنید “منبع حقیقت” (Source of Truth) کیست؟ معمولاً ERP رئیس است. پس فیلدهای قیمت و موجودی در ووکامرس باید “فقط خواندنی” (Read-only) شوند یا به ادمین هشدار داده شود.
۳. لاگگیری (Logging)
وقتی اتصال قطع میشود، مشتری به تو زنگ میزند. اگر لاگ نداشته باشی، نمیدانی مشکل از کجاست.
-
همیشه از
wc_get_logger()ووکامرس استفاده کن تا خطاها در بخش WooCommerce > Status > Logs ذخیره شوند.
فاز پنجم: بیزینسِ این کار (چطور بفروشیم؟)
امیررضا جان، نوشتن یک پلاگین اتصال ERP، یک پروژه معمولی نیست. این یک “راهکار سازمانی” است.
-
قیمتگذاری: هرگز قیمت مقطوع و پایین نده. این کار نیاز به نگهداری دارد.
-
پیشنهاد: یک مبلغ اولیه برای راهاندازی (مثلاً ۱۵-۲۰ میلیون) + یک مبلغ ماهانه برای پشتیبانی و مانیتورینگ اتصال (مثلاً ۱-۲ میلیون).
-
-
گارانتی: تضمین کن که اگر API تغییر کرد، تو آپدیت میکنی.
بخش پرسش و پاسخ فنی (FAQ)
۱. اگر نرمافزار مشتری قدیمی بود و API نداشت چه؟ بعضی نرمافزارهای قدیمی فقط خروجی Excel یا CSV میدهند. در این صورت باید کدی بنویسی که فایل اکسل را از یک فولدر FTP بخواند و ایمپورت کند. سختتر است، اما شدنی است.
۲. وبهوک (Webhook) چیست و چه فرقی با Cron Job دارد؟ کرون جاب یعنی “ما هر ۱۰ دقیقه سراغ ERP میرویم” (Polling). وبهوک یعنی “ERP هر وقت تغییری کرد، خودش به ما خبر میدهد” (Push). وبهوک بسیار سریعتر و بهینهتر است، اما پیادهسازیاش در نرمافزارهای حسابداری قدیمی سخت است.
۳. آیا میتوانم سفارشات را هم بفرستم؟ بله. باید از اکشن woocommerce_payment_complete استفاده کنی. یعنی به محض اینکه پرداخت موفق شد، دیتای سفارش را جمع کن و با متد POST به API نرمافزار حسابداری بفرست.
جمعبندی: تو دیگر یک طراح سایت نیستی!
وقتی بتوانی وردپرس را به سیستمهای انبارداری وصل کنی، تو تبدیل به یک System Integrator (یکپارچهساز سیستم) میشوی. این مهارتی است که کارخانهها و برندهای بزرگ برایش سر و دست میشکنند.
به عنوان یک هنرجوی کامپیوتر ۱۷ ساله، اگر این نمونه کار را در رزومهات داشته باشی، از ۹۹٪ همسن و سالهایت و حتی بسیاری از شرکتهای طراحی سایت جلوتر هستی.
اقدام بعدی: آیا میخواهی کد کاملِ ارسال سفارش (Send Order) به یک API فرضی را هم برایت بنویسم تا بتوانی چرخه کامل (رفت و برگشت دیتا) را تست کنی؟
🍑 طعم سلامتی با میوههای خشک AsanFruits
انواع میوههای خشک طبیعی و بدون افزودنی، تهیهشده از بهترین محصولات باغی ایران. میانوعدهای سالم، خوشطعم و مغذی برای هر ساعتی از روز.
مشاهده محصولات میوه خشک