بهینهسازی سرعت سایت وردپرسی روی هاست ضعیف؛ تجربههایی که یک شبه معجزه نمیکنند، اما کار را راه میاندازند
چند سال پیش، یکی از آشنایان دور، یک فروشگاه اینترنتی کوچک وردپرسی داشت. روی یکی از آن هاستهای اشتراکی ارزانقیمت که با ۲۰ هزار تومان میخرند و انتظار دارند سایتشان مثل برق بدرخشد. روزی زنگ زد و گفت: «طاها، این هاست مسخره دارد اعصابم را خرد میکند. وقتی خودم وارد سایت میشوم، ۱۰ ثانیه طول میکشد تا صفحه باز شود. مشتریها هم که کلاً فرار میکنند. گوگل آنالیتیکس را که باز میکنم، نرخ خروج بالای ۷۰٪ است. میگویند برو هاست بهتر بگیر، ولی فعلاً بودجه ندارم. آیا با همین هاست آشغال میشود کاری کرد؟»
لبخندی زدم و گفتم: «میشود، ولی قرار نیست جادو کنیم. قرار است مثل یک مکانیک، هر پیچ و مهرهای را که میشود سفت کرد، سفت کنیم تا این ماشین لااقل روی سه چرخ هم که شده، راه برود.»
وارد پیشخوان وردپرسش شدم. ۳۴ افزونه فعال داشت (از جمله ۳ تا اسلایدر، ۲ تا صفحهساز، و یک افزونهٔ «آب و هوا» که فقط خدا میدانست چرا نصب شده). قالبش یک غول چندمنظوره بود با ۴۰ افزونهٔ اجباری همراهش. عکسهای محصولات را مستقیم از دوربین عکاسی با حجم ۵ مگابایت آپلود کرده بود. هیچ کشی فعال نبود. LCP در PageSpeed Insights برای موبایل ۱۲ ثانیه بود. آن هم روی هاستی که خودش ۲ ثانیه طول میکشید تا اولین بایت را تحویل بدهد (TTFB).
تا آخر شب، بدون اینکه یک ریال برای هاست جدید خرج کنم، LCP را از ۱۲ ثانیه به ۲.۸ ثانیه رساندم. نرخ خروج ۴۰٪ کم شد و فروشها ۲۵٪ رشد کرد. آن آشنایمان هنوز هم روی همان هاست قدیمی است (البته توصیه کردم زودتر مهاجرت کند)، ولی لااقل بنگاهش تعطیل نشد.
در این مقاله، همان نکاتی را مینویسم که در آن شب و شبهای مشابه دیگر، برای نجات وردپرسهای اسیر هاست ضعیف انجام دادم. قرار نیست معجزه کنی، ولی میتوانی با این قدمها، نفسی به سایتت بدهی تا مشتریانت فرار نکنند.
چرا سرعت حتی روی هاست ضعیف حیاتی است؟
گوگل رسماً گفته Core Web Vitals یک فاکتور رتبهبندی است. اما برای یک فروشگاه کوچک، سرعت فقط سئو نیست، بقا است. آمار میگوید:
اگر لود سایت بیشتر از ۳ ثانیه طول بکشد، ۵۳٪ کاربران موبایل آن را ترک میکنند.
هر ۱ ثانیه تأخیر، نرخ تبدیل را ۷٪ کاهش میدهد.
کاربر ایرانی که اینترنت موبایل ناپایداری دارد، صبرش حتی کمتر از میانگین جهانی است.
هاست ضعیف یعنی TTFB بالا (زمان پاسخگویی سرور). اما TTFB فقط یک تکه از پازل است. اگر بتوانی بقیهٔ تکهها (تصاویر، کدها، کش) را بهینه کنی، میتوانی بار سنگین را از دوش سرور برداری و تجربهٔ کاربری را نجات دهی.
قدم صفر: قبل از هرچیز، ببین چه خبر است
قبل از دست بردن به تنظیمات، یک بنچمارک از وضعیت فعلی بگیر تا بعداً بفهمی چه تغییری کرده.
با PageSpeed Insights برای موبایل و دسکتاپ تست کن. سه معیار اصلی LCP، FID (یا INP جدید) و CLS را یادداشت کن.
با GTmetrix تست کن، به نمودار Waterfall نگاه کن. ببین کدام فایلها بیشترین زمان را میگیرند (Time to First Byte بالا یعنی هاست مقصر است. فایلهای CSS و JS بزرگ یعنی باید فشرده شوند. عکسهای غولپیکر یعنی باید بهینه شوند).
اگر هاستت Apache است، فایل
htaccess.را میتوانی ویرایش کنی. اگر Nginx است، تنظیمات سرور در اختیارت نیست (مگر اینکه پشتیبان هاست کاری کند). من فرض میکنم Apache و هاست اشتراکی با دسترسی محدود داری.
قدم اول: افزونهها را با قیچی باغبانی هرس کن – یک قاتل خاموش
هر افزونه یعنی تعداد فایلهای PHP بیشتری که باید روی هر درخواست لود شوند. روی هاست ضعیف، این یعنی عذاب.
افزونههای غیرضروری را غیرفعال و حذف کن. اسلایدرها، افزونههای شبکههای اجتماعی که فقط یک دکمه نشان میدهند، صفحهسازهایی که فقط یکبار استفاده کردهای و حالا بیکارند، افزونههای «آب و هوا»، «فال حافظ» و… همه را بریز دور.
افزونههایی که کار مشابه میکنند را یکی کن. آیا هم Yoast SEO داری هم Rank Math؟ یکی کافی است. آیا هم WP Rocket داری هم W3 Total Cache؟ یکی را انتخاب کن.
حواست به افزونههای سنگین در صفحات خاص باشد. مثلاً یک افزونهٔ فرمساز گرانقیمت که فقط در صفحهٔ «تماس با ما» استفاده میشود، نباید در تمام صفحات لود شود. با افزونهای مثل Asset CleanUp یا Perfmatters میتوانی تعیین کنی که کدام افزونه در کدام صفحه فعال باشد. من برای یک سایت، با غیرفعالکردن Contact Form 7 در همهٔ صفحات جز صفحهٔ تماس، ۲۰ درخواست HTTP در هر صفحه کم کردم.
قدم دوم: کش، ریههای سایت روی هاست ضعیف
اگر هاست ضعیف است، کش تنها چیزی است که میگذارد نفس بکشی. کش یعنی به جای اینکه وردپرس برای هر بازدیدکننده، از صفر PHP را اجرا کند و دیتابیس را به زانو درآورد، یک نسخهٔ HTML ایستا تحویل دهد.
۱. افزونهٔ کش انتخاب کن
WP Rocket (پولی): بهترین انتخاب. حتی روی هاست ضعیف هم خوب کار میکند. تنظیماتش ساده است و خیلی از بهینهسازیها (فشردهسازی، lazy load، پیشبارگذاری کش) را یکجا دارد.
اگر بودجه نداری، W3 Total Cache (رایگان) یا WP Super Cache (ساده و رایگان) استفاده کن. WP Super Cache را روی حالت «Simple» بگذار و «Preload» را فعال کن تا صفحات مهم از قبل کش شوند.
۲. تنظیمات حیاتی کش
Page Cache: حتماً فعال شود. روش «Disk» برای هاست اشتراکی خوب است. اگر Redis داری که بهتر، ولی معمولاً هاستهای ارزان ندارند.
Browser Cache: برای فایلهای CSS، JS و تصاویر یک expire حداقل ۳۰ روزه بگذار. این کار باعث میشود مرورگر کاربر، دفعهٔ بعد فایلها را از حافظهٔ خودش بخواند، نه از سرور ضعیف تو.
Gzip Compression: در افزونهٔ کش یا در htaccess. فعالش کن. محتوای HTML، CSS و JS را قبل از ارسال به مرورگر فشرده میکند. کاهش حجم تا ۷۰٪. در htaccess. میتوانی با کد زیر فعال کنی (اگر سرور Apache باشد):
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript</IfModule>
قدم سوم: تصاویر، فیلهای خاکستری که پشت در کمین کردهاند
روی هاست ضعیف، بدترین ضربه را تصاویر سنگین میزنند، چون پهنای باند سرور را هم میخورند و هم دیر لود میشوند. در آن فروشگاه کوچک، ۷۰٪ حجم کل صفحه عکسهای محصولات بود.
۱. با یکبار برای همیشه تصاویر را رژیم بده
افزونهٔ Imagify، ShortPixel یا Smush نصب کن و تنظیم کن که همهٔ تصاویر موجود را یکباره فشرده کند. Imagify میتواند به طور خودکار به WebP تبدیل کند. WebP حجم را تا ۵۰٪ کمتر از JPEG میکند.
اگر تعداد عکسها زیاد است و هاستت نمیکشد، از نسخهٔ رایگان افزونهها استفاده کن که روزانه چندتا عکس بهینه میکنند، یا یک اسکریپت Python ساده بنویس که با کتابخانهٔ Pillow عکسها را پیش از آپلود فشرده کند. (من برای مشتریانم یک اسکریپت روی لوکال میزنم که یک پوشه عکس را میگیرد و همه را به WebP با کیفیت ۸۵ تبدیل میکند، بعد روی هاست آپلود میکنم. اینجوری هاست ضعیف را هم درگیر نمیکنم.)
۲. Lazy Loading را عاشقانه فعال کن
تصاویری که در پایین صفحه هستند (زیر فولد)، نباید همان لحظهٔ اول لود شوند. مرورگر باید اول محتوای اصلی را نشان دهد. WP Rocket خودش Lazy Load دارد، وگرنه افزونهٔ a3 Lazy Load یا Lazy Load by WP Rocket (رایگان) نصب کن. حتی وردپرس از نسخهٔ ۵.۵ به بعد، loading="lazy" بومی دارد. ولی افزونهها بهتر کنترل میکنند.
۳. ابعاد تصاویر را کنترل کن
دیدی که کاربر یک عکس ۴۰۰۰ در ۳۰۰۰ پیکسل آپلود میکند برای جایی که حداکثر ۸۰۰ پیکسل نمایش داده میشود؟ وردپرس خودش چند سایز میسازد، ولی بعضی قالبها سایز اصلی را هم نگه میدارند. با یک افزونه مثل Imsanity میتوانی حداکثر ابعاد آپلود را محدود کنی (مثلاً ۱۵۰۰ پیکسل عرض). یا اینکه خودت در functions.php قالب، اندازههای اضافی را حذف کنی.
قدم چهارم: فایلهای CSS و JS را مثل یک پازل مینیمال کن
در هاست ضعیف، هر درخواست اضافی (HTTP Request) یعنی انتظار بیشتر. باید فایلهای CSS و JS را تا حد ممکن کم و کوچک کنی.
۱. Minify و Combine
با افزونهٔ Autoptimize (رایگان و عالی) یا WP Rocket، گزینهٔ «Optimize CSS» و «Optimize JavaScript» را فعال کن. فایلها را Minify کن (فضاهای خالی حذف شود). اماCombine را با احتیاط انجام بده. گاهی ترکیب فایلها، بهخاطر تداخل CSS یا JS، سایت را خراب میکند. بعد از هر تغییر، با مرورگر در حالت Incognito چک کن. اگر دیدی خراب شده، Combine را غیرفعال کن، فقط Minify بماند.
۲. حذف CSS و JS غیرضروری در هر صفحه
بعضی قالبها و افزونهها، CSS و JS شان را در همهٔ صفحات لود میکنند، حتی اگر استفاده نشود. مثلاً CSS افزونهٔ ووکامرس در صفحهٔ «درباره ما» به چه درد میخورد؟ با افزونهٔ Asset CleanUp یا Perfmatters میتوانی تعیین کنی کدام فایلها در کدام صفحات لود شوند. یکبار با این کار، زمان لود یک صفحهٔ ساده را از ۴ ثانیه به ۱.۵ ثانیه کاهش دادم.
۳. بارگذاری اسکریپتها را به تعویق بینداز
اسکریپتهای غیرضروری (مثل فیسبوک، چت آنلاین، گوگل مپ) نباید سر راه رندر اولیه باشند. در Autoptimize میتوانی آنها را defer کنی یا به انتهای صفحه ببری. برای اسکریپتهای خاص، میتوانی با کد در functions.php شرط بگذاری.
قدم پنجم: دیتابیس را جارو بکش – زبالهها را بیرون بریز
هاست ضعیف معمولاً دیتابیس کندی هم دارد. اگر دیتابیس پر از زباله باشد، هر کوئری مثل یک وزنهٔ سنگین میشود.
با افزونهٔ WP-Optimize یا Advanced Database Cleaner:
بازبینیهای قدیمی نوشتهها (Post Revisions) را پاک کن. ممکن است یک نوشته ۸۰ بار بازبینی شده باشد. نگهداشتن ۳ نسخهٔ آخر کافی است.
کامنتهای اسپم و حذفشده را پاک کن.
ترنزینتهای منقضیشده (Transients) را پاک کن.
تکههای جدولها (Overhead) را بهینهسازی (Optimize) کن.
محدودیت تعداد بازبینیها: در فایل
wp-config.phpاضافه کن:define('WP_POST_REVISIONS', 3);خالی کردن سطل زباله: وردپرس را تنظیم کن که سطل زباله را خودکار هر چند روز یکبار خالی کند:
define('EMPTY_TRASH_DAYS', 7);
قدم ششم: قالب را سبک کن – یک خانهٔ چوبی به جای کاخ مرمر
روی هاست ضعیف، قالبهای چندمنظورهٔ سنگین (مثل Avada، The7، یا حتی بعضی نسخههای قدیمی) مثل یک فیل روی سقف شیروانی میمانند.
اگر میشوی، به یک قالب سبک مثل GeneratePress، Astra (با تنظیمات حداقلی)، Neve یا Kadence مهاجرت کن. این قالبها با ۲۰ کیلوبایت CSS کار میکنند، نه با ۵۰۰ کیلوبایت.
اگر همان قالب را نگه میداری، هر امکانی که استفاده نمیکنی را در تنظیمات قالب غیرفعال کن. (مثلاً انیمیشنها، آیکونهای فونتآسوم کامل، mega menu های سنگین و اسلایدرها).
از صفحهسازهای سنگین (Elementor با ویجتهای زیاد، WPBakery) فقط برای صفحات ضروری استفاده کن، و حتیالامکان برای صفحات تکراری (مثل محصولات) از بلوکهای سادهٔ گوتنبرگ بهره ببر.
قدم هفتم: فونتها را از گوگل دانلود نکن، میزبان خودت باش
فونتهای گوگل، از یک سرور خارجی بارگذاری میشوند. روی اینترنت ایرانی، این یعنی تأخیر بیشتر و بلوکه شدن احتمالی. چه برسد به هاست ضعیف که سرعت اتصالش به بیرون هم کم است.
از افزونهای مثل OMGF یا Self-Hosted Google Fonts استفاده کن تا فونتها را روی هاست خودت ذخیره کند و از دامنهٔ خودت سرو بدهد.
حتی بهتر: اگر میتوانی، از فونتهای سیستمی استفاده کن. در CSS بنویس
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;این سریعترین راه است.فقط وزنهای ضروری فونت را نگه دار. اگر از ۴ وزن مختلف یک فونت استفاده میکنی، ۲ وزن کافی است.
قدم هشتم: CDN را به کمک طلب کن – دوست هاست ضعیف
هاست اشتراکی پهنای باند و قدرت پردازش محدودی دارد. اگر تصاویر، CSS و JS را از یک شبکهٔ توزیع محتوا (CDN) سرو بدهی، بار سنگینی از دوش سرور برداشته میشود.
Cloudflare رایگان است و یک کلیک فعال میشود. نه تنها محتوا را کش میکند، بلکه یک سپر امنیتی هم هست. حتی اگر TTFB سرور ضعیف باشد، Cloudflare میتواند نسخهٔ کششدهٔ HTML را هم سرو بدهد (با فعالسازی APO برای وردپرس، یا با یک Page Rule). این یعنی کاربران به جای سرور کند تو، نسخهٔ کششدهٔ ابر آروان یا Cloudflare را میبینند.
اگر بودجه داری، ArvanCloud (ایرانی) تأخیر کمتری دارد. رایگانش هم قابل قبول است.
قدم نهم: Heartbeat API و Cron را مهار کن – مصرف بیرویهٔ CPU
Heartbeat API وردپرس مدام درخواستهای AJAX به سرور میفرستد (مثلاً برای ذخیرهٔ خودکار نوشتهها). روی هاست ضعیف، این میتواند CPU را به ۱۰۰٪ برساند. با افزونهٔ Heartbeat Control by WP Rocket (رایگان) سرعت تپش را به ۶۰ ثانیه کاهش بده، یا کلاً در فرانتاند غیرفعالش کن (فقط در ویرایشگر نوشته فعال باشد).
WP-Cron (زمانبندی وظایف وردپرس) به جای اینکه توسط cron واقعی سرور اجرا شود، هر بار که بازدیدی میآید، چک میکند. این روی هاست ضعیف بد است. در
wp-config.phpاضافه کن:define('DISABLE_WP_CRON', true);و سپس یک cron job واقعی در هاست (اگر cPanel داری) تنظیم کن تاwp-cron.phpرا مثلاً هر ۱۵ دقیقه یکبار اجرا کند. اگر هاستت cron job ندارد، همانDISABLE_WP_CRONرا نگذار، چون وظایف مهمی مثل زمانبندی پستها میخوابد.
قدم دهم: جستجوی داخلی و فیدها را محدود کن
جستجوی وردپرس (
?s=) معمولاً دیتابیس را کند میکند. اگر سایتت بزرگ است، از یک موتور جستجوی خارجی مثل Algolia (رایگان برای حجم کم) استفاده کن، یا جستجو را محدود کن.فیدهای RSS میتوانند بودجهٔ کرال و منابع سرور را هدر دهند. اگر سایتت خبری نیست، میتوانی فیدها را غیرفعال کنی. در
functions.php:
function disable_feed() { wp_die( __('No feed available, please visit our <a href="'. get_bloginfo('url') .'">homepage</a>!') );}add_action('do_feed', 'disable_feed', 1);add_action('do_feed_rdf', 'disable_feed', 1);add_action('do_feed_rss', 'disable_feed', 1);add_action('do_feed_rss2', 'disable_feed', 1);add_action('do_feed_atom', 'disable_feed', 1);قدم یازدهم: یک htaccess. بهینه برای هاست اشتراکی
اگر هاستت Apache است، میتوانی با چند خط کد، سرعت را بهتر کنی:
# فعال سازی Gzip<IfModule mod_deflate.c>AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript text/javascript</IfModule># کش مرورگر<IfModule mod_expires.c>ExpiresActive OnExpiresByType image/jpg "access plus 1 year"ExpiresByType image/jpeg "access plus 1 year"ExpiresByType image/gif "access plus 1 year"ExpiresByType image/png "access plus 1 year"ExpiresByType image/webp "access plus 1 year"ExpiresByType text/css "access plus 1 month"ExpiresByType application/javascript "access plus 1 month"</IfModule># جلوگیری از Hotlinking (اختیاری)RewriteEngine onRewriteCond %{HTTP_REFERER} !^$RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?yoursite.com [NC]RewriteRule .(jpg|jpeg|png|gif|webp)$ - [NC,F,L]یک مطالعهٔ موردی واقعی: همان فروشگاه کوچک
وضعیت اولیه:
هاست اشتراکی ۲۰ هزار تومانی، ۳۴ افزونه، قالب سنگین.
LCP: ۱۲.۲s، TTFB: ۲.۳s.
ترافیک روزانه: ۲۰۰ بازدید، نرخ پرش ۷۵٪.
اقدامات (۴ ساعت کار):
حذف ۲۲ افزونهٔ غیرضروری (ماند ۱۲ تا).
نصب WP Super Cache با Preload.
نصب Imagify و فشردهسازی ۸۰۰ عکس به WebP (با همان کیفیت).
فعالسازی Lazy Load.
نصب Autoptimize برای Minify CSS/JS.
تغییر فونتها به فونت سیستمی و قطع بارگذاری فونت گوگل.
غیرفعالسازی Heartbeat در فرانتاند.
بهینهسازی دیتابیس (حذف ۱۲ هزار بازبینی قدیمی).
فعالسازی Cloudflare رایگان.
نتیجه بعد از ۴۸ ساعت:
| معیار | قبل | بعد |
|---|---|---|
| LCP (موبایل) | ۱۲.۲s | ۲.۸s |
| TTFB (تهران) | ۲.۳s | ۱.۱s (با Cloudflare) |
| حجم صفحه اصلی | ۶.۸ MB | ۱.۲ MB |
| نرخ پرش | ۷۵٪ | ۴۸٪ |
| فروش روزانه | ۳-۴ | ۷-۸ |
تأکید میکنم: این یک راهحل دائمی نیست. هاست ضعیف همیشه مثل یک سقف چکهکننده میماند. اما تا وقتی که مهاجرت به یک هاست بهتر را در برنامه نداری، این تنظیمات میتوانند سایتت را زنده نگه دارند.
نتیجهگیری: روی هاست ضعیف، تو باید به جای وزنهبردار، ژیمناست باشی
هاست ضعیف یعنی محدودیت. اما محدودیت، خلاقیت میآورد. وقتی نتوانی قدرت پردازش سرور را زیاد کنی، یاد میگیری که چطور هر بایت اضافی را بتراشی، هر افزونهٔ بیهوده را حذف کنی، و با کش و CDN، محتوایت را از چنگ سرور کند بربایی. این مهارتها برای یک سئوکار، حتی وقتی هاست قوی هم داشته باشی، به کارت میآید.
من طاها هستم. ۱۵ سال است که با وردپرس، PHP و Python، جان به لبهای سایتهای گرفتار در هاستهای ضعیف دادهام. اگر سایت وردپرسیات روی یک هاست بینفس افتاده و نمیدانی از کجا شروع کنی، با طاها حرف بزن. شاید یک جلسه مشاوره، همان کاری را بکند که آن شب برای فروشگاه کوچک کرد: نفسی تازه قبل از مهاجرت بزرگ.