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

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

برای اینکه بتوانید «چرا موجودی نمایش داده نمی‌شود» را دقیق پاسخ دهید، باید ببینید ووکامرس در لایه زیرین چه چیزی را مدل می‌کند. موجودی در ووکامرس یک عدد ساده نیست؛ یک سیستم وضعیت است که از چند لایه روی هم ساخته می‌شود: در پایین، متادیتای محصول در wp_postmeta قرار دارد که عدد موجودی (_stock)، وضعیت موجودی (_stock_status) و پرچم مدیریت موجودی (_manage_stock) را نگه می‌دارد. در لایه میانی، کلاس WC_Product این متا را می‌خواند و در حافظه نگه می‌دارد. در لایه نمایش، قالب با متدهایی مثل get_stock_quantity() و get_availability() این مقادیر را به کاربر نشان می‌دهد.

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

موجودی در ووکامرس یک عدد ثابت نیست؛ یک وضعیت پویاست که در چند متا و از چند مسیر به‌روز می‌شود. اگر یکی از این مسیرها بشکند، عدد نمایشی از واقعیت جدا می‌شود.

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

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

  • لایه داده: مقدار موجودی یا وضعیت آن در دیتابیس اشتباه ذخیره شده یا خالی است.
  • لایه محاسبه: ووکامرس در لحظه نمایش، داده را نادرست تفسیر می‌کند یا قالب، مقدار را نمایش نمی‌دهد.
  • لایه محیط: کش، CDN، CRON یا افزونه خارجی، داده تازه را به کاربر نمی‌رساند.

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

سیمپتوملایه احتمالیاولین اقدام تشخیصی
موجودی هرگز نمایش داده نمی‌شودلایه داده یا قالببررسی متا _stock و _manage_stock
موجودی بعد از فروش کم نمی‌شودلایه محاسبه یا محیطبررسی CRON و کش آبجکت
محصول موجود، «ناموجود» نمایش داده می‌شودلایه دادهبررسی _stock_status
موجودی فقط برای کاربران لاگین درست استلایه محیطبررسی کش صفحه و نشست

Stock Status و وضعیت‌های پنج‌گانه محصول

ووکامرس برای موجودی، از یک وضعیت (Stock Status) استفاده می‌کند که در آن، محصول به یکی از این حالت‌ها نگاشت می‌شود: instock (موجود)، outofstock (ناموجود)، onbackorder (پیش‌سفارش)، available (در دسترس، فقط برای محصولات مجازی) و unmanaged (مدیریت‌نشده). این وضعیت در متای _stock_status ذخیره می‌شود و مستقل از عدد موجودی است. یکی از شایع‌ترین خطاها این است که عدد موجودی به‌درستی پر شده اما وضعیت (_stock_status) هنوز روی outofstock باقی مانده — یا برعکس.

سه سناریوی دقیق که در آن‌ها وضعیت نامنطبق می‌شود:

  1. ویرایش دستی موجودی در پیشخوان: وقتی ادمین عدد موجودی را از صفر به یک عدد مثبت تغییر می‌دهد، ووکامرس معمولاً به‌طور خودکار وضعیت را به instock تغییر می‌دهد. اما اگر این تغییر در یک بازه زمانی خاص رخ دهد یا افزونه‌ای هوک تغییر وضعیت را override کند، وضعیت به‌روز نمی‌شود.
  2. ورود محصول از فایل CSV: در ورود گروهی محصولات، اگر ستون _stock_status در فایل شما نادرست باشد یا خالی بماند، ووکامرس مقدار پیش‌فرض را اعمال می‌کند که ممکن است outofstock باشد. بنابراین محصولی که در فایل عدد موجودی مثبت دارد اما وضعیتش خالی است، در فرانت‌اند ناموجود نمایش داده می‌شود.
  3. تغییر وضعیت با کد سفارشی: اگر کد سفارشی شما مستقیماً _stock را به‌روز کند اما به _stock_status کاری نداشته باشد، عدم‌تطابق رخ می‌دهد. همیشه از متدهای ووکامرس مثل $product->set_stock_quantity() و $product->save() استفاده کنید.

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

گزینه Manage Stock و رفتار آن در انواع محصول

هر محصول در ووکامرس یک پرچم _manage_stock دارد که تعیین می‌کند آیا ووکامرس باید عدد موجودی را پیگیری کند یا نه. اگر این پرچم روی no باشد، ووکامرس هیچ عدد موجودی را نمایش نمی‌دهد و فقط از وضعیت instock یا outofstock استفاده می‌کند. اگر روی yes باشد، ووکامرس عدد موجودی را می‌شمارد و در صورت رسیدن به صفر، وضعیت را به outofstock تغییر می‌دهد.

سه سناریو که در آن‌ها این پرچم خطا می‌سازد:

  • محصول مجازی یا دانلودی: در این نوع محصولات، مدیریت موجودی معمولاً غیرفعال است و مدیریت آن‌ها در انواع محصولات در ووکامرس آمده است. اگر ادمین پرچم را اشتباهاً روی yes بگذارد و عدد موجودی صفر بماند، محصول ناموجود می‌شود.
  • محصولات با موجودی نامحدود: بعضی ادمین‌ها با تعریف عدد بزرگ (مثل ۹۹۹۹۹۹) موجودی نامحدود را شبیه‌سازی می‌کنند. این کار در ظاهر کار می‌کند اما اگر در یک فروش، عدد به منفی برود، ووکامرس رفتار غیرمنتظره‌ای نشان می‌دهد.
  • تعارض با افزونه‌های انبار خارجی: اگر افزونه‌ای مثل ERP یا اتصال به انبار خارجی، خودش پرچم مدیریت موجودی را مدیریت کند، ممکن است با تنظیمات ووکامرس تداخل داشته باشد.

روش تشخیص: در ویرایش هر محصول، مطمئن شوید پرچم Manage stock? با نوع محصول و سناریوی فروش شما هماهنگ است. برای محصولات ساده، این پرچم معمولاً روی yes است؛ برای محصولات مجازی، روی no.

موجودی در محصولات متغیر و واریانت‌ها

محصولات متغیر، پیچیده‌ترین لایه موجودی در ووکامرس هستند. در این نوع محصول، هر واریانت (variant) عدد موجودی مستقل خودش را دارد و والد (parent) معمولاً عدد موجودی ندارد یا مجموع واریانت‌ها را نمایش می‌دهد. اگر یکی از این واریانت‌ها خطای موجودی داشته باشد، نمایش والد هم تحت تأثیر قرار می‌گیرد. سه اشتباه دقیق در این لایه:

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

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

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

Stock Amount: از کجا خوانده می‌شود و چه زمانی به‌روز می‌شود

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

سه نکته دقیق در این لایه:

  1. عدد منفی: اگر در تنظیمات ووکامرس، گزینه «Hold stock» یا «Backorders» فعال باشد، ممکن است عدد موجودی به منفی برود. نمایش «-۳ موجود» همیشه یک خطای واضح نیست اما می‌تواند تجربه کاربری را خراب کند.
  2. رزرو موقت: ووکامرس در زمان پرداخت، موجودی را برای مدت محدودی «رزرو» می‌کند. اگر کاربر پرداخت را نهایی نکند، ووکامرس بعد از یک بازه زمانی، موجودی را برمی‌گرداند. اگر این فرآیند به‌دلیل CRON خطا خورده باشد، موجودی به‌اشتباه رزرو باقی می‌ماند.
  3. افزایش موجودی بعد از لغو: اگر سفارشی لغو شود، ووکامرس باید عدد موجودی را افزایش دهد. اگر این افزایش رخ ندهد، موجودی همیشه کمتر از واقعیت نمایش داده می‌شود.

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

HPOS، متا و ساختار داده موجودی

از ووکامرس ۷.۱ به بعد، HPOS (High-Performance Order Storage) به‌عنوان معماری جدید ذخیره‌سازی سفارش‌ها معرفی شد. نکته‌ای که در عیب‌یابی موجودی اهمیت دارد: HPOS فقط بر سفارش‌ها اثر می‌گذارد، نه بر محصولات. متای موجودی محصول هنوز در wp_postmeta ذخیره می‌شود و ساختار آن تغییر نکرده است. اما این حقیقت دو پیامد دارد:

  • افزونه‌های قدیمی که مستقیم روی wp_postmeta کوئری می‌زنند، ممکن است رفتار متفاوتی داشته باشند: اگر افزونه‌ای سفارش‌ها را به‌عنوان منبع کاهش موجودی استفاده می‌کند، با HPOS ممکن است کاهش را دوباره اعمال کند یا نادیده بگیرد.
  • مهاجرت به HPOS می‌تواند متای موجودی را ناهمگام کند: اگر در فرآیند مهاجرت، هوک‌های کاهش موجودی به‌درستی منتقل نشوند، موجودی به‌روز نمی‌شود.

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

CRON، همگام‌سازی انبار و افزونه‌های ERP

لایه‌ای که کمترین توجه را دریافت می‌کند اما در فروشگاه‌های بزرگ‌تر، بیشترین اثر را دارد: CRON و همگام‌سازی. اگر فروشگاه شما از یک سیستم انبار خارجی (ERP، افزونه اختصاصی یا API تأمین‌کننده) استفاده می‌کند، عدد موجودی محصول با یک CRON به‌روز می‌شود. اگر این CRON به هر دلیل fail شود یا کند اجرا شود، عدد موجودی نمایش‌داده‌شده با واقعیت جدا می‌شود.

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

  1. CRON وردپرس نامنظم اجرا می‌شود: در سایت‌های کم‌ترافیک، CRON وردپرس ممکن است ساعت‌ها دیرتر اجرا شود. برای سایت‌های فروشگاهی، همیشه باید CRON واقعی سرور به‌جای CRON وردپرس تنظیم شود.
  2. CRON به‌دلیل timeout قطع می‌شود: اگر همگام‌سازی هزاران محصول را شامل شود، ممکن است از max_execution_time بگذرد و قطع شود. رفع این سناریو در رفع خطای Maximum execution time آمده است.
  3. API انبار خارجی پاسخ نمی‌دهد: اگر API کند یا قطع باشد، CRON موجودی را به‌روز نمی‌کند و عدد قدیمی نمایش داده می‌شود.

روش تشخیص قطعی: در WooCommerce → Status → Scheduled Actions، آخرین اجرای CRON و نتیجه آن را ببینید. اگر ردیف‌های pending یا failed دارید، ریشه همین لایه است. برای خطاهای پرتکرار، رفع خطاهای رایج ووکامرس فهرست عملیاتی دقیقی دارد.

کش، CDN و کش آبجکت؛ گلوگاه نامرئی

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

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

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

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

هوک‌های موجودی و ترتیب اجرا

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

  1. woocommerce_reduce_order_stock: اکشن بعد از کاهش موجودی با فروش موفق. اگر افزونه‌ای این اکشن را override کند و به‌درستی اجرا نکند، کاهش موجودی رخ نمی‌دهد.
  2. woocommerce_restore_order_stock: اکشن بعد از بازگرداندن موجودی هنگام لغو سفارش. اگر این اکشن fail شود، موجودی افزایش پیدا نمی‌کند.
  3. woocommerce_product_set_stock: اکشن قبل از ذخیره موجودی محصول.
  4. woocommerce_product_set_stock_status: اکشن قبل از ذخیره وضعیت موجودی محصول.
  5. woocommerce_variation_set_stock: نسخه واریانت اکشن موجودی.

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

نمایش موجودی در قالب: از single product تا آرشیو

حتی اگر داده و محاسبه درست باشند، ممکن است قالب شما موجودی را نمایش ندهد. هر قالب ووکامرس، از فایل‌های خاصی برای نمایش موجودی استفاده می‌کند که در پوشه woocommerce/ قالب قرار دارند. اگر قالبی این فایل‌ها را با نسخه سفارشی خودش جایگزین کرده باشد و آن نسخه قدیمی باشد، ممکن است بخش نمایش موجودی را کلاً حذف کرده باشد.

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

  1. فایل single-product/stock.php قدیمی: اگر قالب شما این فایل را با نسخه قدیمی جایگزین کرده، ممکن است بخش موجودی را نمایش ندهد. باید این فایل به‌روز شود یا به نسخه پیش‌فرض ووکامرس بازگردد.
  2. کد CSS که موجودی را مخفی می‌کند: بعضی قالب‌ها به‌دلیل زیبایی‌شناسی، کلاس .stock را با display:none مخفی می‌کنند. در نتیجه، موجودی در HTML وجود دارد اما در مرورگر نمایش داده نمی‌شود.
  3. تنظیمات قالب سفارشی: بعضی قالب‌ها گزینه‌ای برای نمایش یا مخفی کردن موجودی دارند. اگر این گزینه نادرست تنظیم شده باشد، موجودی نمایش داده نمی‌شود.

روش تشخیص قطعی: در View Source صفحه محصول، دنبال کلاس .stock یا .in-stock بگردید. اگر در HTML وجود دارد اما در مرورگر نمایش داده نمی‌شود، ریشه در CSS است. اگر در HTML هم وجود ندارد، ریشه در قالب یا تنظیمات ووکامرس است.

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

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

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

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

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

دیتابیس و کوئری‌های مربوط به موجودی

در لایه دیتابیس، موجودی در چند متای مشخص ذخیره می‌شود. برای عیب‌یابی دقیق، باید با ساختار این متاها آشنا باشید. سه متای کلیدی:

  • _stock: عدد موجودی محصول یا واریانت.
  • _stock_status: وضعیت موجودی (instock، outofstock، onbackorder).
  • _manage_stock: پرچم مدیریت موجودی (yes یا no).

سه نکته دقیق در این لایه:

  1. متای خالی یا گم‌شده: اگر افزونه‌ای متای _stock را حذف کرده باشد، ووکامرس ممکن است عدد را صفر تفسیر کند و محصول را ناموجود ببیند. جست‌وجوی متاهای گم‌شده در دیتابیس، نیاز به کوئری دقیق دارد که در بهینه‌سازی کوئری‌های MySQL آمده است.
  2. متای تکراری: اگر افزونه‌ای دو بار متای _stock را ثبت کند، ووکامرس معمولاً اولین مقدار را می‌خواند. نتیجه: عدد اشتباه نمایش داده می‌شود.
  3. کش آبجکت دیتابیس: اگر سایت شما از کش آبجکت (Redis یا Memcached) استفاده می‌کند و متای موجودی در کش قدیمی باقی مانده باشد، عدد جدید نمایش داده نمی‌شود.

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

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

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

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

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

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

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

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

پرسش‌های پرتکرار درباره عدم نمایش موجودی

چرا عدد موجودی محصول در ووکامرس نمایش داده نمی‌شود؟ سه ریشه اصلی: پرچم مدیریت موجودی (_manage_stock) روی no است، قالب فایل نمایش موجودی را حذف کرده، یا CSS آن را مخفی می‌کند. اول این سه لایه را بررسی کنید.

چرا موجودی بعد از فروش به‌روز نمی‌شود؟ ریشه معمولاً در لایه CRON یا لایه کش است. اگر کاهش موجودی به‌دلیل fail شدن CRON رخ نمی‌دهد، در Scheduled Actions ووکامرس ردیف‌های pending را ببینید. اگر کاهش رخ می‌دهد اما نمایش به‌روز نمی‌شود، ریشه در کش صفحه است.

چرا محصولی که موجود است، «ناموجود» نمایش داده می‌شود؟ این سناریو به عدم تطابق بین _stock و _stock_status اشاره دارد. عدد موجودی مثبت است اما وضعیت روی outofstock مانده. با ویرایش محصول در پیشخوان ووکامرس، این ناسازگاری رفع می‌شود.

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

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

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

چرا موجودی در محصولات متغیر اشتباه نمایش داده می‌شود؟ در محصولات متغیر، عدد والد معمولاً مجموع واریانت‌ها است. اگر یک واریانت عدد اشتباه داشته باشد، والد هم اشتباه نشان می‌دهد. عدد هر واریانت را جداگانه بررسی کنید.

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

چرا موجودی در موبایل با دسکتاپ فرق دارد؟ ریشه معمولاً در قالب یا CDN است. تفاوت رفتار را در Network مرورگر مقایسه کنید و مطمئن شوید کش مسیر محصول در CDN به‌درستی تنظیم شده است.

آیا می‌توان بدون از دست دادن داده، موجودی همه محصولات را بازسازی کرد؟ بله، اما نیازمند اسکریپت دقیق است. ابتدا بکاپ کامل بگیرید، سپس با کوئری دیتابیس، متای گم‌شده را شناسایی و با مقادیر پیش‌فرض پر کنید. حتماً روی استجینگ تست کنید.

از تشخیص تا معماری قابل‌اعتماد موجودی

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

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

اگر در پروژه‌ای با مشکل مشابه دست‌وپنجه نرم کرده‌اید، برای من جالب است بدانم کدام لایه بیشترین وقت شما را گرفت: وضعیت موجودی، همگام‌سازی CRON، کش یا قالب. تجربه‌تان را در دیدگاه‌ها بنویسید؛ مخصوصاً اگر نشانه‌ای کشف کرده‌اید که در این فهرست نبوده. همین نشانه‌ها، دقیق‌ترین راهنمای نفر بعدی‌اند. 📦