هر بار که یک سایت وردپرسی ناگهان سفید می‌شود، صفحه‌ها نیمه‌کاره بار می‌شوند یا سرعت از یک ثانیه به هشت ثانیه می‌پرد، اولین مظنون در تجربه من افزونه است؛ نه هاست، نه قالب و نه هک. مشکل واقعی اینجاست: وقتی سایت با بیست یا سی افزونه فعال کار می‌کند، پیدا کردن مقصر شبیه گشتن سوزن در انبار کاه است. در این راهنما، همان پروتکل گام‌به‌گامی را می‌گویم که در پروژه‌های واقعی برای شناسایی افزونه مشکل‌دار (Problematic Plugin) به کار می‌برم؛ روشی که در کمتر از یک ساعت، مقصر را از میان سی افزونه بیرون می‌کشد.

چرا افزونه‌ها اولین مظنون سایت‌های خراب‌اند؟

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

پیش از ادامه، یک تفکیک ذهنی لازم است: افزونه مشکل‌دار همیشه یعنی افزونهٔ بدساخت نیست. گاهی یک افزونهٔ کاملاً حرفه‌ای، با افزونهٔ دیگری بر سر یک hook مشترک رقابت می‌کند و نتیجه تعارض (Conflict) است. گاهی مقصر، خود افزونه نیست؛ ترکیب افزونه با قالب یا نسخهٔ PHP است. تفاوت این دو سناریو مهم است، چون مسیر حلشان متفاوت می‌شود. برای درک بنیادین جایگاه افزونه در معماری وردپرس، پیشنهاد می‌کنم اول مقالهٔ افزونه وردپرس چیست و چگونه انتخاب کنیم را بخوانید. اگر سایت شما کند است ولی نمی‌دانید سهم افزونه‌ها چقدر است، تأثیر افزونه‌ها بر سرعت سایت چارچوب سنجش عددی را در اختیارتان می‌گذارد.

یک الگوی آماری که هر توسعه‌دهنده‌ای پس از مدت کوتاهی کار در پشتیبانی وردپرس آن را دیده است: در اکثر پرونده‌های «سایت خراب شده» که به دستم می‌رسد، یکی از این سه سناریو تکرار می‌شود — نصب افزونهٔ جدید، آپدیت خودکار افزونه در نیمه‌شب، یا ارتقای نسخهٔ PHP توسط هاست بدون اطلاع مدیر سایت. در هر سه حالت، افزونه قربانی است؛ ولی خودِ افزونهٔ قدیمی یا کدِ ناسازگار، در واقع همان مقصر واقعی است.

افزونهٔ مشکل‌دار لزوماً کد بد نیست؛ گاهی فقط همسایهٔ بد است. تفاوت این دو، تمام مسیر درمان را عوض می‌کند.

نشانه‌های افزونه مشکل‌دار که نباید نادیده گرفت

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

نشانه‌های ظاهری

  • صفحهٔ سفید (White Screen of Death): بارزترین و بدترین نشانه؛ معمولاً بعد از فعال‌سازی یک افزونه رخ می‌دهد و ریشه‌اش خطای Fatal در PHP است.
  • نیمه‌کاره ماندن صفحه: بخشی از صفحه لود می‌شود ولی اسپینر یا فرم تماس بالاخره نمی‌آید؛ نشانهٔ تعارض در لایهٔ JavaScript یا AJAX است.
  • پرش ناگهانی قیمت یا متن: یک افزونهٔ بازاریابی که با قیمت‌های ووکامرس دست‌کاری می‌کند، ممکن است ترتیب نمایش را عوض کند.
  • نبودن منوی مدیریت در پیشخوان: بعضی افزونه‌ها با تغییر در نقش‌ها و دسترسی‌ها، مدیر را از بخشی از پیشخوان محروم می‌کنند.

نشانه‌های نامرئی

  • کندی تدریجی بدون تغییر محتوا: اگر بایت‌های صفحه ثابت مانده اما TTFB (Time To First Byte) بال می‌زند، مقصر معمولاً یک query پُرتکرار است.
  • مصرف بالای CPU در پنل هاست: یک wp-cron (زمان‌بندی خودکار وردپرس) سنگین یا یک loop بی‌پایان در کد.
  • رشد انفجاری جدول wp_options: یک افزونه که هر بازدید را در دیتابیس ذخیره می‌کند و به‌جای کش، دیتابیس را پر می‌کند.

یک جدول مقایسه‌ای که در جلسه‌های عیب‌یابی خیلی به کارم می‌آید:

نشانهمحتمل‌ترین نوع مشکلاولویت بررسی
صفحهٔ سفید بعد از فعال‌سازیخطای Fatal در PHPبالا
کندی فقط در پیشخواناسکریپت‌های مدیریتی سنگینمتوسط
خطای 500 فقط در برخی صفحاتتعارض hook در صفحه‌های خاصبالا
بالا رفتن CPU بدون ترافیکcron یا query پُرتکرارمتوسط
افزایش حجم دیتابیسلاگ‌نویسی افراطیپایین

پروتکل پنج‌مرحله‌ای شناسایی مقصر

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

مرحله اول: بکاپ و محیط تست

هیچ عیب‌یابی روی سایت زندهٔ پُرمشتری نباید بدون بکاپ شروع شود. اگر هاست‌تان محیط staging (نسخهٔ موازی سایت) دارد، این مرحله را آنجا انجام دهید. پیش از هر چیز یک بکاپ کامل از فایل‌ها و دیتابیس بگیرید — روشش در چگونه از سایت وردپرسی بکاپ بگیریم گام‌به‌گام آمده است.

مرحله دوم: غیرفعال‌سازی گروهی

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

مرحله سوم: فعال‌سازی دوبه‌دو

پُرکارآمدترین روش برای باریک کردن دایره: نیمی از افزونه‌ها را فعال کنید و ببینید مشکل برمی‌گردد یا نه. اگر برگشت، مقصر در نیمهٔ فعال است؛ اگر برنگشت، در نیمهٔ غیرفعال. با تکرار همین الگو (نصف نصف)، در حدود پنج دور به مقصر می‌رسید — نه سی دور. این همان منطق جست‌وجوی دودویی (Binary Search) است که در هر پروژهٔ عیب‌یابی به کارم می‌آید.

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

برای پیدا کردن یک افزونهٔ مقصر میان سی افزونه، به‌جای سی بار فعال‌سازی، پنج بار تقسیم دوتایی کافی است. ریاضیِ سادهٔ جست‌وجو، ساعت‌ها وقت نجات می‌دهد.

مرحله چهارم: تست با قالب پیش‌فرض

وقتی به یک افزونهٔ مشکوک رسیدید، دوباره تست را با قالب پیش‌فرض وردپرس (مثلاً Twenty Twenty-Four) اجرا کنید. اگر با قالب پیش‌فرض مشکل رفت، مقصر قالب بوده نه افزونه؛ این همان تعارض قالب-افزونه است که در خطای ناسازگاری قالب و افزونه وردپرس جزئیاتش آمده. اگر می‌خواهید بدانید پیش از هر تغییر افزونه‌ای چه چیزهایی را باید چک کنید، راهنمای بررسی سازگاری افزونه‌های وردپرس چک‌لیست دقیقی دارد.

مرحله پنجم: تست روی PHP نسخه‌های مختلف

گاهی افزونه‌ای روی PHP 7.4 بی‌مشکل است ولی روی PHP 8.2 خطا می‌دهد. اگر امکان تغییر نسخهٔ PHP را در پنل هاست دارید، یک بار روی نسخهٔ قبلی تست کنید. ناسازگاری با نسخهٔ PHP یکی از شایع‌ترین دلایل خطاهای Fatal بعد از آپدیت هاست است.

عیب‌یابی پیشرفته با Query Monitor و WP_DEBUG

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

WP_DEBUG: با فعال‌سازی این ثابت در فایل wp-config.php، وردپرس خطاهای PHP را در لاگ ذخیره می‌کند. باید هم WP_DEBUG، هم WP_DEBUG_LOG و هم WP_DEBUG_DISPLAY را با هم تنظیم کنید — وگرنه یا خطا روی صفحه چاپ می‌شود (که در سایت زنده فاجعه است) یا در جایی که فکرش را نمی‌کنید. الگوی متعارف:

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

بعد از تنظیم، فایل wp-content/debug.log را باز کنید. نام افزونه‌ای که در خطا تکرار می‌شود، معمولاً همان مقصر است.

Query Monitor: این افزونه در هر صفحه یک نوار پایین اضافه می‌کند که نشان می‌دهد کدام افزونه چه query‌هایی را اجرا کرده، کدام hook‌ها زمان‌بر بوده‌اند و چه مقدار RAM مصرف شده. اگر TTFB بالا دارید و WP_DEBUG چیزی نشان نمی‌دهد، Query Monitor در چند ثانیه مقصر را لو می‌دهد. تفاوت افزونهٔ خوب و بد در سایت‌هایی که روی هاست اشتراکی اجرا می‌شوند، دقیقاً همین‌جاست و در تأثیر افزونه‌ها بر سرعت سایت با عدد سنجیده شده است.

افزونه‌های بی‌گناهِ مقصرنما

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

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

تصمیم نهایی: حذف، جایگزینی یا تعمیر؟

بعد از آنکه مقصر را پیدا کردید، سه راه پیش رو دارید — و انتخاب اشتباه می‌تواند ماه‌ها بعد خودش را نشان بدهد.

  • حذف ساده: اگر افزونهٔ مقصر جایگزین بهتری دارد و داده‌ای در دیتابیس باقی نمی‌گذارد، همین کار را بکنید. قبل از حذف، بکاپ بگیرید.
  • جایگزینی هوشمند: افزونه‌های یک‌کارهٔ کوچک (مثلاً یک شمارندهٔ بازدیدِ درون‌سایتی یا یک اسلایدر سبک) را می‌توان با کدی در چایلد تم یا بلوک بومی گوتنبرگ جایگزین کرد؛ این مسیر برای سایت‌های کوچک همیشه امن‌ترین است.
  • تعمیر: اگر افزونهٔ حیاتی است و جایگزین مطمئنی ندارد، به سازنده تیکت بدهید یا برای رفع موقت، کد مشکل‌ساز را در چایلد تم override کنید — نه با دست‌زدن به فایل‌های خود افزونه، چون آپدیت بعدی همه‌چیز را پاک می‌کند.

یک اصل: هرگز افزونه‌ای را که داده تولید می‌کند (فرم‌ساز با آرشیو پیام‌ها، عضویت‌ساز، ووکامرس) بدون مهاجرت داده حذف نکنید. تفاوت حذف ساده و مهاجرتِ داده را در راهنمای جامع رفع خطاهای رایج وردپرس توضیح داده‌ام. و اگر افزونهٔ جدیدی که می‌خواهید نصب کنید، پیش از نصب همان پروتکل تست سازگاری را اجرا کنید — راهنمای تست و دیباگ پروژه‌های توسعه وردپرس این فرآیند را ساختارمند کرده است.

درس‌های میدانی از پروژه‌های واقعی

سه الگویی که در پرونده‌های واقعی بیشتر از همه تکرار شده‌اند:

الگوی اول — افزونهٔ جدید، سایت قدیمی: کاربری افزونهٔ تازه‌ای نصب می‌کند که روی PHP 8.2 تست شده، ولی سایت او روی PHP 7.4 است. خطای Fatal بی‌درنگ می‌آید. درمان: به‌جای حذف افزونه، نسخهٔ PHP را ارتقا بدهید؛ این کار امنیت و سرعت را هم بهتر می‌کند.

الگوی دوم — سه افزونهٔ شبیه: مدیر سایت، سه افزونهٔ مختلف برای بکاپ، سه افزونهٔ مختلف برای امنیت یا سه اسلایدر نصب می‌کند. هر افزونه در پشت صحنه یک cron می‌سازد، یک جدول دیتابیس اضافه می‌کند و یک اسکریپت در هر صفحه بار می‌گذارد. سایت با گذشت زمان آرام‌آرام کُند می‌شود و هیچ‌کس نمی‌داند چرا. درمان: یکی را نگه دارید، دو تای دیگر را حذف کنید — و حتماً جدول‌های جا‌مانده را هم پاک کنید.

الگوی سوم — نال و کرک: افزونه‌ای که از منبع نامعتبر نصب شده، بدون آپدیت می‌ماند و بعد از شش ماه خودش منبع نفوذ می‌شود. فیلترهای تشخیصِ افزونهٔ مطمئن در چگونه یک افزونه وردپرس مطمئن دانلود کنیم آمده است — این مقاله را پیش از نصب هر افزونه‌ای بخوانید. اشتباهات مشابه در انتخاب و نگهداری افزونه‌ها را در اشتباهات رایج در توسعه قالب و افزونه وردپرس فهرست کرده‌ام.

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

خط پایان

شناسایی افزونهٔ مشکل‌دار یک مهارت است، نه یک شانس. با ترتیب درست — بکاپ، غیرفعال‌سازی گروهی، تقسیم دوبه‌دو، تست با قالب پیش‌فرض و دیباگ با WP_DEBUG — در بیشتر موارد در کمتر از یک ساعت به مقصر می‌رسید. اما مهم‌تر از پیدا کردن مقصر، تصمیم درست بعد از آن است: حذف، جایگزینی یا تعمیر. تفاوت این سه تصمیم، فردا روزی خودش را در سرعت، امنیت و پایداری سایت شما نشان می‌دهد. اگر افزونهٔ مشکل‌داری داشته‌اید که بعد از حذف، سایت بهتر شد یا برعکس، بعد از حذف چیز دیگری خراب شد، تجربه‌تان را در دیدگاه‌ها بنویسید — این جزئیات برای خوانندهٔ بعدی که در همان باتلاق افتاده، ارزشمندتر از هر چک‌لیستی است. 🔧