این آموزش از یک تجربه واقعی در شبکه وب ساخته شده است. هدف آن آموزش یک روش قابل تکرار است: چگونه وقتی وردپرس با خطای بحرانی یا HTTP 500 از دسترس خارج میشود، بدون آزمونوخطای کورکورانه، عامل واقعی را پیدا کنیم و سایت را با کمترین ریسک برگردانیم.
این آموزش برای چه کسی مناسب است؟
مخاطب اصلی این مقاله طراحان و متخصصان در حال رشد هستند؛ اما صاحبان کسبوکاری که سایت وردپرسی دارند نیز با خواندن بخشهای غیرکدنویسی آن میتوانند بفهمند هنگام یک خطای بحرانی چه اطلاعاتی باید از طراح یا پشتیبان هاست بخواهند.
اصل اول: آخرین کاری که انجام دادهاید لزوماً مقصر نیست
در این پرونده، پیش از بروز مشکل روی یک صفحه پیشنویس کار شده بود و سایت پس از آخرین ذخیرهسازی سالم بود. چند ساعت بعد، کل سایت با خطای بحرانی روبهرو شد. همین فاصله زمانی یک نکته مهم را نشان میدهد: ممکن است در این میان هسته وردپرس، افزونهای یا تنظیمی در سرور بهصورت خودکار تغییر کرده باشد.
قاعده عیبیابی: بهجای پرسیدن «آخرین بار چه چیزی را تغییر دادم؟»، بپرسید «از آخرین وضعیت سالم تا لحظه خطا چه چیزی در سیستم تغییر کرده است؟»
مرحله ۱: مشخص کنید مشکل ظاهری است یا اجرایی
اگر صفحه فقط بههمریخته است، احتمالاً با CSS، کش یا فایلهای استاتیک سروکار دارید. اما اگر صفحه اصلی، پیشخوان یا REST API با خطای 500 پاسخ میدهد، باید احتمال خطای PHP یا توقف اجرای وردپرس را جدی بگیرید.
| نشانه | احتمال اصلی | اولین بررسی |
|---|---|---|
| صفحه باز میشود اما ظاهر خراب است | CSS، کش یا فایل استاتیک | بازسازی CSS و پاکسازی کش |
| HTTP 500 یا خطای بحرانی | PHP، افزونه، قالب یا هسته | Debug Log و Error Log |
| فقط پیشخوان مشکل دارد | افزونه مدیریتی یا خطای Admin | لاگ و افزونههای مرتبط |
| سایت و REST API هر دو قطعاند | Fatal Error در زمان اجرای وردپرس | ثبت خطای PHP |
مرحله ۲: بهجای غیرفعالکردن تصادفی افزونهها، فرضیه بسازید
یکی از اشتباههای رایج این است که با دیدن خطای بحرانی، همه افزونهها را یکییکی خاموش کنیم. این روش گاهی جواب میدهد، اما ممکن است زمانبر باشد و سرنخهای مهم را از بین ببرد.
روش بهتر این است که هر آزمایش یک سؤال مشخص داشته باشد. مثلاً: آیا افزونهای که اخیراً با آن کار کردهایم عامل خطاست؟ اگر آن را موقتاً غیرفعال کردیم و خطا باقی ماند، باید فرضیه را کنار بگذاریم و سراغ شواهد بعدی برویم.
مرحله ۳: لاگ وبسرور را بخوانید، اما هر خطایی را علت اصلی ندانید
در لاگ Nginx این پرونده، نبودن favicon و یک فایل CSS ثبت شده بود. چنین خطاهایی میتوانند مهم باشند، اما نبودن یک فایل CSS معمولاً باعث توقف کامل PHP و نمایش Fatal Error نمیشود.
لاگ چیست؟
لاگ، گزارش رخدادهای فنی سیستم است. تفاوت عیبیابی حرفهای با حدسزدن در همینجاست: لاگ به شما میگوید سیستم در لحظه خطا چه اتفاقی را ثبت کرده است.
مرحله ۴: تغییرات خودکار را بررسی کنید
یکی از مهمترین سرنخها، زمان تغییر فایلهای اصلی وردپرس بود. بررسی نسخه هسته نشان داد وردپرس به نسخه جدید ارتقا یافته است؛ در حالی که مدیر سایت شخصاً دکمه بهروزرسانی را نزده بود.
این یعنی یک سایت میتواند بدون دخالت مستقیم شما تغییر کند. بهروزرسانی خودکار هسته یا افزونهها ممکن است ناسازگاریای را آشکار کند که تا روز قبل وجود نداشته است.
درس مهم: وقتی خطا «ناگهانی» است، تاریخ و ساعت آخرین تغییر فایلهای هسته و افزونهها را با زمان شروع خطا مقایسه کنید.
مرحله ۵: Debug را خصوصی فعال کنید
اگر پیام عمومی وردپرس علت را نشان نمیدهد، میتوان گزارشگیری داخلی وردپرس را فعال کرد. قبل از هر ویرایش، از فایل wp-config.php نسخه پشتیبان بگیرید.
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
با این تنظیم، خطا به بازدیدکننده نمایش داده نمیشود و جزئیات آن در فایل wp-content/debug.log ثبت میشود. روی سایت زنده، نمایش مستقیم خطاها به کاربر توصیه نمیشود.
مرحله ۶: به دنبال اولین Fatal Error معنادار بگردید
در این تجربه، debug.log بالاخره سرنخ قطعی را نشان داد: یک TypeError در کد سازگاری Cloudflare داخل افزونه کش. تابع substr() انتظار رشته داشت، اما یک مقدار عددی دریافت میکرد.
PHP Fatal error: Uncaught TypeError:
substr(): Argument #1 ($string) must be of type string, int given
این نقطه، تفاوت میان «حدس» و «تشخیص» بود. از اینجا دیگر میدانستیم کدام فایل، کدام بخش و کدام نوع داده باعث توقف اجرای PHP شده است.
مرحله ۷: عامل مشکوک را ایزوله کنید
برای اثبات اینکه افزونه کش عامل مستقیم خطاست، افزونه بهصورت موقت غیرفعال شد. بلافاصله سایت، پیشخوان و REST API دوباره در دسترس قرار گرفتند. این آزمایش رابطه علت و معلولی را تأیید کرد.
نکته مهمتر اینکه صرفاً بهروزرسانی افزونه مشکل را حل نکرد؛ نسخه جدید نیز در همان محیط ناسازگاری را تکرار کرد. بنابراین «همهچیز را آپدیت کن» همیشه پاسخ مناسبی برای یک خطای بحرانی نیست.
مرحله ۸: بین راهحل اضطراری و راهحل پایدار فرق بگذارید
غیرفعالکردن افزونه، سایت را برگرداند؛ اما این یک راهحل اضطراری بود. اصلاح کد ناسازگار میتواند یک Patch فنی باشد، ولی چون فایل افزونه در بهروزرسانی بعدی بازنویسی میشود، نباید آن را بدون مستندسازی و آزمایش، راهحل دائمی تلقی کرد.
| اقدام | هدف | ریسک |
|---|---|---|
| غیرفعالکردن افزونه خطاکار | بازیابی فوری سایت | از دست رفتن موقت قابلیت افزونه |
| بهروزرسانی افزونه | استفاده از اصلاح رسمی | ممکن است ناسازگاری باقی بماند |
| Patch محلی کد | رفع TypeError مشخص | بازنویسی در آپدیت بعدی |
| گزارش به سازنده/پشتیبان | رسیدن به راهحل پایدار | نیازمند زمان پیگیری |
مرحله ۹: بعد از بالا آمدن سایت، عیبیابی تمام نشده است
پس از بازیابی سایت باید آثار جانبی بررسی شوند: کش پاک شود، فایلهای CSS صفحهساز بازسازی شوند، REST API آزمایش شود، صفحات مهم و فرمها کنترل شوند و دوباره انتهای debug.log بررسی شود.
همچنین اگر Debug را برای عیبیابی روشن کردهاید، پس از پایان کار آن را خاموش کنید و فایل لاگ تشخیصی را در محل امن نگه دارید.
چکلیست عملی عیبیابی خطای بحرانی وردپرس
- از فایلها و دیتابیس نسخه پشتیبان بگیرید.
- بررسی کنید خطا فقط ظاهری است یا HTTP 500/Fatal Error رخ داده است.
- زمان آخرین وضعیت سالم سایت را ثبت کنید.
- تغییرات خودکار هسته، قالب و افزونهها را بررسی کنید.
- لاگ وبسرور و PHP را بخوانید.
- در صورت نیاز، Debug Log وردپرس را بهصورت خصوصی فعال کنید.
- مسیر فایل و خط دقیق Fatal Error را پیدا کنید.
- عامل مشکوک را بهصورت کنترلشده ایزوله کنید.
- پس از بازیابی، نسخه جدید عامل خطا را جداگانه آزمایش کنید.
- CSS، کش، REST API، پیشخوان و صفحات کلیدی را دوباره تست کنید.
- Debug را خاموش کنید.
- علت، اقدام و نتیجه را مستند کنید تا دفعه بعد از صفر شروع نکنید.
سه اشتباه رایج که زمان عیبیابی را هدر میدهد
- مقصر دانستن آخرین ابزار استفادهشده: همزمانی یک تغییر با خطا، اثبات علت نیست.
- غیرفعالکردن کورکورانه همه افزونهها: هر آزمایش باید یک فرضیه مشخص را تأیید یا رد کند.
- توقف کار بعد از بالا آمدن سایت: بازیابی سرویس با رفع ریشهای مشکل یکی نیست.
جمعبندی: عیبیابی یعنی تبدیل خطا به شواهد
خطای بحرانی وردپرس ترسناک به نظر میرسد، اما اگر فرایند را مرحلهبهمرحله جلو ببرید، از یک پیام مبهم به یک علت مشخص میرسید. در این تجربه، بررسی HTTP 500، لاگها، تغییرات خودکار، Debug Log و آزمایش کنترلشده نشان داد مشکل از یک ناسازگاری کدنویسی در افزونه کش پس از تغییر محیط وردپرس ایجاد شده است.
قاعدهای که ارزش حفظکردن دارد: در عیبیابی حرفهای، هر مرحله باید یا یک فرضیه را رد کند یا شما را یک قدم به علت واقعی نزدیکتر کند.
اگر طراح سایت هستید، این چکلیست را برای پروژههای خود نگه دارید. اگر صاحب کسبوکار هستید، هنگام بروز خطای بحرانی از پشتیبان سایت بخواهید علت را با مسیر فایل، متن خطا و اقدام انجامشده مستند کند؛ نه اینکه فقط بگوید «مشکل رفع شد».