افزایش سرعت وردپرس بدون افزونه | ۱۲ اقدام در ۹۰ دقیقه

افزایش سرعت وردپرس بدون افزونه | ۱۲ اقدام در ۹۰ دقیقه

فهرست مطالب

افزایش سرعت وردپرس بدون افزونه، سخت‌ترین و در همان حال تمیزترین راه برای رسیدن به سایتی است که واقعاً سریع باشد؛ نه سایتی که فقط در فیلتر ابزارهای تست، سبز به نظر برسد.اگر تا این‌جای اینترنت آمده‌اید، احتمالاً یک‌بار هم WP Rocket یا یک افزونه بهینه‌ساز دیگر نصب کرده‌اید و بعد دیده‌اید که نمره PageSpeed چند امتیاز بالا رفت، ولی سایت هنوز همان حالتی را دارد که کاربر را عصبانی می‌کند. این تجربه اتفاقی نیست؛ منطق دارد. هر افزونه پرفورمنس، خودش یک لایه کد اضافه است که باید لود شود، اجرا شود و بعد تلاش کند بقیه کدها را جمع‌وجور کند. وقتی مشکل از هاست کند، دیتابیس متورم یا قالبی باشد که ۹۰۰ کیلوبایت CSS بی‌استفاده لود می‌کند، هیچ افزونه‌ای آن مشکل را حل نمی‌کند؛ فقط روی آن کرم‌پودر می‌زند. در این راهنما برعکس کار می‌کنیم: از لایه سرور شروع می‌کنیم و تا آخرین فونتی که مرورگر لود می‌کند پیش می‌رویم. دوازده اقدامی که می‌خوانید، همان چک‌لیستی است که در تیم طراحی سایت ویرا برای پروژه‌های واقعی اجرا می‌کنیم؛ قدم‌به‌قدم، با کد آماده و با نقشه دقیق اثر هر اقدام روی Core Web Vitals. فقط یک قانون قبل از شروع: قبل از هر تغییری، از فایل‌ها و دیتابیس بکاپ بگیرید.

۲.۵ ثانیه
سقف رسمی LCP برای تجربه خوب؛ آستانه‌ای که گوگل در سند Web Vitals اعلام کرده است
۲۰۰ میلی‌ثانیه
سقف INP؛ متریکی که از مارس ۲۰۲۴ رسماً جایگزین FID شد و اکثر سایت‌های قدیمی هنوز با آن ناآشنا هستند
+۱۰۰۰ فایل
فایل‌های PHP که وردپرس در هر لود صفحه لازم دارد؛ دقیقاً همان کاری که OPcache ارزان‌اش می‌کند

۱چرا افزایش سرعت وردپرس با نصب افزونه شروع نمی‌ شود؟ نقشه لایه‌ های سرعت

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

چرا افزایش سرعت وردپرس با نصب افزونه شروع نمی‌ شود؟

حلقه چه اتفاقی می‌افتد نشانه کندی اقدام مربوطه
۱. DNS و اتصال پیدا کردن IP دامنه و برقراری اتصال امن به سرور تأخیر زیاد در شروع Waterfall ابزارهای تست اقدام ۱ و ۴
۲. سرور و PHP اجرای کدهای PHP و ساخت HTML صفحه؛ خروجی‌اش TTFB است TTFB بالای ۶۰۰ میلی‌ثانیه اقدام ۱
۳. دیتابیس ده‌ها کوئری MySQL برای تنظیمات، محتوا و متادیتا کوئری‌های کند در Query Monitor، wp_options متورم اقدام ۲
۴. هسته و قالب هزاران هوک و فیلتر وردپرس و توابع functions.php قالب HTML متورم، صدها فایل CSS و JS در سورس صفحه اقدام ۳، ۱۱ و ۱۲
۵. رندر مرورگر دانلود و اجرای CSS، JS، فونت و تصویر؛ ساخت پیکسل‌ها LCP و CLS نامطلوب، اسکریپت‌های قفل‌کننده رندر اقدام ۵ تا ۸
۶. تعامل کاربر واکنش صفحه به کلیک و تاچ و تایپ بعد از لود INP بالا؛ تاخیر محسوس بین کلیک و واکنش اقدام ۷ و ۴

برای اینکه مرز دو رویکرد روشن شود، این مقایسه را ببینید:

معیار رویکرد افزونه‌محور رویکرد بدون افزونه (موضوع این راهنما)
لایه هدف فقط خروجی فرانت (کش و مینیفای) شش لایه کامل: از سرور تا رندر
هزینه اجرای خود راه‌حل هر افزونه، خودش PHP و JS به سایت می‌افزاید تقریباً صفر؛ همه‌چیز در هسته و سرور تعریف می‌شود
TTFB بدون تغییر معنادار باقی می‌ماند هدف اول؛ با PHP، OPcache و دیتابیس درمان می‌شود
ماندگاری با حذف یا آپدیت افزونه از بین می‌رود در سرور و فایل‌های پایه ثبت می‌ماند
ریسک تداخل بیشتر؛ تداخل با سایر افزونه‌ها کمتر؛ تعاریف استاندارد هسته

۱.۱ چرا بعضی سایت‌ها با سی افزونه هم سریع‌اند؟

چون بردبار واقعیِ سرعت، «تعداد افزونه‌ها» نیست؛ «هزینه اجرای هر افزونه» است. ده افزونه سبک و استاندارد که هرکدام یک کار مشخص انجام می‌دهند، از یک قالب چندمنظوره سنگین به‌علاوه دو افزونه بدکد، بسیار کم‌هزینه‌ترند. سایت‌هایی را دیده‌ایم که با بیش از سی افزونه فعال، TTFB زیر ۲۰۰ میلی‌ثانیه دارند، چون هاست درستی رویشان سوار است، OPcache فعال است و قالبشان تمیز نوشته شده. در مقابل، سایت‌هایی دیده‌ایم که با پنج افزونه و یک افزونه کش معروف، TTFB بالای ۱.۲ ثانیه دارند؛ چون host ضعیف است و جدول wp_options به چند مگابایت رسیده است. همین یک تفاوت ذهنی، شروع درست افزایش سرعت وردپرس است.

۱.۲ چرا بعضی سایت‌ها حتی با افزونه کش هم کند می‌مانند؟

افزونه کش، نسخه HTML آماده صفحه را می‌سازد تا PHP کمتر اجرا شود؛ یعنی فقط روی حلقه دوم اثر می‌گذارد و آن هم تا وقتی کش ساخته نشده یا منقضی نشده، هیچ کاری نمی‌کند. اگر سایت شما ووکامرسی است و صفحات سبد خرید و حساب کاربری کش‌ناشدنی‌اند، یا ترافیک‌تان کم است و کش همیشه سرد ساخته می‌شود، یا مشکل اصلی‌تان یک اسکریپت ۴۰۰ کیلوبایتی شخص ثالث است که رندر را قفل می‌کند، افزونه کش همچون بادکنکی است روی سوراخ کمربند. در ادامه برای هرکدام از این سناریوها راه حل لایه‌ای می‌دهیم؛ همان مسیر واقعی افزایش سرعت وردپرس بدون افزونه.

💡 قانونی که در همه پروژه‌ها دیده‌ایم: حدود هشتاد درصد افت سرعت یک سایت وردپرسی معمولی در سه حلقه اول است: DNS/اتصال، سرور/PHP و دیتابیس. تا وقتی TTFB بالای نیم ثانیه است، جراحی روی فونت و تصویر فقط کرم‌پودر است. به همین دلیل این راهنما از سرور شروع می‌کند، نه از چیدن عکس‌ها.

۲Core Web Vitals؛ آزمون رسمی گوگل برای سرعت وردپرس

قبل از دست‌کردن به سرور و کد، باید بدانیم گوگل با چه خط‌کشی قضاوت می‌کند. طبق مستند رسمی Web Vitals، سه متریک اصلی تجربه کاربری در صدک ۷۵ ترافیک واقعی سایت شما سنجیده می‌شود و دو متریک دیگر هم نقش زیرساختی دارند. این جدول را ذهن‌سپاری کنید؛ در همه بخش‌های بعدی به آن ارجاع می‌دهیم:

Core Web Vitals

متریک چه چیزی را می‌سنجد آستانه سبز وضعیت رسمی
LCP سرعت دیده‌شدن بزرگ‌ترین عنصر محتوایی صفحه ۲.۵ ثانیه یا کمتر متریک اصلی CWV
INP فاصله بین تعامل کاربر و واکنش بصری صفحه ۲۰۰ میلی‌ثانیه یا کمتر متریک اصلی CWV از مارس ۲۰۲۴
CLS میزان جابه‌جایی ناخواسته عناصر حین لود ۰.۱ یا کمتر متریک اصلی CWV
TTFB مدت تا رسیدن اولین بایت پاسخ سرور ترجیحاً زیر ۶۰۰ میلی‌ثانیه متریک تشخیصی؛ زیرساخت LCP
FCP ثانیه‌ای که اولین محتوای قابل مشاهده نقش می‌بندد ۱.۸ ثانیه یا کمتر متریک آزمایشگاهی؛ هشدار اولیه LCP
💡 LCP چیست؟ LCP یا Largest Contentful Paint یعنی لحظه‌ای که بزرگ‌ترین عنصر محتوایی صفحه (معمولاً تصویر شاخص یا تیتر اصلی) کامل دیده می‌شود. برای تجربه کاربری خوب، گوگل LCP را باید ۲.۵ ثانیه یا کمتر بداند؛ در وردپرس، کندترین دلیلش معمولاً TTFB بالا و تصویر سنگین بالای صفحه است.
💡 INP چیست؟ INP یا Interaction to Next Paint فاصله زمانی بین تعامل کاربر (کلیک، تاچ، تایپ) و واکنش بصری بعدی صفحه را می‌سنجد. آستانه خوب آن ۲۰۰ میلی‌ثانیه است. علت اصلی بد بودنش در وردپرس، جاوااسکریپت سنگین است که رشته اصلی مرورگر را مشغول نگه می‌دارد.
💡 CLS چیست؟ CLS یا Cumulative Layout Shift مجموع جابه‌جایی‌های ناخواسته عناصر صفحه حین لود است؛ مثلاً وقتی متنی که در حال خواندنش هستید ناگهان پایین می‌پرد. گوگل امتیاز ۰.۱ یا کمتر را خوب می‌داند. رایج‌ترین علت در وردپرس، تصاویر بدون ابعاد و فونت‌هایی است که جایگزین فونت پیش‌فرض می‌شوند.
💡 TTFB چیست؟ TTFB یا Time to First Byte، مدت انتظار مرورگر از ارسال درخواست تا رسیدن اولین بایت پاسخ سرور است. در وردپرس، TTFB قرمز معمولاً یعنی PHP قدیمی، OPcache خاموش یا دیتابیس متورم؛ و اولین قدم واقعی افزایش سرعت وردپرس، درمان همین متریک است.
💡 بهترین روش افزایش سرعت وردپرس بدون افزونه چیست؟ بهینه‌سازی لایه‌ای از سمت سرور: اول ارتقای PHP و فعال‌سازی OPcache برای کاهش TTFB، بعد پاک‌سازی autoload دیتابیس، سپس سبک‌سازی قالب و خروجی Core، و در نهایت بهینه‌سازی CSS، جاوااسکریپت، تصویر و فونت. مسیر همین دوازده قدم، با کد آماده در این مقاله آمده است.

۲.۱ هر متریک Core Web Vitals با کدام اقدام افزایش سرعت وردپرس درست می‌شود؟

متریک بد رایج‌ترین علت در وردپرس اقدام درمانی
LCP بالا TTFB کند، تصویر شاخص سنگین، CSS قفل‌کننده رندر اقدام ۱، ۲، ۵ و ۶
INP بالا جاوااسکریپت حجیم پیج‌بیلدر و اسکریپت‌های شخص ثالث اقدام ۴ و ۷
CLS بالا تصویر بدون ابعاد، فونت بیرونی، بنرهای دیرلود اقدام ۵ و ۸

نکته مهم: عددهای گوگل از داده میدانی CrUX می‌آید، یعنی رفتار کاربران واقعی روی گوشی‌های واقعی؛ نه لپ‌تاپ سریع شما در دفتر. به همین دلیل در این راهنما برای هر اقدام می‌گوییم نتیجه را با کدام ابزار و در چه بازه‌ای دوباره بسنجید.

۳
اقدام ۱؛ دکتر سرور: PHP، OPcache و جراحی TTFB (بزرگ‌ترین قدم افزایش سرعت وردپرس)


دکتر سرور PHP، OPcache و جراحی TTFB
مشکل چیست و چرا کند می‌کند؟
وردپرس با PHP نوشته شده و در هر لود صفحه، سرور باید صدها فایل PHP را بخواند، اجرا کند و با MySQL حرف بزند تا HTML بسازد. آن مدت، همان TTFB است. اگر هاست شما PHP قدیمی اجرا کند، OPcache خاموش باشد یا منابعش با صدها سایت همسایه تقسیم شده باشد، TTFB به راحتی از مرز ۶۰۰ میلی‌ثانیه رد می‌شود و هر بهینه‌سازی دیگری را خنثی می‌کند؛ چون مرورگر قبل از اینکه بخواهد عکس و فونت را دانلود کند، باید منتظر همین HTML بماند.

گام اول؛ وضعیت فعلی را دقیق بسنجید

اولین کار، سنجش است؛ نه تغییر. برای دیدن نسخه PHP از پیشخوان وردپرس کافی است به مسیر «ابزارها → سلامت سایت → اطلاعات → سرور» بروید. برای سنجش TTFB واقعی، روی هر اینترنتی این دستور را اجرا کنید:

curl -o /dev/null -s -w "TTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://example.com/
عدد TTFB تشخیص
زیر ۳۰۰ میلی‌ثانیه سرور سالم است؛ زیرخواست‌های فرانت را بهینه کنید
۳۰۰ تا ۶۰۰ میلی‌ثانیه قابل بهبود با OPcache، نسخه PHP و جراحی دیتابیس
بالای ۶۰۰ میلی‌ثانیه اولویت اول پروژه؛ هیچ بهینه‌سازی دیگری قبل از این اثر نمی‌کند

گام دوم؛ نسخه PHP را به آخرین نسخه پایدار برسانید

هر نسخه جدید PHP سریع‌تر از قبلی است و بنچمارک‌های عمومی نشان می‌دهد جهش از PHP 7.4 به 8.x در بسیاری از بارهای کاری وردپرس، زمان اجرای PHP را به‌طور محسوس پایین می‌آورد. اگر روی هاست اشتراکی هستید، در cPanel دنبال «MultiPHP Manager» باشید و نسخه را به آخرین نسخه پایدارِ موجود (در حال حاضر خانواده 8.2 یا 8.3) تغییر دهید. قبل از تغییر، سازگاری قالب و افزونه‌ها را روی نسخه استیجینگ تست کنید؛ افزونه‌های خیلی قدیمی ممکن است با PHP 8 ناسازگار باشند. اگر به ترمینال دسترسی دارید، چک نسخه یک خط است:

php -v
# خروجی مطلوب: PHP 8.2.x تا 8.3.x

گام سوم؛ OPcache را روشن و پهن کنید

OPcache در مستند رسمی PHP، بایت‌کد کامپایل‌شده فایل‌های PHP را در حافظه نگه می‌دارد تا در هر لود، هزاران فایل دوباره از صفر کامپایل نشوند. بدون OPcache، اجرای هر صفحه وردپرس مثل خواندن کتابی است که هر بار از حروف الفبا شروع می‌کند. برای بررسی وضعیتش یک فایل موقت بسازید:

<?php phpinfo(); ?>

فایل را با نام موقت مثل check.php در ریشه بگذارید، یک‌بار بازش کنید و در نتیجه دنبال OPcache بگردید؛ بعد فایل را حتماً حذف کنید. اگر فعال نبود، از پشتیبانی هاست بخواهید روشنش کند. اگر به فایل تنظیمات دسترسی دارید (فایل .user.ini در ریشه هاست یا php.ini در VPS) این مقادیر پیشنهادی را قرار دهید:

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
realpath_cache_size=4M
realpath_cache_ttl=600
⚠️ تله رایج: اگر روی محیط توسعه (استیجینگ یا لوکال) opcache.revalidate_freq را صفر بگذارید، تغییرات فایل‌ها بلافاصله اعمال می‌شود ولی روی هاست اصلی این کار OPcache را تقریباً بی‌فایده می‌کند؛ چون در هر ریکوئست همه فایل‌ها را دوباره می‌خواند. روی سرور اصلی همین ۶۰ ثانیه (یا بالاتر) درست است؛ فقط یادتان باشد بعد از هر آپدیت قالب، کش OPcache را از پنل هاست ریست کنید.

گام چهارم؛ فشرده‌سازی و کش مرورگر را از خود .htaccess بگیرید

هیچ افزونه‌ای برای دو کار پایه‌ای لازم نیست: فشرده‌سازی خروجی و پیام دادن به مرورگر که فایل‌های ثابت را چند وقت نگه دارد. اگر هاستتان Apache است، این بلوک را به .htaccess ریشه اضافه کنید:

# فشرده‌سازی فایل‌های متنی (اگر Brotli روی سرور باشد، خود هاست اولویت می‌دهد)
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/css text/javascript application/javascript application/json image/svg+xml
</IfModule>

# کش مرورگر برای منابع ثابت
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType image/webp "access plus 1 year"
  ExpiresByType image/avif "access plus 1 year"
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType font/woff2 "access plus 1 year"
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
</IfModule>

اگر هاست از LiteSpeed یا Nginx استفاده می‌کند، این تنظیمات را پنل هاست یا پشتیبانی انجام می‌دهد؛ فقط مطمئن شوید Gzip/Brotli فعال است (در تب Network دیو‌تولز، هدر content-encoding پاسخ را ببینید). درباره DNS هم دو تصمیم ساده کافی است: از DNS ارائه‌دهنده معتبر استفاده کنید و TTL رکوردها را برای رکوردهای پایدار بالا بگذارید تا کاربران تکراری زمان کمتری در حلقه اول زنجیره بگذرانند.

چک‌لیست انتخاب هاست مناسب برای سرعت وردپرس

ویژگی هاست چرا برای سرعت وردپرس مهم است
PHP 8.2 یا جدیدتر + OPcache قابل تنظیم زمان اجرای PHP را کم می‌کند؛ بدون آن اقدام اول ناقص است
دیسک NVMe به‌جای HDD خواندن فایل‌ها و دیتابیس سریع‌تر؛ اثر مستقیم روی TTFB
HTTP/2 یا HTTP/3 فعال دانلود موازی فایل‌های کوچک فرانت ارزان می‌شود
فشرده‌سازی Brotli یا Gzip حجم متن خروجی در انتقال به چشم‌پوشی کمتر می‌شود
کش سمت سرور (LSCache یا FastCGI) TTFB صفحات تکراری تا چند ده میلی‌ثانیه پایین می‌آید
لوکیشن نزدیک به مخاطب اتصال اولیه کوتاه‌تر؛ حیاتی برای مخاطب داخل ایران

قبل و بعد این اقدام (سناریوی واقعی)

📍 سناریو: سایت یک فروشگاه اینترنتی با ووکامرس، PHP 7.4 و OPcache خاموش. فقط با ارتقای PHP به 8.2، فعال‌سازی OPcache با مقادیر بالا و افزودن قوانین .htaccess، TTFB صفحه اصلی از حدود ۹۰۰ میلی‌ثانیه به محدوده ۳۵۰ تا ۴۵۰ میلی‌ثانیه رسید و LCP موبایل از ۴.۸ ثانیه به حدود ۳.۱ ثانیه. هنوز کار مانده بود، ولی هیچ‌کدام از اقدام‌های بعدی بدون این پایه، چنین پرشی نمی‌دادند.

اشتباهات رایج این اقدام: ارتقای PHP بدون تست سازگاری روی استیجینگ / فعال کردن OPcache با حافظه پیش‌فرض کم روی سایت ووکامرسی (فایل‌ها از کش بیرون رانده می‌شوند) / گذاشتن phpinfo بدون حذف فایل / تکرار قوانین deflate که خود هاست اعمال کرده و ساختن خطای ۵۰۰.

۴اقدام ۲؛ جراحی دیتابیس: کابوس wp_options، ترنزینت‌ها و بازبینی‌ها


جراحی دیتابیس

مشکل چیست و چرا کند می‌کند؟ در هر لود صفحه، وردپرس ده‌ها کوئری به MySQL می‌زند: محتوای صفحه، منوها، ابزارک‌ها، تنظیمات و مهم‌تر از همه، گروهی از رکوردهای جدول wp_options که پرچم autoload دارند و در همه صفحات، حتی صفحاتی که به آن‌ها نیازی نیست، خوانده می‌شوند. مستند رسمی ووکامرس درباره wp_options تأیید می‌کند که انبساط بی‌رویه این جدول یکی از دلایل مستقیم کندی سایت است؛ چون حجم داده‌ای که در تک‌تک صفحات از روی دیسک خوانده و در حافظه باز می‌شود، بالا می‌رود. به همین دلیل، جراحی دیتابیس در هر برنامه جدی افزایش سرعت وردپرس قدم دوم است، نه قدم دهم.

گام اول؛ وزن autoload را اندازه بگیرید

وارد phpMyAdmin شوید، دیتابیس سایت را انتخاب کنید و این کوئری را در تب SQL اجرا کنید. توجه: از وردپرس 6.6 مقادیر autoload فقط yes و no نیست و خانواده جدیدی دارد؛ پس کوئری مدرن را استفاده کنید:

-- حجم کل داده‌ای که در هر لود صفحه خوانده می‌شود
SELECT ROUND(SUM(LENGTH(option_value)) / 1024, 2) AS autoload_kb
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto-on', 'auto');
-- سنگین‌ترین رکوردهای autoload را نشان بده
SELECT option_id, option_name, autoload,
       ROUND(LENGTH(option_value) / 1024, 2) AS size_kb
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto-on', 'auto')
ORDER BY size_kb DESC
LIMIT 20;
حجم autoload تشخیص
تا حدود ۸۰۰ کیلوبایت دم فعلی هشدار سلامت سایت وردپرس؛ وضعیت قابل قبول
۸۰۰ کیلوبایت تا ۲ مگابایت پاک‌سازی جدی لازم است؛ سلول بطری TTFB همین‌جاست
بالای ۲ مگابایت اورژانسی؛ معمولاً بقایای افزونه‌های حذف‌شده یا ترنزینت‌های گیرکرده است

اگر در لیست سنگین‌ترین‌ها نام افزونه‌ای دیدید که مدت‌هاست حذفش کرده‌اید، رکوردش را offline کنید تا دیگر در هر صفحه لود نشود:

-- نمونه: توقف بارگذاری خودکار یک رکورد بزرگِ بلااستفاده
UPDATE wp_options SET autoload = 'no'
WHERE option_name = 'old_plugin_settings';

⚠️ قانون طلایی دیتابیس: قبل از هر UPDATE یا DELETE روی wp_options، از همان جدول خروجی (Export) بگیرید. autoload رکوردهایی مثل siteurl یا active_plugins را به هیچ عنوان دست نزنید. یکی از باگ‌های معروف این حوزه، ترنزینت _transient_dirsize_cache است که روی بعضی سایت‌ها تا بیش از یک مگابایت رشد می‌کند؛ تغییر autoload آن به no معمولاً بی‌خطر است و هشدار سلامت سایت را برطرف می‌کند. کوئری مستقیمش هم این است:

UPDATE wp_options SET autoload = 'no'
WHERE option_name = '_transient_dirsize_cache';

گام دوم؛ ترنزینت‌های منقضی را جارو کنید

ترنزینت‌ها (Transients) کش موقت وردپرس و افزونه‌ها هستند که قرار بوده بعد از انقضا حذف شوند ولی در عمل پشت هم انباشته می‌شوند. این کوئری‌ها برای پاک‌سازی امن‌اند و داده مفیدی حذف نمی‌کنند:

-- حذف ترنزینت‌های منقضی‌شده روی جدول wp_options
DELETE FROM wp_options
WHERE option_name LIKE '\_transient\_timeout\_%'
  AND option_value < UNIX_TIMESTAMP();

DELETE FROM wp_options
WHERE option_name LIKE '\_transient\_%'
  AND option_name NOT LIKE '\_transient\_timeout\_%'
  AND option_name NOT IN (
    SELECT option_name FROM wp_options
    WHERE option_name LIKE '\_transient\_timeout\_%'
);

گام سوم؛ بازبینی‌ها (Revisions) را محدود و پاک کنید

هر بار که دکمه «به‌روزرسانی» را می‌زنید، وردپرس یک نسخه کامل از محتوا را در wp_posts ذخیره می‌کند. روی سایتی با ۵۰۰ مقاله و بیست ویرایش برای هر مقاله، ده هزار ردیف اضافه دارید که هم جدول را سنگین می‌کند و هم بکاپ‌ها را فربه. دو کار لازم است: سقف گذاشتن برای آینده (در اقدام ۱۱ با wp-config انجام می‌دهیم) و پاک‌سازی گذشته:

-- اول ببینید چه حجمی از جدول دست‌وپاگیر است
SELECT COUNT(*) AS revisions_count FROM wp_posts
WHERE post_type = 'revision';

-- سپس فقط بازبینی‌های قدیمی‌تر از ۹۰ روز را پاک کنید
DELETE FROM wp_posts
WHERE post_type = 'revision'
  AND post_date < DATE_SUB(NOW(), INTERVAL 90 DAY);

گام چهارم؛ کوئری‌های کند را شکار کنید

الآن نوبت پیدا کردن قاتل‌های پنهان است. ابزار استاندارد این کار، Query Monitor است؛ یک افزونه توسعه‌دهنده که فقط برای عیب‌یابی، موقتاً نصب می‌شود و بعد از پایان کار حذفش می‌کنید (نصب موقت ابزار تشخیصی، ناقض عنوان «بدون افزونه» نیست؛ چون روی خروجی نهایی سایت چیزی نمی‌ماند). با آن می‌بینید دقیقاً کدام کوئری، توسط کدام قالب یا افزونه، چند میلی‌ثانیه طول کشیده و کدام کوئری تکراری است. دو الگوی رایجی که پیدا خواهید کرد: کوئری‌های meta_query گران‌قیمت روی wp_postmeta برای ساخت «محصولات پرفروش» در هر صفحه، و فراخوانی‌های تکراری get_option که با مرتب‌کردن autoload درمان می‌شوند. برای سایت‌های بسیار بزرگ، از فروشنده هاست بخواهید Slow Query Log را برای چند ساعت روشن کند تا مستقیم از خود MySQL گزارش بگیرید.

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

SHOW INDEX FROM wp_options;

📍 سناریوی واقعی: سایت شرکتی با ۶ سال سابقه؛ حجم autoload به ۳.۸ مگابایت رسیده بود و بیشترش بقایای سه افزونه فرم‌ساز و اسلایدر حذف‌شده بود. با همین سه کوئری (اندازه‌گیری، شناسایی سنگین‌ها، توقف autoload و پاک‌سازی ترنزینت‌ها) حجم به ۶۱۰ کیلوبایت رسید و TTFB حدود ۲۰۰ میلی‌ثانیه پایین آمد؛ بدون تعویض هاست و بدون یک خط کدنویسی جدید.

اشتباهات رایج این اقدام: اجرای کوئری‌های گلوبال DELETE روی ترنزینت‌های سالم (کش افزونه‌هایی مثل ووکامرس دوباره ساخته می‌شود و هزینهاش بیشتر از نفعش است) / حذف بازبینی‌ها بدون سقف‌گذاری برای آینده / پیش‌فرض گرفتن اینکه هر چیز بزرگ در wp_options زباله است (بعضی رکوردها تنظیمات حیاتی قالب‌اند) / ساختن ایندکس تکراری روی نسخه‌های جدید وردپرس.

۵
اقدام ۳؛ رژیم سخت برای قالب: متغیری که بیشترین اثر را روی افزایش سرعت وردپرس دارد

رژیم سخت برای قالب

مشکل چیست و چرا کند می‌کند؟ قالب، کارخانه خروجی HTML سایت شماست. قالب‌های چندمنظوره برای اینکه «برای همه همه‌چیز داشته باشند»، معمولاً صدها کیلوبایت CSS و JS در تک‌تک صفحات لود می‌کنند؛ حتی صفحه‌ای که فقط یک متن ساده دارد. وقتی قالب برای نمایش یک صفحه درباره ما، کتابخانه اسلایدر، انیمیشن‌ها و آیکون‌های پنج سبک مختلف را هم بارگذاری کند، بهینه‌سازی تصویر و فونت مثل تمیزکردن اتاقی است که دیوارهایش نم دارند.

۳.۱ اول تشخیص بدهید قالب شما چقدر سنگین است

سریع‌ترین آزمون: همین الان روی صفحه اصلی سایتتان کلیک راست کنید، «View Page Source» را باز کنید و در سورس دنبال .css و .js بگردید. بشمارید و وزنشان را در تب Network دیو‌تولز ببینید. سیگنال‌های هشدار را این جدول خلاصه می‌کند:

شاخص در سورس صفحه قالب سبک قالب سنگین
تعداد فایل‌های CSS لودشده در یک صفحه ساده ۲ تا ۶ فایل بیش از ۱۵ فایل
حجم جاوااسکریپت صفحه اول کمتر از ۱۵۰ کیلوبایت بیش از ۵۰۰ کیلوبایت
تعداد عناصر DOM کمتر از ۸۰۰ عنصر بیش از ۱۵۰۰ عنصر برای همان صفحه
وابستگی به پیج‌بیلدر الزامی نیست؛ قالب بدون بیلدر هم کامل است بدون بیلدر، صفحات می‌شکنند

۳.۲ ارتش شکیلِ لود نشدنی: dequeue کردن فایل‌های بلااستفاده

اگر تعویض قالب در برنامه‌تان نیست، حداقل جلوی لود فایل‌هایی را بگیرید که در بعضی صفحات هیچ کاربردی ندارند. الگوی رایج: فرم‌ساز و اسلایدر که روی همه صفحات فایل تزریق می‌کنند ولی فقط در صفحه تماس و صفحه اصلی لازم‌اند. این کد را در functions.php قالب فرزند (Child Theme) قرار دهید:

// نمونه: فایل‌های فرم‌ساز فقط در صفحه تماس لود شوند
add_action( 'wp_enqueue_scripts', function() {
    if ( ! is_page( 'contact-us' ) ) {
        wp_dequeue_style( 'contact-form-7' );
        wp_dequeue_script( 'contact-form-7' );
    }
}, 20 );

چطور نام هندل (handle) هر فایل را پیدا کنید؟ با همان Query Monitor موقت، بخش «Scripts & Styles» دقیقاً نام هندل ها را نشان می‌دهد. همیشه اول روی استیجینگ تست کنید؛ dequeue اشتباه یعنی صفحه بدون استایل یا فرم خراب.

۳.۳ functions.php؛ محلی که معمولاً به آشی سنگین تبدیل می‌شود

در پروژه‌های تحویلی، دیده‌ایم functions.php به چند هزار خط برسد: اسنیپت‌هایی که سال‌ها قبل از بلاگ‌ها کپی شده و هر کدام در هر لود اجرا می‌شوند. سه قانون: اسنیپت‌های غیرفعال را کاملاً پاک کنید (نه کامنت)، کدهای سنگینِ محاسباتی را پشت شرط is_admin یا شرط صفحه پنهان کنید، و هر کدی که به ابزارک یا منوی قدیمی مربوط است و دیگر رندر نمی‌شود، حذف شود. اگر قالب فعلی‌تان اساساً اصلاح‌ناپذیر است، بازطراحی با قالب سبک و اختصاصی، همان کاری است که در پروژه‌های طراحی سایت انجام می‌دهیم: خروجی تمیز، DOM جمع‌وجور و فایل‌های کمتر؛ در عمل همین تصمیم‌ها بزرگ‌ترین سهم افزایش سرعت وردپرسِ بیشتر سایت‌ها را می‌سازند.

📍 سناریوی واقعی: وبلاگ شرکتی با قالب چندمنظوره بازاری؛ صفحه تکی نوشته ۱۹ فایل CSS و ۱۴ فایل JS لود می‌کرد. با dequeue شرطی سه کتابخانه بلااستفاده و حذف اسنیپت‌های مرده functions.php، حجم JS صفحه تقریباً نصف شد و INP موبایل از محدوده نامطلوب به خوب برگشت؛ بدون تعویض قالب.

۶اقدام ۴؛ کاهش درخواست‌های HTTP و مهار اسکریپت‌های شخص ثالث

مشکل چیست و چرا کند می‌کند؟ هر فایل CSS، JS، فونت، عکس و هر خط به یک سرور خارجی، یک درخواست جداگانه است که باید DNS را طی کند، اتصال بسازد و دانلود شود. با HTTP/2 و HTTP/3 هزینه موازی‌سازی کمتر شده، ولی هزینه اتصال‌های جدید به دامنه‌های بیرونی هنوز سنگین است. تب Network دیو‌تولز را باز کنید: اگر واترفال سایت شما پر از دامنه‌های نامتجانس است (چت آنلاین، پیکسل تبلیغاتی، آنالتیکس، ویدئوپلیر، CDN فونت)، بخش مهمی از کندی‌تان را نه سرور شما، که همسایه‌های مجازی‌تان می‌سازند. نظم دادن به این دامنه‌ها، قسمت پرتعداد پروژه افزایش سرعت وردپرس در سایت‌های واقعی است.

گام اول؛ ممیز درخواست‌ها

در تب Network دیو‌تولز، فیلتر Domain را باز کنید و دامنه‌ها را بر اساس تعداد و حجم مرتب کنید. اصول قضاوت ساده است: هر منبع بیرونی‌ای که مستقیم در درآمد یا تجربه کاربر نقش ندارد، کاندید حذف یا تأخیر است. الگوهای رایجی که در ممیزی سایت‌های ایرانی می‌بینیم: دو یا سه ابزار چت هم‌زمان از روی مانده دوره‌های مختلف، آنالتیکس دوبل (هم گوگل آنالتیکس، هم ابزار داخلی، هم هوت‌جر)، و لینک فونت و آیکون از CDNهایی که از ایران به‌کندی در دسترس‌اند.

گام دوم؛ preconnect و dns-prefetch برای دامنه‌هایی که واقعاً می‌مانند

برای دامنه‌های بیرونی ضروری (مثلاً گوگل آنالتیکس یا یک CDN که واقعاً استفاده می‌کنید)، هزینه اتصال را از قبل پرداخت کنید. وردپرس هوک استانداردی برای این کار دارد:

add_filter( 'wp_resource_hints', function( $urls, $relation_type ) {
    if ( 'preconnect' === $relation_type ) {
        $urls[] = 'https://www.googletagmanager.com';
    }
    return $urls;
}, 10, 2 );

گام سوم؛ قانون سه‌سؤالی برای هر اسکریپت خارجی

  • آیا در ۳ ماه گذشته کسی از دیتایش استفاده کرده؟ اگر نه، حذفش کنید.
  • آیا روی همه صفحات لازم است؟ اگر نه، با همان ترفند dequeue اقدام قبل، فقط در صفحات لازم بیاید.
  • آیا می‌شود با تأخیر لودش کرد؟ ابزارهای چت و هیت‌مپ تقریباً همیشه می‌توانند بعد از تعامل اول کاربر بیایند؛ در اقدام ۷ روش دقیق تأخیر را می‌دهیم.

📍 سناریوی واقعی: پوشش سایت خبری که ۴ ابزار بیرونی داشت (دو سیستم آماده، چت، پلیر ویدئو). حذف یکی از سیستم‌های آماری که سال‌ها بود کسی به آن نگاه نمی‌کرد + تأخیر چت، تعداد دامنه‌های بیرونی را از ۹ به ۵ رساند و حدود ۴۰۰ میلی‌ثانیه از زمان تعامل‌پذیری موبایل کم شد.

اشتباهات رایج این اقدام: ترکیب دستی فایل‌های CSS و JS در عصر HTTP/2 (معمولاً ضررش بیشتر از نفعش است) / preconnect گذاشتن برای سرویس‌هایی که فقط در یک صفحه‌اند / حذف پیکسل‌های بازاریابی بدون هماهنگی با تیم تبلیغات / نگه داشتن CDN عمومی جی‌کوئری در حالی که خود وردپرس همان را بهینه‌تر لود می‌کند.

۷اقدام ۵؛ تصاویر: بزرگ‌ترین برد سریع در افزایش سرعت وردپرس (LCP و CLS با هم)

مشکل چیست و چرا کند می‌کند؟ در بیشتر سایت‌های وردپرسی، سنگین‌ترین عنصر صفحه یک عکس است و اگر همان عکس هم پشت چین بالای صفحه باشد، مستقیم روی LCP ضربه می‌زند. دو خطای کلاسیک: آپلود عکس دوربینی ۴ مگابایتی در جایی که حداکثر ۱۲۰۰ پیکسل عرض نشان داده می‌شود، و عکس بدون width و height که مرورگر نمی‌داند چقدر فضا برایش باز نگه دارد و صفحه حین لود می‌پرد (CLS).

۵.۱ قبل از آپلود: ریسایز و تبدیل به WebP

قانون ساده: هر عکسی را در همان ابعادی آپلود کنید که نمایش داده می‌شود و قبل از آپلود، فرمتش را مدرن کنید. برای تعداد کم، ابزار رایگان Squoosh کافی است. برای آرشیو چندصدتایی، ابزار خط فرمان cwebp گوگل روی کامپیوترتان همه‌کاره است:

# تبدیل دسته‌ای به WebP با کیفیت ۸۲ (تعادل تنفسی خوب بین حجم و کیفیت)
for f in *.jpg; do cwebp -q 82 "$f" -o "${f%.jpg}.webp"; done
فرمت کاربرد نکته وردپرسی
WebP انتخاب پیش‌فرض برای عکس؛ فشرده و پشتیبانی جهانی وردپرس جدید آپلودش را مستقیم قبول می‌کند
AVIF فشرده‌تر از WebP برای عکس‌های خیلی بزرگ و هیرو پشتیبانی مرورگر خوب است ولی تولیدش کندتر است
SVG لوگو و آیکون به‌علت امنیت، آپلودش در وردپرس محدود است و باید با دانش فنی انجام شود

۵.۲ الگوی HTML درست برای تصویر شاخص (درمان هم‌زمان LCP و CLS)

اگر قالب یا محتوایتان را مستقیم ویرایش می‌کنید، این الگو، چهار درمان را یک‌جا در خود دارد: ابعاد صریح (CLS)، نسخه‌های ریسپانسیو (حجم)، واکنش‌گرایی برای موبایل، و اولویت دانلود برای LCP:

<img
  src="hero-800.webp"
  srcset="hero-480.webp 480w, hero-800.webp 800w, hero-1200.webp 1200w"
  sizes="(max-width: 600px) 100vw, 800px"
  width="800" height="450"
  alt="توصیف واقعی و کوتاه تصویر"
  fetchpriority="high"
  loading="eager"
  decoding="async">

و اگر می‌خواهید دانلود تصویر LCP حتی از تحلیل HTML هم جلوتر بیفتد، همان تصویر را در head قالب preload کنید:

<link rel="preload" as="image" href="/wp-content/uploads/hero-800.webp">
⚠️ مهم‌ترین دام لود تنبل: lazy load کردن همان تصویری که قرار است LCP شما را خوب کند، رایج‌ترین خودزنی موبایل است. وردپرس از نسخه‌های اخیر برای تصویر اول صفحه lazy را صادر نمی‌کند، ولی اگر با قالب یا کد دستی عکس هیرو می‌گذارید، برای آن صریحاً loading=”eager” و fetchpriority=”high” بگذارید و lazy را فقط برای عکس‌های پایین‌تر از دید اول نگه دارید.

📍 سناریوی واقعی: فروشگاه پوشاک؛ عکس هیروی صفحه اصلی یک JPEG با حجم ۱.۹ مگابایت بود. ریسایز به ۱۲۰۰ پیکسل، تبدیل به WebP با کیفیت ۸۲ (خروجی حدود ۱۴۰ کیلوبایت)، افزودن width و height. نتیجه: LCP موبایل از ۴.۱ به ۲.۳ ثانیه رسید و CLS آن صفحه عملاً صفر شد؛ فقط با یک فایل، بدون هیچ افزونه‌ای.

۸اقدام ۶؛ CSS: از دیوار ۹۰۰ کیلوبایتی تا استایل حیاتی برای سرعت وردپرس

مشکل چیست و چرا کند می‌کند؟ CSS یک منبع «قفل‌کننده رندر» است: مرورگر تا وقتی همه استایل‌شیت‌های لینک‌شده در head را دانلود و پردازش نکرده، هیچ پیکسلی نقش نمی‌بندد. در قالب‌های سنگین، بیشتر این CSS برای کامپوننت‌هایی است که در صفحه جاری اصلاً استفاده نمی‌شوند. در تب Coverage دیو‌تولز (در منوی DevTools گزینه Coverage) می‌توانید ببینید چند درصد CSSها واقعاً به کار رفته‌اند؛ روی قالب‌های بازاری معمولاً عددی شوکه‌کننده است.

۶.۱ Critical CSS دستی برای صفحه‌های کلیدی

برای صفحه اصلی و صفحه محصول (دو صفحه‌ای که رتبه و درآمد را می‌سازند)، استایل‌های لازم برای «بخش قابل مشاهده اولیه» را استخراج و داخل head اینجکت کنید و بقیه فایل را بدون قفل رندر لود کنید:

<style>
  /* فقط استایل‌های بخش بالای صفحه: ریست، تایپوگرافی، هدر، هیرو */
  body{margin:0;font-family:Vazirmatn,Tahoma,sans-serif}
  .site-header{display:flex;align-items:center;min-height:64px}
  .hero{background:#1a1a2e;color:#fff;padding:40px 24px}
</style>
<link rel="stylesheet" href="main.css" media="print" onload="this.media='all'">

۶.۲ سه تغییر کوچک با اثر بزرگ

  • Minify دستی: نسخه نهایی CSS را با ابزار آنلاین CSS Minifier فشرده کنید و همان را در قالب نگه دارید؛ نسخه خوانا فقط برای توسعه بماند.
  • حذف قوانین مرده: با گزارش Coverage، کامپوننت‌هایی را که ماه‌هاست استفاده نشده‌اند (قالب‌های اسلایدر قدیمی، سبک‌های صفحه قدیمی) از فایل حذف کنید.
  • منع import@: هر import@ در CSS، یک رفت‌وبرگشت اضافه به سرور است؛ فایل‌ها را مستقیم لینک کنید یا در یک فایل ادغامشان کنید.

📍 سناریوی واقعی: سایت شرکتی با main.css به حجم ۴۸۰ کیلوبایت. پوشش Coverage نشان داد فقط ۱۳٪ از قوانین روی صفحه اصلی استفاده می‌شود. استخراج Critical CSS (۹ کیلوبایت) و لود غیرقفل‌کننده باقی فایل، FCP را حدود ۰.۷ ثانیه بهتر کرد؛ کاری که هیچ افزونه مینیفای‌کننده‌ای به‌تنهایی انجامش نمی‌دهد، چون مشکل حجم بود نه فاصله‌های اضافی.

۹اقدام ۷؛ جاوااسکریپت بدون قفل؛ درمان INP در افزایش سرعت وردپرس

مشکل چیست و چرا کند می‌کند؟ رشته اصلی مرورگر یک کارگر بیشتر ندارد. وقتی ۶۰۰ کیلوبایت جاوااسکریپت پیج‌بیلدر، اسلایدر و ابزارهای بازاریابی باید دانلود، پارس و اجرا شوند، همان کارگر برای هر کلیک بعدی کاربر صف می‌کشد و INP قرمز می‌شود. برخلاف تصویر که فقط وزنش گران است، جاوااسکریپت دوباره هزینه می‌تراشد: یک‌بار دانلود، یک‌بار اجرا. پس هر بایتی که از این فایل‌ها حذف یا به تعویق بیفتد، یک گام مستقیم در افزایش سرعت وردپرس است.

۷.۱ defer و async؛ دو کلیدواژه که نصف درد را درمان می‌کنند

حالت لود رفتار برای چه فایلی
عادی رندر را متوقف می‌کند تا فایل دانلود و اجرا شود فقط اسکریپت‌های واقعاً حیاتی قبل از رندر
defer دانلود موازی؛ اجرا بعد از ساخت DOM، به ترتیب اسکریپت‌های سایت که به DOM نیاز دارند
async دانلود موازی؛ اجرا بلافاصله بعد از دانلود، بدون ترتیب اسکریپت‌های مستقل مثل آنالتیکس
تأخیر تعاملی لود فقط بعد از اولین تعامل کاربر یا چند ثانیه تأخیر چت، هیت‌مپ، ویدئو

در وردپرس می‌توانید با فیلتر استاندارد script_loader_tag رفتار لود هر هندل را عوض کنید؛ بدون دست‌کاری هسته:

add_filter( 'script_loader_tag', function( $tag, $handle ) {
    // این اسکریپت‌ها به رندر اولیه نیازی ندارند
    $defer = [ 'comment-reply', 'wp-embed' ];
    if ( in_array( $handle, $defer, true ) ) {
        return str_replace( ' src', ' defer src', $tag );
    }
    return $tag;
}, 10, 2 );

۷.۲ حذف jquery-migrate و تأخیر هوشمند برای ابزارها

خیلی از قالب‌ها هنوز jquery-migrate را لود می‌کنند؛ لایه سازگاری برای افزونه‌هایی که ممکن است سال‌هاست دیگر وجود نداشته باشند. اگر بعد از حذفش (در قالب فرزند، فقط روی استیجینگ) هیچ خطای کنسولی ندیدید، ۱۵ تا ۲۰ کیلوبایت جاوااسکریپت از هر صفحه کم شده است:

add_action( 'wp_default_scripts', function( $scripts ) {
    if ( ! is_admin() ) {
        $scripts->remove( 'jquery-migrate' );
    }
} );

برای ابزارهایی مثل چت آنلاین، الگوی استاندارد تأخیر این است: فایل را با رویداد اولین اسکرول/کلیک/حرکت موس یا پس از چند ثانیه لود کنید. همین تصمیم، در خیلی از پروژه‌ها تنها فرق بین INP قرمز و سبز است.

📍 سناریوی واقعی: سایت آموزشی با قالب مبتنی بر پیج‌بیلدر؛ INP موبایل حدود ۴۸۰ میلی‌ثانیه بود. defer برای اسکریپت‌های غیرحیاتی، حذف jquery-migrate و تأخیر ابزار چت، آن را به زیر ۱۹۰ میلی‌ثانیه رساند؛ بدون برداشتن حتی یک امکان از سایت.

۱۰اقدام ۸؛ فونت‌ها: قاتل خاموش CLS در افزایش سرعت وردپرس

مشکل چیست و چرا کند می‌کند؟ لود فونت از دامنه خارجی (مثل فونت‌های گوگل) یعنی یک اتصال جدید، چند فایل CSS و چند فایل woff2 قبل از اینکه متن خوانا شود. اگر فونت دیر برسد، متن یا نامرئی می‌ماند (FOIT) یا با فونت جایگزین رندر و بعد می‌پرد (FOUT) و هر دو برای CLS و تجربه کاربر بد است. فونت فارسی هم چون زیرمجموعه گلیف‌هایش از لاتین بزرگ‌تر است، حجمش حساس‌تر است.

۸.۱ میزبانی محلی فونت؛ گام قطعی افزایش سرعت وردپرس موبایل

فایل woff2 فونت فارسی‌تان (مثلاً وزیرمتن یا ایران‌سنس) را داخل پوشه قالب بگذارید و با font-face تعریف کنید؛ این کار، اتصال به دامنه خارجی را کلاً حذف می‌کند:

@font-face {
  font-family: 'Vazirmatn';
  src: url('/wp-content/themes/your-theme/fonts/vazirmatn-regular.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

و برای فونتی که در بالای صفحه حتماً لازم است، preload کنید تا دیر نرسد:

<link rel="preload" href="/wp-content/themes/your-theme/fonts/vazirmatn-regular.woff2" as="font" type="font/woff2" crossorigin>

۸.۲ سه قانون که فرق می‌سازند

  • font-display: swap همیشه: متن فوراً با فونت جایگزین نشان داده می‌شود و وقتی فونت اصلی رسید جایگزین می‌شود. برای فارسی، سعی کنید فونت پشتیبان (fallback) Tahoma یا system-ui باشد تا جهش چیدمان کمتر دیده شود.
  • فقط وزن‌هایی که واقعاً استفاده می‌کنید: بسیاری از سایت‌ها ۵ وزن فونت لود می‌کنند درحالی‌که در همه سایت فقط از معمولی و بولد استفاده می‌شود. هر وزن حذف‌شده، ده‌ها کیلوبایت کمتر.
  • فقط فرمت woff2: فرمت‌های قدیمی (ttf, eot) برای مرورگرهای کهنه وظیفه‌ای ندارند که شما هنوز انجامش بدهید؛ woff2 برای وب امروزی کافی است.

انتخاب فونت پشتیبان هم در ثبات چیدمان فارسی اثر دارد:

فونت پشتیبان نکته برای متن فارسی
Tahoma نزدیک‌ترین متریک به فونت‌های رایج فارسی؛ کمترین جهش هنگام تعویض
system-ui / Segoe UI برای ارقام و کلمات لاتین داخل متن فارسی تمیزتر است
Arial متریک متفاوت‌تر از فونت‌های فارسی؛ فقط آخرین گزینه

📍 سناریوی واقعی: مجله فارسی که فونت ایران‌سنس را از یک CDN خارجی با ۴ وزن لود می‌کرد. میزبانی محلی دو وزن پرکاربرد + preload + swap، زمان قابل‌خواندن شدن متن را در موبایل حدود نیم ثانیه جلو انداخت و جهش متن هنگام تعویض فونت به چشم‌پوشی قابل تحمل رسید.

۱۱اقدام ۹؛ کرون واقعی به جای WP-Cron: توقف سلف‌مچ‌گری سرور در هر بازدید

مشکل چیست و چرا کند می‌کند؟ وردپرس برای کارهای زمان‌بندی‌شده (انتشار نوشته‌های برنامه‌ریزی‌شده، پاک‌سازی، چک آپدیت) یک کرون ساختگی دارد: wp-cron.php که با هر بازدید صفحه چک می‌شود. روی سایت پرترافیک، یعنی هر چند هزار بازدید، چند هزار فراخوانی اضافه برای «ببینم کاری هست یا نه». روی سایت کم‌ترافیک مشکل دیگری است: کرون دیر می‌گذرد چون کسی سایت را باز نکرده. هر دو حالت را یک راه‌حل واقعی جمع می‌کند: کرون سرور؛ یکی از بی‌سروصدا‌ترین قدم‌های افزایش سرعت وردپرس در سایت‌های پرترافیک.

گام اول؛ خاموش کردن کرون داخلی

در فایل wp-config.php، کمی بالاتر از خط پایانی ویرایش، این را اضافه کنید:

define( 'DISABLE_WP_CRON', true );

گام دوم؛ ساختن کرون واقعی در هاست

در cPanel به بخش Cron Jobs بروید و یک کرون روی هر ۱۵ دقیقه بسازید. فرمان استاندارد:

*/15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

اگر به ترمینال دسترسی دارید و WP-CLI روی سرور نصب است، نسخه تمیزتر:

*/15 * * * * cd /home/user/public_html && wp cron event run --due-now >/dev/null 2>&1
معیار WP-Cron پیش‌فرض کرون واقعی سرور
زمان اجرا وابسته به بازدید؛ در سایت خلوت دیر، در سایت شلوغ مکرر دقیق و قابل پیش‌بینی هر ۱۵ دقیقه
هزینه هر بازدید یک چک اضافه روی PHP برای تمام بازدیدها هیچ
قابلیت اطمینان انتشار زمان‌بندی‌شده در سایت کم‌بیننده نامطمئن مطمئن، مستقل از ترافیک

📍 سناریوی واقعی: فروشگاه اینترنتی با اوج ترافیک ساعت‌های ۲۰ تا ۲۳. در همان ساعت‌ها که سرور باید تمام‌قد به سفارش‌ها جواب می‌داد، wp-cron در هر بازدید چک می‌شد و پروسه‌های PHP اشغال می‌کردند. انتقال به کرون ۱۵ دقیقه‌ای، در ساعت‌های اوج چند درصدی مصرف CPU را آزاد کرد؛ عددی که روی داشبورد هاست قابل مشاهده بود.

۱۲اقدام ۱۰؛ مهار Heartbeat API: درد پنهان مدیران و نویسندگان وبلاگ

مشکل چیست و چرا کند می‌ کند؟ Heartbeat API هر ۱۵ ثانیه از مرورگر شما به سرور پینگ می‌زند تا قفل نوشته، ذخیره خودکار و اعلان‌های پیشخوان را زنده نگه دارد. روی سایت تک‌نویسنده زیاد بد نیست، ولی روی سایتی با چند نویسنده هم‌زمان یا فروشگاهی که دائم پیشخوانش باز است، هر تب بازِ پیشخوان یعنی یک ریکوئست مکرر هر ۱۵ ثانیه به سرور. درواقع مصرف سرور در خواب فزاینده است، نه در ترافیک واقعی.

راه‌حل مرحله‌ای (بدون کورکردن سیستم)

توصیه ما حذف کامل Heartbeat نیست؛ کنترل آن است. این کد در functions.php قالب فرزند، فواصل را به ۶۰ ثانیه می‌رساند و فقط در پیشخوان باقی می‌ماند:

// کاهش فرکانس Heartbeat از ~۱۵ ثانیه به ۶۰ ثانیه
add_filter( 'heartbeat_settings', function( $settings ) {
    $settings['interval'] = 60;
    return $settings;
} );

و اگر سایت‌تان تک‌نویسنده است و به قفل نوشته چندکاربره نیازی ندارید، می‌توانید آن را فقط در صفحه ویرایش نوشته نگه دارید:

add_action( 'init', function() {
    global $pagenow;
    // Heartbeat فقط هنگام ویرایش نوشته لازم است
    if ( ! in_array( $pagenow, [ 'post.php', 'post-new.php' ], true ) ) {
        wp_deregister_script( 'heartbeat' );
    }
}, 1 );
⚠️ هشدار: حذف کامل Heartbeat روی سایت‌های چندنویسنده یا فروشگاهی، قفل ویرایش محصول/نوشته را می‌شکند و ممکن است دو نفر هم‌زمان یک صفحه را ویرایش کنند و کار همدیگر را بازنویسی کنند. الگوی بالا (فقط صفحه ویرایش) برای بیشتر سایت‌ها نقطه تعادل است.

۱۳اقدام ۱۱؛ wp-config.php: هفت تنظیم سبک‌ سازی برای افزایش سرعت وردپرس

فایل wp-config.php قبل از همه چیز لود می‌شود و تعاریفش رفتار کل وردپرس را تعیین می‌کند. به‌جای ده‌ها اسنیپت پراکنده، این بلوک واحد را دقیقاً بالای خط «That’s all, stop editing» قرار دهید. هر ثابت را توضیح داده‌ام تا بدانید چه چیزی را خاموش یا محدود می‌کنید؛ این هفت تعریف، ارزان‌ترین قدم‌های افزایش سرعت وردپرس‌اند چون یک‌بار نوشته می‌شوند و برای همیشه اثر می‌گذارند:

// سقف حافظه PHP برای فرانت و مقدار بیشتر برای پیشخوان
define( 'WP_MEMORY_LIMIT', '128M' );
define( 'WP_MAX_MEMORY_LIMIT', '256M' );

// بازبینی‌ها: حداکثر ۵ نسخه برای هر محتوا (به‌جای بی‌نهایت)
define( 'WP_POST_REVISIONS', 5 );

// ذخیره خودکار هر ۲ دقیقه به‌جای هر ۶۰ ثانیه (ریسک کمتر، کوئری کمتر)
define( 'AUTOSAVE_INTERVAL', 120 );

// زباله‌دان هر ۷ روز یک‌بار خالی شود
define( 'EMPTY_TRASH_DAYS', 7 );

// ویرایشگر فایل قالب و افزونه از پیشخوان غیرفعال (امنیت + جلوگیری از خرابی‌های تصادفی)
define( 'DISALLOW_FILE_EDIT', true );

سه نکته مهم: اول، اگر هاست شما محدودیت حافظه سخت دارد، مقدار WP_MEMORY_LIMIT بیشتر از سقف هاست اثری ندارد؛ سقف واقعی را از «سلامت سایت» بخوانید. دوم، بازبینی‌هایی که با WP_POST_REVISIONS محدود می‌کنید از امروز به بعد آرام نمی‌شود؛ برای گذشته، کوئری پاک‌سازی اقدام ۲ را اجرا کنید. سوم، DISALLOW_FILE_EDIT اگرچه مستقیم سرعت را تغییر نمی‌دهد ولی از نصف خرابی‌های «کدی که داخل پیشخوان کپی شد» جلوگیری می‌کند؛ همان خرابی‌هایی که بعدا سرور را به زانو درمی‌آورند.

۱۴اقدام ۱۲؛ پاک‌ سازی خروجی Core؛ شش مهمان ناخوانده در مسیر سرعت وردپرس

وردپرس برای سازگاری با همه سناریوها، چیزهایی در خروجی head می‌گذارد که بیشتر سایت‌های مدرن هرگز استفاده‌شان نمی‌کنند. این‌ها جداگانه کوچک‌اند، ولی جمع‌شان چند درخواست و مقداری HTML در تک‌تک صفحات است که بابتش هیچ ارزشی به کاربر نمی‌دهید. این بلوک یک‌پارچه را در functions.php قالب فرزند بگذارید:

// ۱) اسکریپت و استایل ایموجی (وردپرس برای ایموجی قدیمی CDN لود می‌کند)
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );

// ۲) اسکریپت embed (فقط اگر خودتان محتوایتان در سایت‌های دیگر embed نمی‌شود)
add_action( 'wp_footer', function() { wp_deregister_script( 'wp-embed' ); } );

// ۳) لینک‌های اضافه head: RSD، لینک کوتاه، نسخه وردپرس
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wp_shortlink_wp_head' );
remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_head', 'wlwmanifest_link' );

// ۴) استایل آیکون‌های دشبورد برای کاربران مهمان (dashicons فقط برای پیشخوان است)
add_action( 'wp_enqueue_scripts', function() {
    if ( ! is_user_logged_in() ) {
        wp_deregister_style( 'dashicons' );
    }
} );

// ۵) استایل کتابخانه بلوک در قالب‌های کلاسیک که از گوتنبرگ در قالب استفاده نمی‌کنند
add_action( 'wp_enqueue_scripts', function() {
    wp_dequeue_style( 'wp-block-library' );
    wp_dequeue_style( 'global-styles' );
}, 100 );
⚠️ قبل از بند ۵ دقیق بخوانید: اگر قالب شما بلوکی (Block Theme) است یا صفحات با گوتنبرگ/المنتور ساخته شده‌اند، حذف استایل کتابخانه بلوک چیدمان صفحات را می‌شکند. این بند فقط برای قالب‌های کلاسیکِ کاملاً PHP است. بعد از اعمال، صفحه اصلی، یک نوشته و صفحه تماس را با چشم بازبینی کنید.

و دو مهمان دیگر: XML-RPC و پینگ‌بک

XML-RPC رابط قدیمی وردپرس برای اتصال اپلیکیشن‌هاست؛ اگر با اپ موبایل رسمی یا Jetpack کار نمی‌کنید، می‌توانید آن را در .htaccess کاملاً ببندید تا هم درخواست‌های بیهوده کم شود و هم حملات brute-force روی آن بی‌اثر:

<Files xmlrpc.php>
  Require all denied
</Files>

پینگ‌بک و ترک‌بک را هم از مسیر «تنظیمات ← گفت‌وگو» خاموش کنید؛ مکانیزمی قدیمی که علاوه بر اعلان‌های اسپم‌گونه، درگاهی برای درخواست‌های اضافه است و تأثیر مثبت قابل‌سنجشی روی سئو ندارد. اگر می‌خواهید کامل‌تر عمل کنید، متد پینگ‌بک را هم با این فیلتر از XML-RPC خارج کنید:

add_filter( 'xmlrpc_methods', function( $methods ) {
    unset( $methods['pingback.ping'] );
    unset( $methods['pingback.extensions.getPingbacks'] );
    return $methods;
} );

📍 سناریوی واقعی: وب‌سایت خدماتی با قالب کلاسیک؛ حذف ایموجی، embed، dashicons مهمان و بستن XML-RPC در مجموع ۳ درخواست و حدود ۴۵ کیلوبایت از هر صفحه کم کرد. عدد کوچکی است، ولی وقتی با ۱۱ اقدام قبلی جمع می‌شود، همان مرزی است که سایت را از «نیاز به بهبود» به «خوب» می‌برد.

۱۵ابزارهای سنجش: کدام ابزار چه چیزی را در مسیر افزایش سرعت وردپرس می‌بیند؟

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

ابزار چه چیزی می‌سنجد بهترین کاربرد در این مسیر
PageSpeed Insights هم داده میدانی کاربران واقعی (CrUX) هم تست آزمایشگاهی Lighthouse داوری رسمی؛ تنها ابزاری که عددش را گوگل در رتبه‌بندی می‌بیند
Lighthouse (در DevTools) تست آزمایشگاهی روی دستگاه شما با لیست دقیق فرصت‌های بهبود تست فوری هر تغییر قبل و بعد از اعمال، روی استیجینگ
GTmetrix واترفال بارگذاری + ساختار صفحه با لوکیشن قابل انتخاب دیدن ترتیب لود فایل‌ها و پیدا کردن گلوگاه‌های بصری
WebPageTest تست چندمرحله‌ای از لوکیشن‌های مختلف با جزئیات عمیق TTFB و فیلم رندر تشخیص دقیق TTFB و تأیید نتیجه اقدام ۱ از ابزار رسمی‌اش
Chrome DevTools تب Network، Performance و Coverage؛ واقعیت لحظه‌ای مرورگر ممیزی شخص‌ثالث‌ها (اقدام ۴)، پوشش CSS (اقدام ۶)، تسک‌های طولانی INP
Query Monitor کوئری دیتابیس، هوک‌ها، اسکریپت/استایل‌های صف و خطاهای PHP شکار کوئری کند و نام هندل‌ها (اقدام ۲ و ۳)؛ فقط موقت
💡 اختلاف عددها طبیعی است: نمره Lighthouse در دو اجرای پشت سر هم می‌تواند چند امتیاز فرق کند؛ چون شبکه و CPU شما متغیر است. تصمیم را با روند ۷ روزه داده میدانی PSI و سه اجرای میانه Lighthouse بگیرید، نه با یک اسکرین‌شات. هدف، سبز شدن داده میدانی است؛ نمره آزمایشگاهی فقط چراغ راه است.

۱۶
چک‌لیست اجرا: نقشه ۹۰ دقیقه‌ای افزایش سرعت وردپرس بدون افزونه + جدول ردیابی نتیجه

ترتیب اجرا مهم است؛ از بزرگ‌ترین اثر شروع کنید و هربار سنجش کنید. این برنامه برای یک جلسه کاری متمرکز طراحی شده است:

دقیقه کار اثر متوقع
۰ تا ۱۰ بکاپ کامل + ثبت وضع فعلی: TTFB با curl، نمره PSI، حجم autoload خط پایه برای قضاوت
۱۰ تا ۲۵ اقدام ۱: ارتقای PHP، فعال‌سازی OPcache، قوانین .htaccess بزرگ‌ترین افت TTFB
۲۵ تا ۴۵ اقدام ۲: پاک‌سازی autoload و ترنزینت‌ها + ثابت‌های wp-config از اقدام ۱۱ کاهش بار دیتابیس در همه صفحات
۴۵ تا ۶۰ اقدام ۱۲: پاک‌سازی head + خاموش کردن XML-RPC و پینگ‌بک کاهش درخواست‌های هر صفحه
۶۰ تا ۷۵ اقدام ۵: بهینه‌سازی سه تصویر بزرگ بالای صفحه (ریسایز، WebP، ابعاد) جهش LCP و CLS در صفحات کلیدی
۷۵ تا ۹۰ سنجش مجدد: سه اجرای PSI + curl؛ ثبت در شیت ردیابی سند اثبات برای گزارش

اقدام‌های ۳، ۴، ۶، ۷ و ۸ (قالب، شخص‌ثالث‌ها، CSS، JS و فونت) فنی‌ترند؛ اگر تجربه کدنویسی ندارید، آن مرحله را به برنامه‌ریز فنی بسپارید یا با مشاوره سئو تیم ویرا نقشه دقیق وضعیت سایت خودتان را بگیرید. کرم‌پودر روی بنیان ترک‌خورده، ساختمان نمی‌سازد.

۱۶.۱ جدول ردیابی قبل و بعد

شاخص قبل بعد هدف
TTFB صفحه اصلی زیر ۶۰۰ میلی‌ثانیه؛ ترجیحاً زیر ۳۰۰
LCP موبایل (میدانی) ۲.۵ ثانیه یا کمتر
INP موبایل (میدانی) ۲۰۰ میلی‌ثانیه یا کمتر
CLS ۰.۱ یا کمتر
حجم autoload زیر ۸۰۰ کیلوبایت
تعداد درخواست‌ها / حجم صفحه اول کاهش محسوس نسبت به خط پایه

۱۶.۲ جدول مرجع نهایی؛ هر اقدام، متریک و ابزار خودش

این جدول، خلاصه کل مسیر افزایش سرعت وردپرس بدون افزونه است؛ برای گزارش به تیم یا مدیر، همین تصویر ذهنی کافی است:

اقدام متریک هدف ابزار صحت‌سنجی
۱. سرور و PHP TTFB WebPageTest و دستور curl
۲. دیتابیس TTFB و هشدار سلامت سایت phpMyAdmin و Query Monitor
۳ و ۴. قالب و درخواست‌ها حجم صفحه و تعداد دامنه‌ها تب Network در DevTools
۵. تصاویر LCP و CLS PageSpeed Insights
۶ و ۷. CSS و جاوااسکریپت FCP و INP Lighthouse و تب Coverage
۸. فونت‌ها CLS و زمان خوانا شدن متن تب Network و بازبینی چشمی
۹ تا ۱۲. کرون، هارت‌بیت، کانفیگ و Core مصرف سرور و حجم head داشبورد هاست و سورس صفحه

و در نهایت، نکته‌ای که هیچ چک‌لیستی نمی‌گوید: سرعت یک پروژه یک‌باره نیست. هر آپدیت قالب، هر افزونه جدید و هر کمپین تبلیغاتی می‌تواند هفته‌ها بهینه‌سازی را پس ببرد. همین جدول را ماهانه یک‌بار تکرار کنید؛ همین انضباط کوچک، تفاوت سایت‌هایی است که سریع می‌مانند با سایت‌هایی که هر سال دوباره «پروژه سرعت» تعریف می‌کنند.

۱۷سوالات متداول درباره افزایش سرعت وردپرس بدون افزونه (۵۰ پرسش کاربردی)

۱. واقعاً می‌شود سرعت وردپرس را بدون هیچ افزونه‌ای بالا برد؟
بله؛ بیشتر افت سرعت از سرور، دیتابیس، قالب و خروجی پیش‌فرض وردپرس می‌آید که همه با تنظیمات و کد قابل درمان هستند. همین مقاله دوازده اقدام مستقل از افزونه را با کد آماده پوشش داده است.
۲. اولین و مؤثرترین قدم برای افزایش سرعت وردپرس چیست؟
سنجش TTFB و رفع چراغ‌های قرمز سمت سرور: ارتقای PHP به ۸.۲ یا جدیدتر، فعال‌سازی OPcache و بررسی حجم autoload در دیتابیس. بدون این پایه، بهینه‌سازی‌های فرانت اثر محدودی دارند.
۳. چرا سایت من با وجود افزونه کش هنوز کند است؟
کش فقط نسخه آماده HTML را سرو می‌کند؛ اگر TTFB سرور بالا باشد، صفحات کش‌ناشدنی (سبد خرید، پیشخوان، کاربر لاگین‌کرده) همچنان کند می‌مانند و مشکل دیتابیس متورم یا جاوااسکریپت سنگین را هم حل نمی‌کند.
۴. TTFB خوب برای وردپرس چقدر است؟
زیر ۶۰۰ میلی‌ثانیه قابل قبول، زیر ۳۰۰ میلی‌ثانیه خوب و زیر ۲۰۰ میلی‌ثانیه عالی است. آن را با دستور curl یا WebPageTest بسنجید، نه با حدس.
۵. OPcache چیست و چرا تا این حد مهم است؟
OPcache بایت‌کد کامپایل‌شده فایل‌های PHP را در حافظه نگه می‌دارد تا در هر لود، هزاران فایل دوباره کامپایل نشوند. روی وردپرس، فعال‌سازی‌اش معمولاً بزرگ‌ترین کاهش هزینه اجرای PHP است.
۶. در هاست اشتراکی هم می‌توان OPcache را تنظیم کرد؟
اغلب بله؛ از مسیر «MultiPHP INI Editor» در cPanel یا فایل .user.ini در ریشه هاست. اگر گزینه‌ای نبود، از پشتیبانی بخواهید فعالش کند؛ هاستی که OPcache نداشته باشد، برای وردپرس انتخاب ضعیفی است.
۷. ارتقای PHP به نسخه ۸ سایت را نمی‌شکند؟
اگر قالب و افزونه‌هایتان به‌روز باشند، نه. روند امن: اول روی استیجینگ تست، بعد تغییر نسخه، بعد بررسی صفحات کلیدی و چک Error Log. نسخه‌های خیلی قدیمی قالب‌ها و افزونه‌های متروک همان محل احتمالی شکستن‌اند.
۸. autoload در wp_options دقیقاً چیست؟
پرچمی است که رکوردهای دارای آن را در تک‌تک لودهای صفحه از دیتابیس می‌خواند؛ حتی وقتی به آن‌ها نیازی نیست. هرچه حجمش بیشتر، هزینه هر صفحه بیشتر. هدف، کمتر از ۸۰۰ کیلوبایت است.
۹. چرا کوئری‌های اینترنت برای اندازه autoload روی سایت من عدد اشتباه نشان می‌دهد؟
چون از وردپرس ۶.۶ مقادیر autoload فقط yes و no نیست و on، auto و auto-on هم دارد. کوئری‌های قدیمی فقط yes را می‌شمارند؛ از کوئری مدرن همین مقاله که همه مقادیر را پوشش می‌دهد استفاده کنید.
۱۰. _transient_dirsize_cache چیست که این‌قدر بزرگ شده؟
کش محاسبه حجم پوشه‌های رسانه است که روی بعضی سایت‌ها باگ دارد و تا بیش از یک مگابایت رشد می‌کند. تغییر autoload آن به no معمولاً بی‌خطر است و هشدار سلامت سایت را برطرف می‌کند.
۱۱. آیا ساخت ایندکس روی wp_options هنوز لازم است؟
اگر وردپرس شما ۵.۳ یا جدیدتر است، ایندکس autoload به‌صورت پیش‌فرض در هسته وجود دارد و کاری لازم نیست. توصیه‌های قدیمی مقاله‌ها متعلق به قبل از آن نسخه است.
۱۲. حذف بازبینی‌های قدیمی (Revisions) به محتوای فعلی آسیب می‌زند؟
نه؛ بازبینی‌ها فقط نسخه‌های تاریخی‌اند، نه خود محتوا. با این حال توصیه ما پاک‌سازی موارد قدیمی‌تر از ۹۰ روز است تا چند نسخه اخیر به‌عنوان پشتوانه بمانند و سقف پنج نسخه برای آینده.
۱۳. با کدام ابزار کوئری کند وردپرس را پیدا کنم؟
Query Monitor؛ موقتاً نصب، کوئری‌های کند و تکراری و مسئول هر کدام (قالب یا افزونه) را می‌بینید و بعد حذفش می‌کنید. برای سایت‌های خیلی بزرگ، Slow Query Log هاست دقیق‌تر است.
۱۴. تعداد افزونه‌ها مهم است یا کیفیتشان؟
کیفیت. ده افزونه تمیز و استاندارد از یک افزونه بدکد کم‌هزینه‌ترند. هر افزونه را با سه سؤال بسنجید: آیا استفاده فعالانه دارد؟ آیا در همه صفحات لود می‌شود؟ آیا جایگزین سبک‌تری ندارد؟
۱۵. dequeue کردن فایل‌ها خطرناک نیست؟
با تست نه. همیشه روی استیجینگ و با شرط صفحه انجامش دهید: فایل فرم‌ساز فقط صفحه تماس، فایل اسلایدر فقط صفحه اصلی. dequeue اشتباه یعنی صفحه‌ای که استایل یا اسکریپت‌ش گم شده، پس بازبینی چشمی واجب است.
۱۶. قالب فعلی‌ام سنگین است؛ باید حتماً تعویضش کنم؟
الزاماً نه. ابتدا با dequeue شرطی، حذف اسنیپت‌های مرده functions.php و سبک‌سازی CSS/JS تا حد زیادی قابل نجات است. تعویض قالب وقتی منطقی است که بیشتر خروجی‌اش برای صفحات کلیدی‌تان بلااستفاده باشد.
۱۷. المنتور ذاتاً سایت را کند می‌کند؟
المنتور برای هر صفحه کتابخانه‌های بیشتری لود می‌کند، ولی کندی نهایی به قالب زیرین، امکانات فعال و سبک طراحی شما هم بستگی دارد. با قالب سبک، غیرفعال‌کردن ویجت‌های بلااستفاده و همین اقدام‌های مقاله می‌توان نمره خوبی گرفت.
۱۸. WebP یا AVIF؛ کدام را انتخاب کنم؟
WebP را انتخاب پیش‌فرض بگذارید: پشتیبانی جهانی، تولید سریع و مستقیم در وردپرس پذیرفته. AVIF برای تصاویر خیلی بزرگ و هیرو فشرده‌تر است ولی تولیدش کندتر و سازگاری‌اش باریک‌تر است.
۱۹. وردپرس WebP می‌پذیرد یا باید کاری خاص کرد؟
نسخه‌های جدید وردپرس آپلود مستقیم WebP را می‌پذیرند. کافی است فایل را قبل از آپلود با Squoosh یا cwebp تبدیل و در ابعاد درست ریسایز کنید.
۲۰. چرا تصویر شاخص (هیرو) را نباید lazy load کرد؟
چون همان تصویر معمولاً عنصر LCP صفحه است و lazy load دانلودش را به تأخیر می‌اندازد. برای تصویر هیرو loading=”eager” و fetchpriority=”high” بگذارید و lazy را به تصاویر پایین‌تر از دید اول اختصاص دهید.
۲۱. LCP چیست و چگونه زیر ۲.۵ ثانیه می‌آید؟
لحظه دیده‌شدن بزرگ‌ترین عنصر محتوایی صفحه است. چهار اهرم درمان: TTFB پایین (اقدام ۱ و ۲)، تصویر هیرو سبک و با ابعاد (اقدام ۵)، CSS غیرقفل‌کننده (اقدام ۶) و جاوااسکریپت تأخیری (اقدام ۷).
۲۲. INP چیست و چرا از FID مهم‌تر شد؟
INP فاصله بین هر تعامل کاربر تا واکنش بصری بعدی است و از مارس ۲۰۲۴ رسماً جایگزین FID شد؛ چون FID فقط اولین کلیک را می‌دید ولی INP کل عمر صفحه را می‌سنجد. درمان اصلی‌اش سبک‌کردن جاوااسکریپت رشته اصلی است.
۲۳. CLS بالا را چطور تشخیص و رفع کنم؟
در ابزار PageSpeed Insights بخش تشخیصی، عناصر جابه‌شونده دقیقاً نام‌برده می‌شوند. اغلب درمان‌ها: width و height برای تصاویر، رزرو فضای بنرها، و font-display: swap با fallback نزدیک به متن فارسی.
۲۴. چرا عدد PageSpeed هر بار تست فرق می‌کند؟
تست آزمایشگاهی روی شبکه و CPU شما حساس است و چند امتیاز نوسان طبیعی است. قضاوت را با داده میدانی (CrUX) و میانه چند اجرا بگیرید، نه با یک اسکرین‌شات تنها.
۲۵. داده میدانی (Field Data) با آزمایشگاهی (Lab) چه فرقی دارد؟
داده میدانی از کاربران واقعی کروم در ۲۸ روز گذشته می‌آید و همان است که گوگل در رتبه‌بندی می‌بیند. داده آزمایشگاهی شبیه‌سازی لحظه‌ای برای عیب‌یابی است؛ سبز شدن Lab بدون بهبود Field یعنی هنوز کار نشده است.
۲۶. فونت فارسی را از کجا و چگونه محلی میزبانی کنم؟
فایل رسمی woff2 فونت (مثلاً وزیرمتن که آزاد منتشر می‌شود) را دانلود، در پوشه قالب بگذارید و با @font-face تعریف کنید. فقط وزن‌های پرکاربرد را نگه دارید و برای فونت بالای صفحه preload بگذارید.
۲۷. فونت‌های گوگل روی سایت ایرانی مشکل دارند؟
دو مشکل شایع: اتصال اضافه به دامنه خارجی (هزینه DNS و TLS) و ناپایداری دسترسی از شبکه‌های داخلی. میزبانی محلی هر دو را حذف می‌کند و راست‌به‌چپ فونت فارسی را هم مستقیم کنترل می‌کنید.
۲۸. Critical CSS دستی برای چه صفحه‌هایی ارزش دارد؟
فقط صفحات پول‌ساز: صفحه اصلی، دسته‌بندی‌های اصلی و صفحه محصول. استایل ناحیه دید اول را با گزارش Coverage استخراج، داخل head اینجکت کنید و باقی را با media=”print” و ترفند onload غیرقفل‌کننده لود کنید.
۲۹. defer و async دقیقاً چه تفاوتی دارند؟
هر دو دانلود را موازی می‌کنند؛ defer اجرا را بعد از ساخت DOM و به ترتیب انجام می‌دهد (مناسب اسکریپت‌های سایت) و async بلافاصله بعد از دانلود اجرا می‌کند (مناسب سرویس‌های مستقل مثل آنالتیکس).
۳۰. چطور بفهمم کدام اسکریپت INP را خراب کرده؟
در DevTools تب Performance ضبط کنید و یک تعامل (کلیک/اسکرول) انجام دهید؛ تسک‌های زرد و قرمز بلندتر از ۵۰ میلی‌ثانیه مظنون‌اند. نام فایل هر تسک در پنل پایین مشخص است و معمولاً مستقیم به پیج‌بیلدر یا ابزار بازاریابی اشاره می‌کند.
۳۱. حذف jquery-migrate چه سودی دارد و چه ریسکی؟
سودش: حذف ~۱۵ تا ۲۰ کیلوبایت جاوااسکریپت از همه صفحات. ریسکش: افزونه یا قالب خیلی قدیمی ممکن است خطای کنسول بگیرد. ابتدا روی استیجینگ حذف کنید، صفحات کلیدی را بگردید و کنسول را ببینید.
۳۲. WP-Cron خاموش کنم، چه چیزی از کار می‌افتد؟
فقط اگریکه زمان‌بندی دارد (انتشار آینده نوشته، پاک‌سازی‌ها) به کرون واقعی نیاز پیدا می‌کند؛ همه‌چیز فوری‌اش همان لحظه اجرا می‌شود. پس کرون سروری هر ۱۵ دقیقه بسازید تا کاری عقب نماند.
۳۳. Heartbeat را کاملاً خاموش کنم یا نه؟
توصیه ما خیر؛ مهارش کنید. فواصل را به ۶۰ ثانیه برسانید و آن را فقط در صفحه ویرایش نوشته فعال نگه دارید تا قفل ویرایش چندنویسنده و ذخیره خودکار از کار نیفتد.
۳۴. XML-RPC را بستن به Jetpack یا اپ وردپرس آسیب می‌زند؟
بله؛ Jetpack و اپلیکیشن موبایل رسمی از XML-RPC استفاده می‌کنند. اگر این دو را ندارید، بستنش در .htaccess هم امنیت را بیشتر و هم درخواست‌های بیهوده را کمتر می‌کند.
۳۵. حذف استایل wp-block-library به سایت گوتنبرگی آسیب می‌زند؟
بله؛ قالب‌های بلوکی و صفحات ساخته‌شده با بلوک‌ها به آن استایل نیاز دارند. این اقدام فقط برای قالب‌های کلاسیکِ PHP است که در قالب‌شان از بلوک استفاده نشده؛ بعد از حذف، صفحات را چشمی بازبینی کنید.
۳۶. ووکامرس را هم می‌شود بدون افزونه بهینه کرد؟
بخش سرور و دیتابیس قاعده یکسانی دارد (OPcache، autoload، ترنزینت‌ها) ولی صفحات سبد و تسویه حساب کش‌ناپذیرند و به هاست قوی‌تر وابسته‌اند. تفاوت مهم: سقف OPcache و حافظه را برای ووکامرس بالاتر ببرید و ساعت اوج را زیر نظر داشته باشید.
۳۷. CDN بدون افزونه قابل راه‌اندازی است؟
بله؛ CDN لایه DNS است نه افزونه. با انتقال DNS به سرویس مثل Cloudflare، فایل‌های ثابت از نزدیک‌ترین نقطه سرو می‌شوند. فقط مطمئن شوید کش HTML صفحات داینامیک (سبد خرید ووکامرس) با قواعد Bypass از کش خارج می‌شود.
۳۸. LiteSpeed باشم، چه تفاوتی در این اقدام‌ها هست؟
بیشتر کدها (فشرده‌سازی، کش مرورگر، XML-RPC) همان .htaccess جواب می‌دهد، ولی کش سمت سرور LiteSpeed قوی‌ترین امکانش است و از پنل هاست فعال می‌شود؛ اگر فعال بود، بخش‌هایی از بهینه‌سازی را خودش پوشش می‌دهد و زمان‌تان را روی اقدام‌های ۲ به بعد بگذارید.
۳۹. تغییرات .htaccess سایت را با خطای ۵۰۰ مواجه کرد؛ چه کنم؟
بیشتر وقت‌ها یک بلوک تکراری یا قانون متعلق به ماجول غیرفعال است. بلوک تازه اضافه‌شده را موقتاً کامنت کنید، بعد خط‌به‌خط برگردانید تا خطای پنهان بیرون بیاید. از قبل کپی فایل سالم را نگه داشته باشید تا برگشت فوری داشته باشید.
۴۰. Minify دستی فایل‌ها امن است؟
اگر نسخه اصلی خوانا را نگه دارید و فقط نسخه فشرده را سرو کنید، بله. دروغ رایج: مینیفای کردن هر فایل به‌تنهایی نمی‌تواند مشکل حجم کلی قالب را حل کند؛ فقط فاصله‌ها و کامنت‌ها را می‌کاهد، نه قوانین مرده را.
۴۱. ترکیب (Concatenate) فایل‌های CSS و JS در عصر HTTP/2 هنوز خوب است؟
معمولاً نه لازم و گاهی زیان‌آور. در HTTP/2 و ۳ چند فایل موازی هزینه کمی دارند و ترکیب دستی، هر تغییر کوچک را به دانلود دوباره کل بسته تبدیل می‌کند. بیشتر انرژی را روی حذف فایل‌های بی‌استفاده بگذارید، نه چسباندنشان.
۴۲. سئوئه وردپرس روی سرعت اثر دارد؟
افزونه‌های بزرگ سئو (Yoast، Rank Math) تغییری در خروجی فرانت نمی‌ دهند ولی جدول‌ هایشان را در دیتابیس می‌سازند. اثرشان معمولاً جزئی است؛ ات روی نتیجه با ابزار تشخیصی اقدام ۲ بسنجید و بر اساس حدس تصمیم نگیرید.
۴۳. چرا سایت من فقط روی موبایل کند است؟
چون سه‌چیز متفاوت است: CPU ضعیف‌تر گوشی برای اجرای JS، شبکه ناپایدارتر و فضای دید کوچک‌تر که هر جهش چیدمان بیشتر خودنما می‌کند. اولویت موبایل: جاوااسکریپت کمتر، تصویر ابعاددار و فونت محلی.
۴۴. سرعت سایت مستقیم بر رتبه گوگل اثر دارد؟
Core Web Vitals یکی از سیگنال‌های تجربه صفحه است و در رقابت نزدیک، سایت سریع‌تر برنده است؛ ولی سرعت، محتوای ضعیف را رتبه‌دار نمی‌کند. تأثیر مستقیم‌ترش روی نرخ پرش، نرخ تبدیل و همین تجربه کاربر است که خودش غیرمستقیم به رشد کمک می‌کند.
۴۵. نمره ۱۰۰ در PageSpeed لازم است؟
نه؛ هزینه رسیدن از ۹۰ به ۱۰۰ معمولاً با حذف امکانات مفید سایت پرداخت می‌شود. هدف پیشنهادی: داده میدانی هر سه متریک سبز و نمره آزمایشگاهی بالای ۸۵-۹۰. بعدش بازده نزولی است.
۴۶. چند وقت یک‌بار بهینه‌سازی سرعت تکرار شود؟
سنجش ماهانه (PSI + TTFB) و پاک‌سازی فصلی (autoload، ترنزینت‌ها، فایل‌های رسانه بدون استفاده). هر آپدیت بزرگ قالب یا نصب ابزار بازاریابی جدید، یک سنجش فوری می‌خواهد.
۴۷. ابزار LCP عنصر دقیقِ ناموفق را نشان می‌دهد؟
بله؛ در گزارش PageSpeed Insights بخش تشخیصی، عنصر LCP با تصویر و سلکتورش مشخص می‌شود. همان را ببینید و بعد اقدام متناسب (سبک‌کردن تصویر یا بهبود TTFB) را هدف بگیرید.
۴۸. برای سایت خبری پرترافیک خاص، چه تفاوتی در اقدام‌ها است؟
دو تفاوت بزرگ: اول کرون واقعی قطعاً لازم است (اقدام ۹) چون wp-cron در موج ترافیک، منابع را قفل می‌کند؛ دوم صفحه اصلی و صفحه خبر Critical CSS و تصاویر خیلی سبک می‌خواهند چون همان دو قالب، بیش از ۸۰٪ ترافیک را می‌دهند.
۴۹. می‌شود همه این اقدام‌ها را روی سایت زنده اعمال کرد؟
اقدام‌های ۱ و ۲ (با بکاپ) معمولاً امن‌اند ولی اقدام‌های ۳ تا ۸ که به قالب و کد دست می‌زنند باید روی استیجینگ تست و بعد با برنامه به لایو بروند. قانون ثابت: یک تغییر بزرگ در هر بار، سنجش، بعد تغییر بعدی.
۵۰. اگر همه اقدام‌ها را انجام دهم، دیگر به افزونه کش نیازی ندارم؟
برای سایت‌های کم‌تراکم و استاتیک تا حد زیادی بله؛ برای فروشگاه و سایت پرترافیک، کش سمت سرور (LiteSpeed Cache یا کش Nginx هاست) هنوز بهترین دوست شماست. فرق استراتژی در این است: بعد از این اقدام‌ها، کش «انتخاب» است نه «وظیفه نجات».

سایت‌تان باید همیشه سریع باشد؛ فقط امروز نه.

اگر اجرای این دوازده اقدام برایتان فنی است یا می‌خواهید نتیجه را مثل یک پروژه حرفه‌ای با گزارش قبل و بعد ببینید، تیم ویرا مسیر افزایش سرعت وردپرس بدون افزونه را که در این مقاله آموختید، قدم‌به‌قدم برای شما اجرا می‌کند؛ از سنجش TTFB و جراحی دیتابیس تا سبک‌سازی قالب و پایش ماهانه Core Web Vitals.

درخواست بهینه‌سازی سرعت سایت از تیم ویرا

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

متأسفیم! فرم شما یافت نشد.

متأسفیم! فرم شما یافت نشد.