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

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

چرا ووکامرس این‌قدر مستعد خطای افزونه است؟

ووکامرس به‌تنهایی یک افزونه ساده نیست؛ یک پلتفرم فروشگاهی کامل روی وردپرس است که ده‌ها API (Application Programming Interface یا رابط برنامه‌نویسی) در اختیار سایر افزونه‌ها می‌گذارد. هر افزونه‌ای که به سبد خرید، پرداخت، محصولات، مالیات یا ارسال دست می‌زند، در واقع در هسته ووکامرس دخالت می‌کند. حالا تصور کنید در یک فروشگاه بالغ، بیست تا چهل افزونه ووکامرسی فعال است و همه‌شان هم‌زمان به همان نقاط اتصال وصل شده‌اند. احتمال تعارض، با هر افزونه‌ای که اضافه می‌شود، نه به‌صورت خطی بلکه تقریباً به‌صورت نمایی بالا می‌رود.

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

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

خطاها را در سه دسته بشناسید

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

دستهنشانهمقصر معمول
خطای کشنده (Fatal)صفحه سفید، خطای ۵۰۰، دسترسی قطعافزونه جدید، نسخه PHP
خطای منطقیافزونه کار می‌کند ولی نتیجه اشتباه استتعارض با افزونه دیگر، تنظیمات
خطای تدریجیکندی، قفل شدن خودکار، خطای متناوبدیتابیس، کش، مصرف منابع

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

خطای اول: صفحه سفید بعد از فعال‌سازی افزونه

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

اول در wp-config.php حالت دیباگ را روشن کنید تا خطای واقعی را ببینید:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

خطاها در فایل wp-content/debug.log نوشته می‌شوند. بعد از خواندن علت واقعی، مسیر رفعش در رفع خطای Fatal error بعد از فعال‌سازی افزونه گام‌به‌گام آمده است. یک ترفند سریع که در پروژه‌ها خیلی به کارم آمده: از طریق FTP نام پوشه افزونه را موقتاً تغییر دهید تا سایت بازگردد و بعد از پنل، رفع مشکل را ادامه دهید.

خطای دوم: ناسازگاری افزونه با نسخه PHP

هر افزونه ووکامرسی، برای یک بازه مشخص از نسخه‌های PHP (Hypertext Preprocessor یا پیش‌پردازنده فرامتن) نوشته می‌شود. اگر سایت شما روی PHP نسخه ۸.۲ است ولی افزونه از نسخه ۷.۴ به بعد دیگر پشتیبانی نمی‌شود، خطاهای عجیب و غریبی ظاهر می‌شود که در نگاه اول ربطی به هم ندارند. مثلاً خطای Fatal error: Uncaught TypeError یا Deprecated که در صفحه سبد خرید ظاهر می‌شود.

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

خطای سوم: تعارض دو افزونه ووکامرسی با هم

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

روش عیب‌یابی که در پروژه‌های خودم استفاده می‌کنم:

  1. ابتدا روی یک محیط استجینگ نسخه سایت را بازسازی کنید.
  2. همه افزونه‌ها را به‌جز ووکامرس خاموش کنید.
  3. افزونه‌ها را یکی‌یکی روشن کنید تا لحظه‌ای که خطا ظاهر می‌شود.
  4. افزونه‌ای که خطا را بازگرداند، مظنون اول است؛ اما افزونه قبلی که با آن تعارض دارد را هم بررسی کنید.

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

تعارض افزونه‌ها در ووکامرس معمولاً نه از باگ، بلکه از اختلاف در فرضیات دو توسعه‌دهنده می‌آید که هیچ‌وقت با هم حرف نزده‌اند.

خطای چهارم: خطاهای AJAX در سبد خرید و پرداخت

ووکامرس برای به‌روزرسانی سبد خرید و محاسبه هزینه ارسال، از AJAX (Asynchronous JavaScript and XML) استفاده می‌کند. اگر افزونه‌ای این مسیر را مسدود کند یا پاسخ اشتباهی برگرداند، کاربر دکمه افزودن به سبد را می‌زند ولی هیچ اتفاقی نمی‌افتد. این دقیقاً همان پرونده‌ای است که در خطای افزودن به سبد خرید در ووکامرس مفصل بازش کرده‌ام.

سه مظنون رایج این خطا: فایروال افزونه امنیتی که درخواست‌های AJAX را بلاک می‌کند، افزونه کش که پاسخ را از حافظه می‌دهد بدون به‌روزرسانی، و افزونه محصولات متغیر که با هسته ووکامرس روی ساختار JSON (JavaScript Object Notation یا نشانه‌گذاری شیء جاوااسکریپت) اختلاف دارد. تشخیص سریع این نوع خطا با ابزار Chrome DevTools و تب Network انجام می‌شود؛ پاسخ دقیق سرور آنجا دیده می‌شود.

خطای پنجم: خطای کوپن و تخفیف

کوپن‌ها و تخفیف‌ها، پرمنازعه‌ترین بخش ووکامرس برای افزونه‌ها هستند. چون همه افزونه‌های بازاریابی می‌خواهند روی محاسبه قیمت نهایی اثر بگذارند، بارها می‌بینم که یک کوپن درست کار نمی‌کند یا تخفیف دو بار اعمال می‌شود. مشکل رایج دیگر: کوپنی که در حالت مهمان کار می‌کند ولی در حالت کاربر لاگین‌کرده رد می‌شود. علت معمولاً در تعارض فیلترهای woocommerce_coupon_is_valid بین چند افزونه است.

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

خطای ششم: خطای درگاه پرداخت

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

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

خطای هفتم: کندی فروشگاه بعد از افزونه جدید

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

یک آزمایش سریع که خودم هر بار انجام می‌دهم: پیش از افزودن افزونه جدید، سرعت سه صفحه کلیدی (خانه، دسته، محصول) را ثبت کنید؛ بعد از افزودن، همان سه صفحه را دوباره بسنجید. اگر افت بیش از ۲۰ درصد بود، آن افزونه ارزش هزینه‌اش را ندارد.

خطای هشتم: عدم ارسال ایمیل سفارش

این یکی از آن خطاهایی است که خود صاحب فروشگاه اغلب متوجه نمی‌شود، چون ایمیل به مشتری نمی‌رسد و مشتری هم لزوماً شکایت نمی‌کند. ولی از دید عملیاتی، یعنی مشتری تایید سفارش را نمی‌بیند و اطمینان لازم را پیدا نمی‌کند. علت‌های رایج: تعارض افزونه ایمیل با افزونه ووکامرس، تنظیمات نادرست SMTP (Simple Mail Transfer Protocol)، و مسدود شدن ایمیل توسط سرویس گیرنده به دلیل نبود رکوردهای SPF و DKIM.

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

خطای نهم: خطای به‌روزرسانی خودکار افزونه‌ها

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

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

خطای دهم: خطاهای دیتابیس و مهاجرت به HPOS

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

راه‌حل: قبل از فعال‌سازی HPOS، از ووکامرس بخواهید سازگاری افزونه‌ها را گزارش کند. اگر افزونه‌ای ناسازگار بود، یا آن را جایگزین کنید یا موقتاً HPOS را غیرفعال نگه دارید. جزئیات فنی این مهاجرت نیازمند مقاله مستقلی است که در فرصت دیگر به آن می‌پردازم؛ فعلاً بدانید که این یکی از پرونده‌های پرتکرار ۲۰۲۵ به بعد است.

روش عیب‌یابی گام‌به‌گام در محیط امن

اگر بخواهم روش شخصی‌ام را در یک دستور کار فشرده کنم، این می‌شود:

  1. قبل از هر کاری، یک بکاپ کامل از فایل و دیتابیس بگیرید.
  2. محیط استجینگ بسازید؛ روی سایت زنده تست نکنید.
  3. حالت دیباگ و لاگ را فعال کنید تا خطاها را ببینید.
  4. افزونه‌ها را دسته‌بندی کنید: ووکامرس هسته، پرداخت، ارسال، تخفیف، نمایشی، و افزونه‌های دیگر.
  5. هر دسته را جدا فعال/غیرفعال کنید تا نقطه شکست مشخص شود.
  6. وقتی مقصر پیدا شد، افزونه را به‌روز کنید یا جایگزین کنید.
  7. بعد از رفع، سناریوی کامل خرید را یک‌بار روی استجینگ تست کنید و بعد روی زنده اعمال کنید.

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

نکات پیشگیری برای تیم‌های پشتیبانی

اگر تیم پشتیبانی یک فروشگاه هستید، این عادت‌ها را در پروژه‌ها جدی بگیرید:

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

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

نگاه عمیق‌تر: افزونه‌ها به‌عنوان وابستگی نرم‌افزاری

برای مهندسانی که با معماری نرم‌افزار سروکار دارند، ارزش دارد افزونه‌های ووکامرس را به‌عنوان وابستگی نرم‌افزاری (Software Dependencies) نگاه کنند، نه قابلیت‌های اضافی. در دنیای نرم‌افزار مدرن، وابستگی‌ها با قواعد مشخصی مدیریت می‌شوند: نسخه قفل‌شده، بازبینی دوره‌ای، حذف وابستگی‌های بدون استفاده و ایزوله کردن محیط. این اصول در اکوسیستم ووکامرس هم دقیقاً صادق‌اند، ولی کمتر رعایت می‌شوند چون بستر وردپرس، این انتظام را به‌صورت پیش‌فرض تحمیل نمی‌کند.

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

دوم، در معماری‌های Headless یا همان ووکامرس به‌عنوان بک‌اند و فرانت‌اند جدا (مثلاً Next.js)، اکثر افزونه‌های ووکامرسی که روی کوکی و سشن PHP کار می‌کنند از کار می‌افتند. برای این معماری، افزونه‌ها را باید با REST API و GraphQL تطبیق داد و بسیاری از افزونه‌های قدیمی این آمادگی را ندارند. اگر پروژه شما به این سمت می‌رود، از روز اول باید افزونه‌های «REST-Friendly» انتخاب کنید، نه افزونه‌های عمومی بازار.

سوم، در سیستم‌های چند-مستأجری (Multi-Tenant) که چند فروشگاه روی یک نصب ووکامرس سرو می‌شوند، جداسازی داده‌ها در سطح افزونه‌ها به یک چالش جدی تبدیل می‌شود. بعضی افزونه‌ها فرض می‌کنند یک نصب، یک فروشگاه است و این فرض در مقیاس بزرگ می‌شکند. راه‌حل معماری درست در این سناریو، استفاده از multisite با ایزوله‌سازی دقیق افزونه‌ها یا رفتن به سمت یک معماری SaaS سفارشی است.

چهارم، در CI/CD (Continuous Integration / Continuous Deployment یا یکپارچه‌سازی و استقرار پیوسته) فروشگاه‌های ووکامرسی، مدیریت افزونه‌ها به‌صورت دستی در پیشخوان، به‌سرعت به یک نقطه کور تبدیل می‌شود. تیم‌های بالغ، افزونه‌ها را با Composer مدیریت می‌کنند، نسخه‌ها را قفل می‌کنند و استقرار را از طریق پایتون یا اسکریپت‌های مشابه انجام می‌دهند. اگر روی یک فروشگاه پرترافیک کار می‌کنید، ارزش دارد بخشی از وقت خود را به این بازسازی ساختاری بدهید؛ هزینه یک‌بار، سود مستمر.

آنچه از دل تجربه‌ها ماند

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

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

اگر در فروشگاه خودتان با خطای افزونه ووکامرس مواجه شده‌اید که در این فهرست نبوده، برایم بنویسید کدام افزونه با کدام بخش ووکامرس تعارض داشته — به‌خصوص اگر با HPOS یا با معماری Headless درگیر بوده‌اید. این سناریوها همان چیزی هستند که فهرست عیب‌یابی را برای نفر بعدی دقیق‌تر می‌کنند. 🛒