چرا پیشخوان وردپرس شما در ایران کند است یا خطای ۵۰۰ میدهد؟ (و چطور برای همیشه حلش کنیم)
خلاصه مطلب
اگر سایت وردپرسی دارید و هر بار که وارد پیشخوان میشوید انگار در حال باز کردن یک سایت با اینترنت دیالآپ هستید، یا بدتر از آن با خطای ۵۰۰ «Internal Server Error» روبرو میشوید، مشکل از هاست شما نیست. ریشه اصلی این است که وردپرس بهطور پیشفرض مدام در حال تماس با سرورهای خارجی است — از wordpress.org برای چک کردن آپدیتها گرفته تا Google Fonts برای بارگذاری فونت — و در ایران این تماسها یا timeout میشوند یا آنقدر کند پاسخ میدهند که پردازشهای PHP سرور شما پشت سر هم در صف انتظار گیر میکنند و نهایتاً سایت کرش میکند. در این مقاله دقیقاً میبینیم این اتفاق چطور میافتد و با چند راهحل ساده ولی قطعی، چطور میتوانید این چرخه معیوب را متوقف کنید.
چرا پیشخوان وردپرس شما در ایران کند میشود؟
وقتی وارد پیشخوان وردپرس میشوید، در ظاهر فقط یک صفحه HTML ساده بارگذاری میشود. اما پشت صحنه، وردپرس دارد چندین کار سنگین انجام میدهد.
وردپرس بهطور خودکار وضعیت آپدیتها را بررسی میکند. برای هر افزونه، هر قالب و خود هسته وردپرس، یک درخواست جداگانه به سرورهای wordpress.org ارسال میشود تا ببیند نسخه جدیدی وجود دارد یا نه . این درخواستها فقط یک «سلام و علیک» ساده نیستند — گاهی اگر آپدیتی موجود باشد، فایلهای چند مگابایتی هم شروع به دانلود میکنند .
در شرایط عادی، این کار در چند ثانیه انجام میشود. اما در ایران، به دلیل محدودیتهای ارتباط با سرورهای خارجی، این درخواستها یا بیپاسخ میمانند یا آنقدر کند پاسخ میدهند که وردپرس باید منتظر بماند. این انتظار یعنی پردازش PHP سرور شما در حالت معلق باقی میماند. وقتی چند کاربر یا چند ربات همزمان وارد سایت شوند، دهها پردازش PHP معلق روی سرور تشکیل میشود. منابع سرور تمام میشود و در نهایت، خطای ۵۰۰ ظاهر میشود
یک مثال واقعی: یک شرکت هاستینگ ایرانی بهصراحت اعلام کرده که حتی وقتی سرور داخل ایران است، سایتهای وردپرسی بهطور پسزمینه درخواستهایی به سرورهای خارجی میفرستند و محدودیتهای ارتباطی باعث میشود این درخواستها تا زمان Timeout در حالت انتظار باقی بمانند. نتیجه این وضعیت، کندی بارگذاری و بروز خطاهای ۵۰۰ یا ۵۰۳ است
خطای ۵۰۰ دقیقاً چرا رخ میدهد؟
خطای ۵۰۰ «Internal Server Error» یعنی سرور در پردازش درخواست شما به مشکل خورده. در وردپرس، رایجترین دلایل این خطا عبارتند از:
- تداخل افزونهها یا قالب: یک افزونه ناسازگار یا کد معیوب در قالب، باعث خطای Fatal در PHP میشود
- تمام شدن فضای هاست: اگر فضای دیسک هاست پر شود، سرور نمیتواند sessionها، کشها یا لاگها را بنویسد و این میتواند جداول دیتابیس را خراب کند
- گیر کردن درخواستهای خارجی: همانطور که توضیح دادیم، انتظار طولانی برای پاسخ سرورهای خارجی میتواند منابع PHP را تمام کند و خطای ۵۰۰ بدهد
نکته مهم این است: در بسیاری از موارد، مشکل از هاست نیست. یک کاربر ایرانی در انجمن پشتیبانی وردپرس فارسی دقیقاً همین تجربه را داشت — پشتیبانی هاست به او گفت مشکل از افزونههاست و کد مسدودسازی درخواستهای خارجی را پیشنهاد داد، اما مشکل حل نشد . این نشان میدهد باید ریشهایتر به موضوع نگاه کرد.
راهحل اول: مسدود کردن درخواستهای خارجی وردپرس
مؤثرترین و سریعترین راهحل، این است که به وردپرس بگویید دیگر با دنیای خارج تماس نگیرد. دو روش برای این کار وجود دارد:
روش ساده (بدون کدنویسی): استفاده از افزونه Airplane Mode
افزونهای به نام Airplane Mode دقیقاً مثل حالت پرواز موبایل عمل میکند: تمام اتصالات خارجی وردپرس را مسدود میکند . نصبش کنید، فعالش کنید و تفاوت را ببینید. این افزونه مانع از لود فایلهای بیرونی، چک کردن آپدیتها و تماس با سرورهای خارجی میشود.
روش حرفهای (کدنویسی ساده): مسدودسازی در فایل wp-config.php
اگر به هاست دسترسی دارید، میتوانید با یک خط کد، تمام درخواستهای خارجی را غیرفعال کنید:
| define( 'WP_HTTP_BLOCK_EXTERNAL', true ); |
این کد را در فایل wp-config.php (در روت سایت) اضافه کنید . از این به بعد، وردپرس دیگر تلاش نمیکند به سرورهای خارجی وصل شود.
سایت شما سریعتر میشود و خطاهای ۵۰۰ ناشی از Timeout از بین میروند. اما یک نکته مهم: با فعال کردن این کد، آپدیت خودکار وردپرس، افزونهها و قالبها غیرفعال میشود. این یعنی باید آپدیتها را دستی انجام دهید. این بهایی است که برای سرعت و پایداری در ایران میپردازید.
راهحل دوم: مسدودسازی هدفمند دامنههای خاص
اگر نمیخواهید همه درخواستهای خارجی را مسدود کنید (مثلاً چون از درگاه پرداخت خارجی استفاده میکنید)، میتوانید فقط دامنههای مشکلساز را مسدود کنید .
کد زیر را در فایل functions.php قالب خود (یا بهتر است در یک افزونه اختصاصی) قرار دهید:
| add_filter( 'pre_http_request', function( $preempt, $args, $url ) { $blocked_domains = [ 'elementor.com', 'github.com', 'yoast.com', 'yoa.st', 'w.org', // wordpress.org 'unyson.io', 'siteorigin.com', 'woocommerce.com', 'fonts.googleapis.com', 'fonts.gstatic.com', ]; $pattern = '#(' . implode('|', array_map('preg_quote', $blocked_domains)) . ')#i'; if ( preg_match($pattern, $url) ) { return new WP_Error( 'http_request_blocked', 'درخواست به دامنههای خارجی مسدود شده است: ' . $url ); } return $preempt; }, 10, 3 ); |
این کد فقط دامنههایی که در لیست مشخص کردهاید را مسدود میکند و بقیه درخواستها (مثل درگاه پرداخت) کار میکنند
راهحل سوم: غیرفعال کردن WP-Cron (مهم و کمتر شناختهشده)
وردپرس یک سیستم زمانبندی داخلی به نام WP-Cron دارد که وظایف دورهای مثل چک کردن آپدیتها، انتشار نوشتههای زمانبندیشده و پاکسازی را انجام میدهد. مشکل اینجاست که WP-Cron هر بار که کسی از سایت بازدید میکند فعال میشود و این میتواند بار پردازشی زیادی روی سرور ایجاد کند .
در ایران، WP-Cron میتواند بدتر هم بشود: وقتی یک وظیفه زمانبندیشده تلاش میکند به سرور خارجی وصل شود و timeout میخورد، این چرخه مدام تکرار میشود و منابع سرور را میخورد .
راهحل: WP-Cron را غیرفعال کنید و بهجایش یک Cron واقعی در سرور تنظیم کنید . کد زیر را در wp-config.php اضافه کنید:
| define( 'DISABLE_WP_CRON', true ); |
سپس از پشتیبانی هاست بخواهید یک Cron Job واقعی در سرور تنظیم کند که هر ۵ دقیقه آدرس زیر را فراخوانی کند:
| https://yourdomain.com/wp-cron.php?doing_wp_cron |
این کار باعث میشود وظایف زمانبندیشده از حالت «هر بار که کسی وارد سایت شد» به حالت «یک بار هر ۵ دقیقه، مستقل از ترافیک» تغییر کند
راهحل چهارم: حذف فونتهای گوگل
یکی از رایجترین درخواستهای خارجی که حتی در پیشخوان وردپرس هم دیده میشود، فونتهای Google Fonts هستند . قالبها و افزونههای زیادی (مخصوصاً آنهایی که ظاهر پیشخوان را سفارشی میکنند) از fonts.googleapis.com فونت لود میکنند.
راهحل: در تنظیمات قالب یا افزونهای که از Google Fonts استفاده میکند، گزینه استفاده از فونت گوگل را غیرفعال کنید و بهجایش یک فونت محلی (مثل وزیرمتن) بارگذاری کنید . اگر قالب گزینهای برای این کار ندارد، میتوانید دامنههای fonts.googleapis.com و fonts.gstatic.com را در لیست مسدودسازی کد بخش قبل اضافه کنید.
آپدیتهای دستی: بهایی که باید بپردازید
وقتی درخواستهای خارجی وردپرس را مسدود میکنید، دیگر نمیتوانید از پیشخوان آپدیت کنید. این یعنی باید آپدیتها را دستی انجام دهید.
آپدیت دستی افزونهها: فایل ZIP افزونه را از یک منبع (اگر دسترسی دارید) دانلود کنید، به پیشخوان بروید، افزونهها ← افزودن افزونه ← بارگذاری افزونه، فایل ZIP را انتخاب کنید و گزینه «جایگزینی نسخه فعلی با فایل بارگذاریشده» را بزنید .
آپدیت دستی وردپرس: فایل ZIP آخرین نسخه وردپرس را از wordpress.org دانلود کنید (این یک بار در ماه قابل تحمل است)، پوشه wp-content و فایل wp-config-sample.php را از آن حذف کنید، سپس از طریق FTP پوشههای wp-admin و wp-includes قدیمی را حذف کرده و پوشههای جدید را آپلود کنید
جمعبندی و نتیجهگیری
کندی پیشخوان وردپرس و خطای ۵۰۰ در ایران یک مشکل «هاستی» یا «افزونهای» نیست؛ یک مشکل ساختاری ناشی از وابستگی وردپرس به سرورهای خارجی است. وردپرس ذاتاً برای دنیای بدون محدودیت طراحی شده و فرضش این است که همیشه میتواند به wordpress.org، Google Fonts و سایر سرویسهای بینالمللی دسترسی داشته باشد. در ایران، این فرض فروپاشیده است. راهحل قطعی این است که این وابستگی را عامدانه قطع کنید: با مسدودسازی درخواستهای خارجی در wp-config.php، غیرفعال کردن WP-Cron و تنظیم یک Cron واقعی در سرور، حذف فونتهای گوگل و آپدیت دستی. این کار ممکن است کمی ناخوشایند باشد چون آپدیت خودکار را از دست میدهید، اما در عوض سایت شما سریع، پایدار و بدون خطاهای ۵۰۰ خواهد بود — چیزی که برای هر سایت ایرانی حیاتی است.
ثبت نظر جدید
هنوز نظری ثبت نشده است. اولین نفر باشید!