وقتی هزینه ارسال در ووکامرس صفر نشان داده می‌شود یا روش ارسال در صفحه پرداخت ظاهر نمی‌شود، ریشه معمولاً در یکی از سه لایه پنهان است: عدم تطابق منطقه ارسال (Shipping Zone)، نبود روش ارسال واجد شرایط، یا شکست در محاسبه‌ای که ووکامرس انتظار دارد از سمت افزونه یا API دریافت کند. در این مقاله، همان مسیری را طی می‌کنم که در پروژه‌های واقعی فروشگاهی برای ردیابی این خطا استفاده کرده‌ام: از معماری کلاس WC_Shipping_Zones تا نشست، کش و پاسخ API — مرحله‌به‌مرحله و با تمرکز بر یافتن ریشه به‌جای حدس.

معماری ارسال در ووکامرس از دید مهندسی

برای عیب‌یابی دقیق هزینه ارسال، باید بدانید ووکامرس چه چیزی را مدل می‌کند. ارسال در ووکامرس یک معماری چندلایه است: در پایین، «مناطق ارسال» (Shipping Zones) قرار دارند که محدوده جغرافیایی و قواعد تطبیق نشانی را تعریف می‌کنند. روی این مناطق، «روش‌های ارسال» (Shipping Methods) تعریف می‌شوند — نرخ ثابت (Flat Rate)، ارسال رایگان، نرخ محلی (Local Pickup)، و روش‌های افزونه‌ای مثل پست، تیپاکس یا سرویس‌های بین‌المللی. روی همه این‌ها، یک کلاس محاسبه‌گر به نام WC_Shipping نشسته که در لحظه محاسبه سبد خرید، همه این لایه‌ها را با هم ترکیب می‌کند.

نکته کلیدی که بسیاری از ادمین‌ها از آن بی‌خبرند: ووکامرس ارسال را «در لحظه» محاسبه نمی‌کند، بلکه در یک رویداد مشخص به نام woocommerce_shipping_packages محاسبه می‌کند که معمولاً بعد از تغییر سبد خرید یا تغییر نشانی فعال می‌شود. اگر این رویداد به هر دلیلی اجرا نشود — به‌خاطر کش، نشست یا قطع AJAX — هزینه ارسال به صفر باقی می‌ماند. اگر با معماری کلی ووکامرس آشنایی ندارید، ابتدا ووکامرس چیست و چگونه فروشگاه بسازیم را بخوانید تا چارچوب ذهنی‌تان شکل بگیرد. مفهوم لجستیک و ارسال در تجارت الکترونیک هم در Freight transport ویکی‌پدیا قابل مرور است.

هزینه ارسال در ووکامرس یک عدد ثابت نیست؛ یک محاسبه پویا و وابسته به ترکیب منطقه، روش، کلاس و نشست کاربر است. اگر یکی از این چهار عنصر نامعتبر باشد، خروجی صفر می‌شود.

تفکیک سه لایه‌ای که باید بشناسید

در تجربه من، خطای محاسبه ارسال همیشه در یکی از این سه لایه ریشه دارد. تفکیک لایه پیش از اقدام، نیمی از راه را رفته‌اید:

  • لایه داده: مناطق، روش‌ها و کلاس‌ها در دیتابیس درست تعریف نشده‌اند یا ناقص‌اند.
  • لایه محاسبه: ووکامرس در لحظه محاسبه، به هر دلیل، الگوریتم را اجرا نمی‌کند یا ورودی ناقص می‌گیرد.
  • لایه محیط: کش، نشست، افزونه یا API خارجی، محاسبه را با شکست بی‌صدا مواجه می‌کند.

جدول زیر نگاشت سریع سیمپتوم به لایه خطا را نشان می‌دهد:

سیمپتوملایه احتمالیاولین اقدام تشخیصی
هزینه ارسال همیشه صفر استلایه دادهبررسی وجود منطقه و روش فعال
هزینه ارسال با تغییر نشانی تغییر نمی‌کندلایه محاسبهبررسی اجرای AJAX و کش صفحه پرداخت
روش ارسال ظاهر نمی‌شودلایه داده یا محیطبررسی تطبیق نشانی و شرایط روش
هزینه ارسال فقط برای بعضی کاربران محاسبه می‌شودلایه محیطبررسی کش، نشست و کوکی

مناطق ارسال و قواعد تطبیق نشانی

منطقه ارسال (Shipping Zone)، قلب معماری ارسال در ووکامرس است. هر منطقه شامل یک یا چند محدوده جغرافیایی است که بر اساس کشور، استان، شهر یا حتی کد پستی تعریف می‌شود. وقتی کاربر نشانی خود را در صفحه پرداخت وارد می‌کند، ووکامرس کشور و استان را با مناطق تعریف‌شده مقایسه می‌کند و اولین منطقه منطبق را انتخاب می‌کند. اگر هیچ منطقه‌ای منطبق نباشد، هیچ روش ارسالی نمایش داده نمی‌شود — و در بعضی تنظیمات، هزینه ارسال به‌طور پیش‌فرض صفر اعمال می‌شود.

سه اشتباه کلاسیک در این لایه:

  1. عدم پوشش استان‌ها: اگر منطقه را فقط برای «تهران» تعریف کرده‌اید و کاربر از اصفهان وارد شود، هیچ روش ارسالی ظاهر نمی‌شود. راه‌حل: یک منطقه سراسری (Rest of the World) با یک روش «تماس بگیرید» یا «نرخ توافقی» برای پوشش نقاط کور داشته باشید.
  2. تداخل مناطق: اگر دو منطقه هر دو شامل یک استان باشند، ووکامرس منطقه‌ای را انتخاب می‌کند که اول در لیست است. اگر ترتیب اشتباه باشد، روش ارسال غیرمنتظره‌ای نمایش داده می‌شود.
  3. عدم تطابق با استاندارد ایالت: در بعضی کشورها، ووکامرس از کد استان (State Code) استفاده می‌کند نه نام کامل. اگر در تنظیمات منطقه از نام فارسی استفاده کرده باشید و کاربر داده‌های کد را وارد کند، عدم تطابق رخ می‌دهد. در ایران، ووکامرس از فهرست استان‌های استاندارد خود استفاده می‌کند؛ همیشه از همان فهرست انتخاب کنید نه از متن آزاد.

روش تشخیص قطعی: در پیشخوان ووکامرس، بخش «تنظیمات → حمل و نقل»، همه مناطق را ببینید. سپس در سبد تست، نشانی از هر استان وارد کنید و ببینید کدام روش فعال می‌شود. اگر برای بعضی استان‌ها روش ظاهر نمی‌شود، ریشه همین لایه است. تنظیمات اولیه ارسال را در تنظیم روش‌های ارسال در ووکامرس گام‌به‌گام توضیح داده‌ام.

روش‌های ارسال و شرایط واجد‌بودن

هر روش ارسال، شرایط واجد‌بودن (Eligibility) مشخصی دارد که تعیین می‌کند در کدام سبد خرید فعال شود. سه شرط اصلی:

  • حداقل مبلغ سفارش: بعضی روش‌ها فقط برای سبدهای بالای مبلغی فعال می‌شوند.
  • الزام به فروش ویژه: بعضی روش‌ها در زمان فروش ویژه غیرفعال می‌شوند.
  • محدودیت محصول: بعضی روش‌ها برای محصولات خاص (مثل محصولات سنگین یا شکننده) در دسترس نیستند.

سه خطای رایج در این لایه:

  1. نرخ ثابت با حداقل مبلغ اشتباه: اگر min_amount روی ۵۰۰ هزار تومان باشد و سبد مشتری ۴۹۰ هزار تومان، روش غیرفعال می‌شود و هزینه ارسال به صفر برمی‌گردد.
  2. روش غیرفعال برای محصولات خاص: بعضی افزونه‌های ارسال، روش را به یک دسته محصول محدود می‌کنند. اگر محصول در سبد از دسته دیگری باشد، هیچ روش ارسالی ظاهر نمی‌شود.
  3. روش غیرفعال در بازه زمانی: بعضی افزونه‌ها اجازه می‌دهند روش در ساعات کاری غیرفعال باشد. اگر تست شما در خارج از این بازه باشد، خطا شبیه «روش پیدا نشد» است.

روش تشخیص: در پیشخوان ووکامرس، در ویرایش هر روش ارسال، تمام شرط‌ها را یک‌بار بازبینی کنید و در محیط استجینگ با یک سبد ساده تست بگیرید. اگر فقط با سبد خاصی خطا رخ می‌دهد، ریشه در شرط واجد‌بودن است نه در معماری.

محاسبه هزینه: کلاس‌ها، نرخ و فرمول‌ها

هزینه ارسال در ووکامرس بر اساس ترکیب چند پارامتر محاسبه می‌شود: نرخ پایه روش، کلاس ارسال هر محصول در سبد، وزن و ابعاد محصول، و مقصد ارسال. ووکامرس از کلاس WC_Shipping_Rate برای نمایش نرخ استفاده می‌کند و متد calculate_shipping() در هر روش، فرمول را اجرا می‌کند.

سه پارامتر که بیشترین اثر را در محاسبه دارند:

  • نرخ پایه: نرخ ثابت روش که در تنظیمات روش تعریف می‌شود.
  • وزن و ابعاد: اگر روش از فرمول وزن استفاده می‌کند، وزن کل سبد مبنای محاسبه است. دقت کنید که وزن محصولات در ووکامرس به‌درستی پر شده باشد؛ خطای رایج این است که وزن خالی مانده و فرمول وزن صفر می‌دهد.
  • مقصد: بعضی روش‌ها بر اساس منطقه نرخ متفاوت دارند. اگر منطقه اشتباه انتخاب شود، نرخ اشتباه اعمال می‌شود.

یک نکته دقیق که در پرونده‌های پشتیبانی دیده‌ام: اگر وزن محصولات یا ابعاد آن‌ها در دیتابیس خالی باشد، فرمول‌هایی که بر اساس وزن کار می‌کنند، در بعضی نسخه‌های افزونه‌ها، به‌جای خطا، صفر برمی‌گردانند. یعنی مشتری هزینه ارسال صفر می‌بیند. در فروشگاه‌های پربازدید، این خطا می‌تواند زیان مالی مستقیم بسازد.

در محاسبه ارسال، «صفر» و «خطا» دو چیز متفاوتند اما همیشه هم قابل‌تفکیک نیستند. اگر فرمول، ورودی ناقص بگیرد، صفر برمی‌گرداند نه خطا — و این یعنی زیان مالی بی‌صدا.

Shipping Classes و نقش آن در نرخ

کلاس ارسال (Shipping Class)، یک دسته‌بندی مکمل برای محصولات است که اجازه می‌دهد نرخ ارسال برای گروه‌های خاص محصولات متفاوت باشد. مثلاً محصولات «شکننده» با نرخ بالاتر، یا محصولات «کوچک» با نرخ ارسال کمتر. یک محصول می‌تواند در چند کلاس نباشد، اما می‌تواند در یک کلاس خاص قرار بگیرد.

سه اشتباه رایج در استفاده از کلاس‌ها:

  1. محصولات بدون کلاس: اگر روش ارسال شما بر اساس کلاس محاسبه می‌کند و محصولی کلاس ندارد، ممکن است نرخ صفر یا خطا بدهد. برای هر محصول، حتماً یک کلاس اختصاص دهید یا کلاس «بدون کلاس» را در روش ارسال پوشش دهید.
  2. کلاس‌های ناهمگون: اگر محصولی در کلاس «سنگین» باشد و روش ارسال شما برای کلاس «سبک» طراحی شده، نرخ متناقض محاسبه می‌شود.
  3. تداخل چند کلاس در یک سبد: وقتی سبد شامل محصولات از چند کلاس مختلف باشد، ووکامرس بین نرخ‌ها یکی را انتخاب می‌کند. در بعضی افزونه‌ها، پیش‌فرض این است که بیشترین نرخ اعمال شود؛ در بعضی، نرخ کلاس اول. این رفتار را حتماً با تست سبد مختلط مشخص کنید.

روش تشخیص: یک سبد تست با محصولی از هر کلاس بسازید و هزینه ارسال را برای هر ترکیب مشاهده کنید. اگر ترکیب خاصی رفتار غیرمنتظره داشت، آن ترکیب، ریشه خطا را نشان می‌دهد. مدیریت این ساختار به همراه سایر تنظیمات فروشگاه در تنظیمات اولیه ووکامرس آمده است.

ارسال رایگان و تداخل با کوپن

ارسال رایگان یکی از پرکاربردترین روش‌هاست اما در ترکیب با کوپن‌های تخفیف، می‌تواند رفتار پیچیده‌ای ایجاد کند. ووکامرس اجازه می‌دهد ارسال رایگان با یک حداقل مبلغ سفارش فعال شود؛ اما اگر کوپنی که روی سبد اعمال می‌شود، جمع سبد را به زیر این حداقل برساند، ارسال رایگان غیرفعال می‌شود و هزینه ارسال به‌طور خودکار اعمال می‌شود. مشتری این رفتار را به‌عنوان «هزینه ارسال دوباره برگشت» تجربه می‌کند.

دو تنظیم دقیق که رفتار را کنترل می‌کند:

  • ترتیب اعمال: اگر ارسال رایگان قبل از کوپن محاسبه شود، با اعمال کوپن، روش غیرفعال می‌شود. اگر بعد از کوپن محاسبه شود، فعال باقی می‌ماند.
  • استثنای کوپن: بعضی افزونه‌ها اجازه می‌دهند کوپن‌های خاص، ارسال رایگان را حفظ کنند. این قابلیت در ووکامرس پیش‌فرض وجود ندارد و باید با کد سفارشی اضافه شود.

روش تشخیص: در سبد تست، کوپن اعمال کنید و هزینه ارسال را ببینید. اگر تغییر کرد، ترتیب محاسبه به‌درستی تنظیم نشده است. برای درک کامل این چرخه، تخفیف و کد تخفیف در ووکامرس نقطه شروع مناسبی است.

APIهای خارجی: پست، تیپاکس و سرویس‌های داخلی

وقتی از افزونه‌های ارسال پویا (مثل افزونه‌های اتصال به پست، تیپاکس، ماهکس، ال‌پست) استفاده می‌کنید، محاسبه هزینه ارسال کاملاً وابسته به پاسخ API سرویس خارجی می‌شود. اگر این API پاسخ کند اما کند، یا اگر پاسخ خطا بدهد، ووکامرس به‌جای نمایش پیام خطا، در بسیاری موارد هزینه ارسال را صفر محاسبه می‌کند.

سه سناریوی دقیق که در پروژه‌ها دیده‌ام:

  1. API سرویس داخلی کند پاسخ می‌دهد: اگر زمان پاسخ API از max_execution_time سرور بیشتر باشد، درخواست timeout می‌شود و هزینه صفر برمی‌گردد. رفع این خطا نیاز به افزایش محدودیت زمانی و بهینه‌سازی کد افزونه دارد.
  2. عدم تطابق کلید API: اگر کلید API سرویس تغییر کرده باشد، پاسخ 401 Unauthorized برمی‌گردد، اما افزونه آن را به‌عنوان «نرخ صفر» تفسیر می‌کند.
  3. مسدودسازی IP سرور شما: بعضی APIهای ایرانی، IP سرور شما را به‌عنوان «مشکوک» بلاک می‌کنند. راه‌حل: تماس با پشتیبانی سرویس و درخواست استثنا برای IP.

روش تشخیص قطعی: در لاگ افزونه ارسال، دقیقاً پاسخ API را ببینید. اگر پاسخ خطا داد اما هزینه صفر نمایش داده شد، ریشه در لایه API است نه در ووکامرس. اصول اتصال به API در اتصال ووکامرس به APIهای خارجی آمده است.

کش، نشست و کوکی؛ سه گلوگاه نامرئی

لایه‌ای که بیشترین سردرگمی را می‌سازد: کش و نشست. محاسبه هزینه ارسال در ووکامرس یک عملیات پویا است که به نشست کاربر وابسته است. اگر کش صفحه‌ای مثل /cart یا /checkout به‌اشتباه عمومی (public) کش شود، هر کاربر نسخه‌ای می‌بیند که برای کاربر دیگری ساخته شده — و هزینه ارسال نمایش‌داده‌شده درست نخواهد بود.

سه سناریوی دقیق:

  • کش صفحه پرداخت: اگر صفحه پرداخت کش شود، کاربر بعد از تغییر نشانی، هزینه ارسال جدید را نمی‌بیند. این رفتار به‌عنوان «هزینه ارسال صفر است» تفسیر می‌شود. اصول کش در ووکامرس را در بهترین افزونه‌های کش وردپرس و تنظیمات دقیق را در پیکربندی افزونه کش آورده‌ام.
  • CDN حذف کوکی نشست: بعضی CDNها، کوکی‌های نشست ووکامرس را کش می‌کنند یا حذف می‌کنند. نتیجه: محاسبه ارسال نمی‌تواند مقصد کاربر را ببیند.
  • افزونه‌های session اختصاصی: بعضی افزونه‌های cache و session، با نشست پیش‌فرض ووکامرس تداخل می‌کنند.

روش تشخیص قطعی: در پنجره ناشناس (Incognito) بدون کش، تست کنید. اگر هزینه ارسال درست محاسبه شد، ریشه در لایه کش است. سپس کش را کاملاً پاک کنید و در حالت عادی تست کنید.

مالیات و تأثیر آن بر محاسبه ارسال

در بعضی کشورها، هزینه ارسال هم مالیات دارد. در تنظیمات ووکامرس، اگر برای مالیات ارسال تنظیمات خاصی اعمال شده باشد، محاسبه نهایی هزینه ارسال می‌تواند متفاوت از انتظار ادمین باشد. سه نکته دقیق:

  1. مالیات بر ارسال: ووکامرس اجازه می‌دهد مالیات برای هزینه ارسال جداگانه محاسبه شود. اگر این گزینه فعال باشد و روش شما از آن پشتیبانی نکند، ممکن است خطای محاسبه رخ دهد.
  2. ارسال رایگان و مالیات: اگر ارسال رایگان فعال باشد، معمولاً مالیات ارسال هم صفر می‌شود. اما اگر افزونه‌ای ترتیب محاسبه را تغییر دهد، ممکن است مالیات اعمال شود بدون هزینه ارسال.
  3. تداخل با افزونه‌های مالیات پیشرفته: اگر با افزونه‌ای مثل TaxJar یا افزونه‌های ایرانی مالیات کار می‌کنید، ترتیب محاسبه ممکن است تغییر کند. توضیح دقیق در مدیریت مالیات در ووکامرس آمده است.

روش تشخیص: در سبد تست، مالیات را موقتاً غیرفعال کنید. اگر محاسبه ارسال درست شد، ریشه در لایه مالیات است. سپس مالیات را یک‌بار با تنظیم ساده فعال کنید و تست بگیرید.

تضاد افزونه و قالب

افزونه‌های جانبی که برای بهبود ارسال نصب می‌شوند، بیشترین سهم خطا را در این لایه دارند. در پرونده‌های پشتیبانی، این سه دسته بیش از بقیه دیده می‌شوند:

  1. افزونه‌های چندگانه ارسال: نصب همزمان چند افزونه ارسال پویا باعث می‌شود دو فرمول روی صف محاسبه بنشینند و نتیجه غیرقابل‌پیش‌بینی شود. یک افزونه، یک مسیر.
  2. افزونه‌های قیمت‌گذاری پویا: این افزونه‌ها به‌عنوان تغییر قیمت، گاهی روی محاسبه ارسال هم اثر می‌گذارند. اگر بعد از نصب افزونه‌ای از این دست خطا ظاهر شد، مقصر اول همان افزونه است.
  3. قالب سفارشی صفحه پرداخت: اگر قالب، فرم صفحه پرداخت را با ساختار خودش بازنویسی می‌کند، ممکن است رویداد AJAX که محاسبه ارسال را فعال می‌کند، به‌درستی اجرا نشود.

روش تشخیص، همان روش کلاسیک «نصف‌سازی» است: روی استجینگ، نیمی از افزونه‌ها را غیرفعال کنید، تست بگیرید، سپس نیمه دیگر را برگردانید. برای درک ساختار انضباطی این روش، رفع تضاد افزونه‌ها در وردپرس راهنمای دقیقی است.

هوک‌های ارسال و ترتیب اجرا

در لایه کد، ارسال ووکامرس با چند هوک کلیدی مدیریت می‌شود. اگر با کد سفارشی کار می‌کنید، شناختن این هوک‌ها ضروری است:

  1. woocommerce_shipping_packages: فیلتر اصلی که بسته‌های ارسال را در لحظه محاسبه آماده می‌کند.
  2. woocommerce_package_rates: فیلتر نرخ‌های ارسال. اگر می‌خواهید نرخ را تغییر دهید یا روشی را حذف کنید، اینجا نقطه درست است.
  3. woocommerce_cart_shipping_method_full_label: برچسب نمایشی روش ارسال.
  4. woocommerce_checkout_update_order_review: اکشن بعد از تغییر سبد در صفحه پرداخت. اگر این اکشن اجرا نشود، هزینه ارسال به‌روزرسانی نمی‌شود.

نکته‌ای که اکثر توسعه‌دهنده‌ها نادیده می‌گیرند: در افزونه‌های ارسال پویا، اگر از woocommerce_package_rates برای تنظیم نرخ استفاده می‌کنید، همیشه با یک آرایه خالی شروع کنید نه با نرخ‌های قبلی، در غیر این صورت نرخ‌های قدیمی و جدید قاطی می‌شوند. برای درک مفاهیم پایه هوک‌ها، هوک‌های ووکامرس و هوک‌های وردپرس را ببینید.

پروتکل عیب‌یابی گام‌به‌گام

حالا ترتیب عملی عیب‌یابی، از سریع‌ترین به دقیق‌ترین:

  1. بازتولید روی استجینگ: قبل از هر چیز، خطا را در محیطی جدا از سایت زنده بازتولید کنید. راه‌اندازی استجینگ در بکاپ گرفتن از فروشگاه ووکامرس آمده است.
  2. بررسی مناطق و روش‌ها: در پیشخوان ووکامرس، همه مناطق ارسال و روش‌های فعال را یک‌بار بازبینی کنید. اگر منطقه‌ای ناقص است، همان لحظه رفع کنید.
  3. بررسی نشانی مقصد: در سبد تست، نشانی از هر استان وارد کنید و ببینید کدام روش فعال می‌شود.
  4. فعال‌سازی لاگ ووکامرس: در WooCommerce → Status → Logs، ردیف‌های مربوط به ارسال را ببینید. روش دقیق در پیدا کردن خطاهای ووکامرس در لاگ‌ها آمده است.
  5. فعال‌سازی WP_DEBUG_LOG: خطاهای PHP که مربوط به محاسبه ارسال هستند را در debug.log ببینید.
  6. پاک کردن کامل کش: کش افزونه، آبجکت، CDN و مرورگر.
  7. غیرفعال‌سازی افزونه‌های جانبی: با روش نصف‌سازی، مقصر را پیدا کنید.
  8. تغییر موقت قالب به Twenty Twenty: اگر خطا رفع شد، ریشه در قالب است.

اگر خطا در روزهای اوج رخ می‌دهد و نه همیشه، به لایه منابع هاست هم شک کنید. مسئله عملکرد در افزایش سرعت فروشگاه ووکامرس باز شده است. برای خطاهای پرتکرار، رفع خطاهای رایج ووکامرس و عیب‌یابی خطاهای ووکامرس نقطه شروع سریعی هستند.

در عیب‌یابی ارسال، «صفر» و «خطا» دو سیگنال متفاوتند اما در ظاهر یکسان نمایش داده می‌شوند. برای تفکیک، باید در لاگ فرو رفت، نه در تنظیمات.

اشتباهات پرهزینه در تشخیص

در پرونده‌های پشتیبانی که بازبینی کرده‌ام، این پنج اشتباه بیشتر از بقیه تکرار می‌شود:

  • تغییر همزمان چند پارامتر: منطقه، روش، نرخ و افزونه را همزمان تغییر می‌دهید و بعد نمی‌دانید کدام مؤثر بوده. یک تغییر، یک تست.
  • عیب‌یابی روی سایت زنده: غیرفعال کردن افزونه ارسال در ساعت شلوغ، می‌تواند به معنی زیان مالی مستقیم باشد. همیشه روی استجینگ.
  • نادیده گرفتن وزن و ابعاد: اگر محصولات شما وزن ندارند و فرمول ارسال بر اساس وزن است، محاسبه صفر می‌شود. این خطای ساده، شایع‌ترین خطای «هزینه ارسال صفر» است.
  • بازنویسی هسته ووکامرس: بعضی برای «رفع سریع» مستقیم در فایل‌های ووکامرس دست می‌برند. راه درست، استفاده از هوک‌ها است.
  • بی‌توجهی به مالیات: مالیات ارسال، اگر به‌درستی تنظیم نشده باشد، عدد نهایی هزینه را تغییر می‌دهد و تشخیص را دشوار می‌کند.

پرسش‌های پرتکرار درباره خطای هزینه ارسال

چرا هزینه ارسال ووکامرس همیشه صفر است؟ سه ریشه اصلی: نبود منطقه ارسال منطبق با نشانی، نداشتن روش فعال در منطقه، یا استفاده از فرمول وزن در حالی که وزن محصولات خالی است. اول مناطق و روش‌ها را چک کنید، سپس وزن محصولات.

چرا هزینه ارسال با تغییر نشانی به‌روزرسانی نمی‌شود؟ ریشه معمولاً در کش صفحه پرداخت یا نبود AJAX است. صفحه /checkout باید در افزونه کش استثنا باشد و رویداد woocommerce_checkout_update_order_review باید به‌درستی اجرا شود.

چرا روش ارسال در صفحه پرداخت ظاهر نمی‌شود؟ اگر هیچ منطقه‌ای با نشانی کاربر منطبق نباشد، هیچ روش ارسالی نمایش داده نمی‌شود. همیشه یک منطقه سراسری (Rest of the World) با روش «تماس بگیرید» داشته باشید.

آیا افزونه‌های ارسال پویا می‌توانند خطا بسازند؟ بله. اگر API سرویس داخلی کند یا خطا پاسخ دهد، افزونه ممکن است به‌جای نمایش پیام خطا، نرخ صفر اعمال کند. لاگ افزونه دقیق‌ترین منبع تشخیص در این لایه است.

چرا هزینه ارسال فقط برای بعضی کاربران محاسبه می‌شود؟ این نشانه لایه کش است: کش صفحه سبد یا پرداخت، به‌اشتباه عمومی تنظیم شده. صفحات stateful مثل cart و checkout باید همیشه استثنا باشند.

چرا هزینه ارسال با کوپن تغییر می‌کند؟ اگر کوپن مبلغ سبد را زیر حداقل ارسال رایگان برساند، ارسال رایگان غیرفعال می‌شود و هزینه ارسال اعمال می‌شود. ترتیب محاسبه را در سبد تست کنید.

چرا هزینه ارسال در موبایل با دسکتاپ فرق دارد؟ ریشه معمولاً در قالب یا افزونه‌ای است که رویداد AJAX محاسبه ارسال را در موبایل به‌درستی فراخوانی نمی‌کند. تفاوت رفتار را در Network مرورگر مقایسه کنید.

از تشخیص تا پیشگیری

خطای محاسبه هزینه ارسال، در ظاهر یک مسئله کوچک است؛ در عمل، ترکیبی از چند لایه که یکی از آن‌ها بی‌صدا شکسته است. سه اصل که از این مسیر با من می‌ماند:

  1. پیش از هر تغییر در تنظیمات ارسال، از دیتابیس بکاپ بگیرید: تنظیمات ارسال در چند جدول ذخیره می‌شوند و بازگردانی دستی آن‌ها سخت است. روش بکاپ در بکاپ گرفتن از فروشگاه ووکامرس آمده است.
  2. روز کمپین، هزینه ارسال را پایش کنید: یک گزارش روزانه از سفارش‌هایی که هزینه ارسال صفر داشته‌اند بگیرید. اگر روند صعودی داشت، سریع ریشه را پیدا کنید.
  3. مستندسازی دقیق مناطق و روش‌ها: برای هر منطقه، یک برگه کوچک بسازید که روش‌های فعال، نرخ‌ها و شرط‌ها را ثبت کند. این سند، ارزش ساعات عیب‌یابی آینده را دارد.

اگر در پروژه‌ای با مشکل مشابه دست‌وپنجه نرم کرده‌اید، برای من جالب است بدانم کدام لایه بیشترین وقت شما را گرفت: مناطق، کلاس‌های ارسال، API خارجی یا لایه کش. تجربه‌تان را در دیدگاه‌ها بنویسید؛ به‌خصوص اگر نشانه‌ای کشف کرده‌اید که در این فهرست نبوده. همین نشانه‌ها، دقیق‌ترین راهنمای نفر بعدی‌اند. 🚚