بیشتر درخواستهایی که برای بهینهسازی سرعت میگیرم، با یک اسکرینشات از PageSpeed Insights شروع میشود: یک عدد قرمز و جمله «سایتم کند است». اولین کارم معمولاً این است که بپرسم کند از نظر چه کسی؟ گاهی سایت برای کاربر واقعی کاملاً سریع است و فقط نمره ابزار پایین است. گاهی هم نمره بد نیست، اما صفحه پرداخت فروشگاه هشت ثانیه طول میکشد تا باز شود و مشتریها وسط کار رها میکنند.
این مقاله صفحه اصلی موضوع سرعت در این سایت است. روشها را به ترتیبی نوشتهام که خودم روی یک پروژه اجرا میکنم، از اثرگذارترین تا ریزهکاریها.
اول اندازه بگیرید، بعد دست بزنید
بدون اندازهگیری، نمیدانید کدام تغییر اثر داشته. قبل از هر کاری، از سه چیز یادداشت بردارید:
زمان پاسخ سرور (TTFB). چقدر طول میکشد تا اولین بایت از سرور برسد. اگر این عدد بالاست، مشکل از هاست، PHP یا پایگاهداده است و هیچ بهینهسازی سمت مرورگر جبرانش نمیکند.
معیارهای Core Web Vitals. بهخصوص LCP، یعنی زمان نمایش بزرگترین بخش صفحه. بخش «Core Web Vitals» در سرچ کنسول داده کاربران واقعی را نشان میدهد که از تست آزمایشگاهی ارزشمندتر است.
صفحات مهم، نه فقط صفحه اصلی. صفحه محصول، دسته، سبد خرید و پرداخت. صفحه اصلی معمولاً کش میشود و سریع است؛ صفحات کشنشدنی جاییاند که مشکل واقعی پنهان شده.
تست را چند بار تکرار کنید و از سرور نزدیک به کاربرانتان. نتیجه یک بار تست، مخصوصاً از سرور خارج از ایران برای سایتی که مخاطبش ایرانی است، گمراهکننده است.
هاست
اگر TTFB بالاست، از اینجا شروع کنید. نسخه PHP را به آخرین نسخه پایدار که افزونههایتان پشتیبانی میکنند برسانید؛ همین کار گاهی بدون هیچ هزینهای تفاوت محسوسی ایجاد میکند. OPcache باید فعال باشد. برای فروشگاهها و سایتهای عضویتی، کش آبجکت با Redis یا Memcached، اگر هاست پشتیبانی کند، تعداد کوئریهای تکراری را خیلی کم میکند.
اگر همه اینها درست است و سرور هنوز کند است، احتمالاً منابع هاست کافی نیست. هاست اشتراکی ارزان برای سایت معرفی ساده کافی است، اما برای فروشگاهی با چند صد محصول معمولاً نه.
کش
افزونه کش صفحه، HTML نهایی را ذخیره میکند تا برای هر بازدید، PHP و پایگاهداده درگیر نشوند. روی همین سایت از WP Rocket استفاده میکنم؛ گزینههای رایگان خوبی هم هست. فقط یکی نصب کنید. دو افزونه کش همزمان مشکلسازند.
برای فروشگاهها، مطمئن شوید سبد خرید، پرداخت و حساب کاربری کش نمیشوند. افزونههای کش معتبر این را خودکار تشخیص میدهند، اما اگر صفحه پرداخت سفارشی دارید یا درگاه آدرس بازگشت خاصی دارد، دستی مستثنا کنید. صفحه بازگشت درگاه کششده، یکی از علتهای رایج «پرداخت انجام شد ولی سفارش ثبت نشد» است که در اتصال درگاه پرداخت به ووکامرس توضیح دادهام.
یک نکته عملی که خودم بارها با آن روبهرو شدهام: بعد از هر تغییر محتوا یا تنظیمات، اگر نتیجه را نمیبینید، احتمالاً نسخه کششده را میبینید. کش را پاک کنید یا آدرس را با یک پارامتر اضافه باز کنید.
تصاویر
در بیشتر سایتهایی که بررسی کردهام، تصاویر بیشترین حجم صفحه را تشکیل میدهند. سه کار اثر بزرگی دارد:
ابعاد درست. عکسی که با عرض چهار هزار پیکسل از دوربین بارگذاری شده و در کادری سیصد پیکسلی نمایش داده میشود، رایجترین مشکل است. قبل از بارگذاری، تصویر را به اندازه منطقی کوچک کنید.
فرمت WebP. حجم را نسبت به JPEG و PNG معمولاً بهطور چشمگیری کم میکند، بدون افت محسوس کیفیت. برای همین افزونه تبدیل خودکار عکس به WebP را نوشتم که تصاویر جدید و قدیمی را تبدیل میکند و نسخه اصلی را هم نگه میدارد.
بارگذاری تنبل، به جز تصویر اول. وردپرس بهصورت پیشفرض loading=lazy اضافه میکند، که خوب است. اما تصویر اصلی بالای صفحه، که معمولاً همان عنصر LCP است، نباید تنبل بارگذاری شود. بعضی قالبها این را اشتباه انجام میدهند و LCP را بدتر میکنند.
CSS و جاوااسکریپت
اینجا جایی است که بهینهسازی بیش از حد میتواند سایت را خراب کند. فشردهسازی (minify) معمولاً بیخطر است. ترکیب فایلها با HTTP/2 اثر کمی دارد و گاهی مشکلساز است. «به تعویق انداختن جاوااسکریپت» اثر زیادی روی نمره دارد، اما ممکن است منوی موبایل، اسلایدر یا فرم را از کار بیندازد.
روش من این است که هر گزینه را جداگانه روشن میکنم و بعد از هر کدام، صفحات اصلی را روی موبایل و دسکتاپ تست میکنم: منو، جستوجو، افزودن به سبد، فرم تماس. اگر چیزی خراب شد، همان اسکریپت را از تعویق مستثنا میکنم.
بزرگترین بهبود معمولاً از حذف میآید، نه بهینهسازی. اسکریپت چت آنلاین، پیکسلهای تبلیغاتی متعدد، فونتهای اضافه و اسلایدر صفحه اصلی که کسی از اسلاید دوم به بعدش را نمیبیند.
افزونهها و قالب
تعداد افزونه بهتنهایی معیار خوبی نیست؛ ده افزونه سبک بهتر از یک افزونه سنگین است. Query Monitor نشان میدهد هر افزونه چه تعداد کوئری و چه مقدار زمان مصرف میکند. بارها پیش آمده که یک افزونه آمار بازدید یا یک افزونه «محصولات مرتبط» عامل اصلی کندی بوده است.
قالبهای همهکاره با صفحهساز، معمولاً بیشترین CSS و JS را بارگذاری میکنند، حتی در صفحاتی که از آن قابلیتها استفاده نمیشود. اگر قالب را تازه انتخاب میکنید، سرعت را از اول جزو معیارها بگذارید؛ در راهنمای راهاندازی وردپرس فارسی به این موضوع پرداختهام.
پایگاهداده
با گذشت زمان، پایگاهداده از بازنگریهای نوشتهها، transientهای منقضی، دیدگاههای اسپم و داده افزونههای حذفشده پر میشود. جدول wp_options مخصوصاً مهم است؛ گزینههایی که autoload دارند در هر بارگذاری صفحه خوانده میشوند. اگر حجم آنها زیاد است، احتمالاً افزونهای که مدتها پیش حذف شده، دادهاش را جا گذاشته.
تعداد بازنگریها را در wp-config محدود کنید و هر چند ماه یک بار، بعد از پشتیبانگیری، پاکسازی انجام دهید.
CDN
برای سایتی که مخاطبش در ایران است و سرورش هم در ایران، CDN خارجی همیشه کمک نمیکند و گاهی حتی کندتر میکند. اگر سرور خارج است یا مخاطب در چند کشور دارید، CDN برای فایلهای ثابت اثر خوبی دارد. CDNهای ایرانی هم وجود دارند. تصمیم را بر اساس اندازهگیری بگیرید، نه توصیه کلی.
کارهای پسزمینه
WP-Cron در وردپرس با بازدیدها اجرا میشود. روی سایت پربازدید، این یعنی بررسیهای مکرر و بیدلیل؛ روی سایت کمبازدید، یعنی کارهای زمانبندیشده دیر اجرا میشوند. برای هر دو حالت، بهتر است WP-Cron را غیرفعال کنید و یک کرونجاب واقعی در هاست بسازید. Heartbeat API هم در پیشخوان هر چند ثانیه درخواست میفرستد؛ اگر چند نفر همزمان پیشخوان باز دارند، فاصلهاش را بیشتر کنید.
فونتها
فونت فارسی معمولاً حجم بیشتری از فونت لاتین دارد و اگر درست بارگذاری نشود، متن تا رسیدن فونت نمایش داده نمیشود یا بعد از نمایش جابهجا میشود. سه کار انجام میدهم: فونت را روی هاست خود سایت با فرمت WOFF2 قرار میدهم، فقط وزنهایی را که واقعاً در طراحی استفاده شده بارگذاری میکنم و font-display: swap را تنظیم میکنم تا متن با فونت جایگزین فوراً نمایش داده شود.
اگر قالب فونت را از سرور خارجی مثل گوگل فونت بارگذاری میکند، آن را غیرفعال کنید. برای کاربر ایرانی، این درخواست خارجی گاهی کند است یا کامل بارگذاری نمیشود و کل صفحه را منتظر نگه میدارد. پیشبارگذاری (preload) فایل فونت اصلی هم، اگر درست انجام شود، زمان نمایش متن را کم میکند. فقط یک یا دو فایل را preload کنید؛ پیشبارگذاری همه وزنها اثر عکس دارد.
فروشگاهها حساب جداگانه دارند
در فروشگاه ووکامرس، بخش «سبد خرید کوچک» در سربرگ با یک درخواست AJAX بهروز میشود که روی بعضی هاستها در هر صفحه چند صد میلیثانیه طول میکشد. اگر قالب شما این بخش را با روش جدیدتر پیاده نکرده، میشود آن درخواست را برای صفحاتی که مشتری هنوز چیزی به سبد اضافه نکرده حذف کرد. فیلترهای محصول هم، بهخصوص وقتی روی ویژگیهای زیاد اعمال میشوند، کوئریهای سنگینی میسازند. نکات بیشتر را در راهنمای راهاندازی فروشگاه ووکامرس و مدیریت انبار در ووکامرس نوشتهام.
امنیت و سرعت
افزونههای امنیتی سنگین که در هر درخواست اسکن میکنند، روی سرعت اثر محسوسی دارند. فایروال در سطح DNS یا CDN هم امنتر است و هم بار سرور را کم میکند. توصیههای کامل امنیتی را در امنیت وردپرس آوردهام.
اشتباههایی که زیاد میبینم
دنبال کردن نمره صد. نمره نود و نمره صد برای کاربر تقریباً تفاوتی ندارند، اما رسیدن از یکی به دیگری گاهی یعنی خاموش کردن قابلیتهایی که واقعاً لازماند.
تست فقط روی صفحه اصلی و فقط وقتی وارد شدهاید. وقتی با حساب مدیر وارد شدهاید، بیشتر افزونههای کش صفحه را کش نمیکنند و نوار مدیریت هم اسکریپت اضافه بارگذاری میکند. همیشه در پنجره ناشناس تست کنید.
نصب افزونه بهینهسازی روی سایت اصلی بدون پشتیبان. گزینههای تهاجمی بهینهسازی گاهی ظاهر سایت را بههم میریزند و اگر روی سایت فروشگاهی در ساعت پرفروش این اتفاق بیفتد، هزینه دارد.
اگر وقتش را ندارید
بهینهسازی سرعت کار یکباره نیست؛ هر افزونه جدید، هر قالب جدید و هر کمپین تبلیغاتی با اسکریپت تازه، میتواند تعادل را بههم بزند. اگر میخواهید این کار را به من بسپارید، در پشتیبانی وردپرس بهینهسازی و پایش سرعت را انجام میدهم.
سؤالهای رایج
چند افزونه زیاد است؟
عدد مشخصی وجود ندارد. سایتهایی با سی افزونه سبک دیدهام که سریعاند و سایتهایی با هشت افزونه که کندند. به جای شمردن، اندازه بگیرید که کدام افزونه چه هزینهای دارد.
تغییر هاست سرعت را حل میکند؟
اگر TTFB بالاست و بعد از بهینهسازی PHP و کش همچنان بالا میماند، احتمالاً بله. اگر مشکل از تصاویر حجیم و اسکریپتهای زیاد است، هاست بهتر فقط کمی کمک میکند.
صفحهساز سایت را کند میکند؟
صفحهسازها CSS و JS بیشتری بارگذاری میکنند و ساختار HTML سنگینتری میسازند. با تنظیمات درست میشود سرعت قابلقبولی گرفت، اما سایت سبک بدون صفحهساز معمولاً راحتتر سریع میماند. مقایسه کلیتر را در وردپرس یا کدنویسی اختصاصی نوشتهام.
این نوشته بخشی از راهنمای جامع راهاندازی وردپرس فارسی است. مقالههای مرتبط: کارهای ضروری بعد از نصب وردپرس، امنیت وردپرس.

2 دیدگاه