در بهینه‌سازی سرعت سایت، Image CDN (شبکه تحویل محتوای تصویر) لایه‌ای است که تبدیل فرمت، Resize لحظه‌ای و کش لبه را در یک سرویس یکپارچه ترکیب می‌کند و پایه بهبود LCP محسوب می‌شود. بدون تبدیل خودکار به WebP یا AVIF، بدون Resize بر اساس دستگاه و بدون کش لبه، تصاویر سنگین بزرگ‌ترین گلوگاه سرعت سایت باقی می‌مانند. تفاوت CDN معمولی و Image CDN، پیاده‌سازی در وردپرس و ووکامرس و استراتژی کش، تصمیم‌های معماری را به تصمیم‌های تجربه کاربری گره می‌زند. تبدیل، Resize، کش لبه و یکپارچه‌سازی، چهار لایه ضروری در Image CDN حرفه‌ای هستند. در این راهنما از ساختار پایه تا استقرار تولیدی Image CDN را با نگاه مهندسی و کد عملی پوشش می‌دهیم.

در پروژه‌های واقعی، بعد از رفع مشکل کش و JS، بزرگ‌ترین گلوگاه سرعت همیشه تصاویر هستند. Image CDN این گلوگاه را به یک مزیت رقابتی تبدیل می‌کند. این راهنما از همان نقطه‌ای شروع می‌کند که تجربه می‌گوید بیشترین ارزش را دارد.

Image CDN چیست و چه تفاوتی با CDN معمولی دارد؟

Image CDN یک CDN تخصصی است که علاوه بر توزیع، تصاویر را در لحظه تبدیل، Resize و بهینه‌سازی می‌کند. برخلاف CDN معمولی که فقط فایل را توزیع می‌کند، Image CDN بر اساس پارامترهای درخواست، نسخه بهینه‌شده را در لبه می‌سازد.

معیارCDN معمولیImage CDN
تبدیل فرمتخیربله (WebP، AVIF)
Resize لحظه‌ایخیربله
کش لبهبلهبله
بهینه‌سازی کیفیتخیربله
حذف Metadataخیربله

راهنمای Web Vitals Monitoring و پایش سرعت و Core Web Vitals 2026 نقطه شروع مناسبی هستند.

چرا Image CDN برای LCP حیاتی است

LCP (Largest Contentful Paint) معمولاً توسط یک تصویر Hero تعیین می‌شود. کاهش حجم این تصویر به زیر ۱۰۰KB، LCP را چند ثانیه بهبود می‌دهد.

تبدیل خودکار WebP و AVIF

Image CDN بر اساس هدر Accept مرورگر، فرمت مناسب را انتخاب می‌کند.

Accept: image/avif,image/webp,image/*,*/*;q=0.8

→ AVIF (اگر پشتیبانی شود)
→ WebP (اگر AVIF پشتیبانی نشود)
→ JPEG (fallback)

مقایسه فرمت‌ها

فرمتکاهش حجمپشتیبانی
JPEGپایه100%
WebP25-35%95%+
AVIF50-60%80%+

تبدیل در Cloudflare Images

https://imagedelivery.net/HASH/image-id/public
https://imagedelivery.net/HASH/image-id/w=800,format=auto
https://imagedelivery.net/HASH/image-id/w=1200,format=avif,quality=85

تبدیل در Bunny CDN

https://example.b-cdn.net/image.jpg?width=800&format=webp&quality=85

Resize لحظه‌ای و Responsive Images

Image CDN بر اساس پارامترهای URL، نسخه مناسب را در لحظه تولید می‌کند.

<img
  src="https://cdn.example.com/image.jpg?w=800&format=auto"
  srcset="
    https://cdn.example.com/image.jpg?w=400&format=auto 400w,
    https://cdn.example.com/image.jpg?w=800&format=auto 800w,
    https://cdn.example.com/image.jpg?w=1200&format=auto 1200w,
    https://cdn.example.com/image.jpg?w=1600&format=auto 1600w
  "
  sizes="(max-width: 600px) 100vw, (max-width: 1200px) 50vw, 33vw"
  loading="lazy"
  decoding="async"
  alt="توضیح تصویر"
/>

الگوهای Resize حرفه‌ای

- Hero: 1920x1080 → 800x450 (mobile)
- Product: 800x800 → 400x400 (thumbnail)
- Blog Thumbnail: 800x450 → 400x225
- Avatar: 200x200 → 100x100

Responsive Images در وردپرس

<?php
add_filter( "wp_calculate_image_srcset", function( $sources, $size_array, $image_src, $image_meta, $attachment_id ) {
    $cdn_url = get_option( "wpk_image_cdn_url" );
    if ( ! $cdn_url ) {
        return $sources;
    }
    foreach ( $sources as $width => $source ) {
        $sources[ $width ]["url"] = $cdn_url . "?url=" . urlencode( $source["url"] ) . "&w=" . $width . "&format=auto";
    }
    return $sources;
}, 10, 5 );

کش لبه و استراتژی Invalidation

Image CDN در لبه شبکه کش می‌کند و پاسخ را از نزدیک‌ترین نقطه به کاربر می‌فرستد.

Cache-Control برای تصاویر

Cache-Control: public, max-age=31536000, immutable

دلیل: تصاویر با نام یکتا تغییرناپذیر هستند.

Invalidation استراتژی

روش 1: Versioned URLs (توصیه‌شده)
- تصویر جدید = URL جدید
- تصویر قدیمی به‌طور خودکار منقضی می‌شود

روش 2: Purge by Tag
- برچسب‌گذاری تصاویر
- Purge گروهی در تغییر

روش 3: Purge by URL
- Purge دقیق برای فایل خاص

Invalidation با Cloudflare API

<?php
function wpk_purge_image_cdn( $attachment_id ) {
    $url = wp_get_attachment_url( $attachment_id );
    if ( ! $url ) {
        return;
    }
    $zone_id = get_option( "wpk_cloudflare_zone_id" );
    $api_key = get_option( "wpk_cloudflare_api_key" );
    if ( ! $zone_id || ! $api_key ) {
        return;
    }
    wp_remote_post( "https://api.cloudflare.com/client/v4/zones/{$zone_id}/purge_cache", array(
        "headers" => array(
            "Authorization" => "Bearer {$api_key}",
            "Content-Type"  => "application/json",
        ),
        "body" => wp_json_encode( array( "files" => array( $url ) ) ),
        "timeout" => 15,
    ) );
}
add_action( "edit_attachment", "wpk_purge_image_cdn" );
add_action( "delete_attachment", "wpk_purge_image_cdn" );

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

مقایسه سرویس‌های Image CDN

سرویسقیمتAVIFیکپارچه‌سازی وردپرس
Cloudflare Images$5/100kبلهافزونه رسمی
Bunny CDN + Optimizer$0.01/GB + Optimizerبلهافزونه
Imgix$3/1000 originبلهافزونه
Cloudinaryرایگان تا 25GBبلهافزونه رسمی
Fastly Image Optimizerسازمانیبلهسفارشی
ShortPixel Adaptive Images$5-10/ماهبلهافزونه رسمی

معیارهای انتخاب

1. پشتیبانی از AVIF
2. یکپارچه‌سازی با وردپرس
3. تعداد Edge Location
4. قیمت به ازای 1000 تصویر
5. پشتیبانی از Resize و Crop
6. امکان Purge سریع
7. SLA و پشتیبانی

تخمین هزینه

سایت با 50,000 بازدید ماهانه و 10 تصویر در هر صفحه:
- 500,000 درخواست تصویر ماهانه
- Cloudflare Images: ~$25/ماه
- Bunny CDN + Optimizer: ~$15/ماه
- Cloudinary: ~$50/ماه

پیاده‌سازی در وردپرس

پیاده‌سازی Image CDN در وردپرس از سه مسیر انجام می‌شود.

مسیر اول: افزونه آماده

افزونه‌های محبوب:
- ShortPixel Adaptive Images
- Cloudflare Images (افزونه رسمی)
- Optimole
- EWWW IO
- Bunny CDN

مسیر دوم: پیاده‌سازی دستی

<?php
add_filter( "wp_get_attachment_image_src", function( $image, $attachment_id, $size ) {
    $cdn = get_option( "wpk_image_cdn_url" );
    if ( ! $cdn ) {
        return $image;
    }
    $width = $image[1] ?? 0;
    $height = $image[2] ?? 0;
    $image[0] = $cdn . "?url=" . urlencode( $image[0] ) . "&w=" . $width . "&h=" . $height . "&format=auto";
    return $image;
}, 10, 3 );

مسیر سوم: Rewrite تمام تصاویر

<?php
add_filter( "the_content", function( $content ) {
    $cdn = get_option( "wpk_image_cdn_url" );
    if ( ! $cdn ) {
        return $content;
    }
    $pattern = '/<img([^>]+)src="([^"]+)"/i';
    $content = preg_replace_callback( $pattern, function( $matches ) use ( $cdn ) {
        $original = $matches[2];
        $optimized = $cdn . "?url=" . urlencode( $original ) . "&format=auto";
        return str_replace( $original, $optimized, $matches[0] );
    }, $content );
    return $content;
}, 99 );

الگوی Preload تصویر Hero

<?php
add_action( "wp_head", function() {
    if ( ! is_singular() ) {
        return;
    }
    $hero = get_post_meta( get_the_ID(), "wpk_hero_image", true );
    if ( $hero ) {
        echo '<link rel="preload" as="image" href="' . esc_url( $hero ) . '" imagesrcset="' . esc_attr( wpk_hero_srcset() ) . '" />';
    }
}, 1 );

یکپارچه‌سازی با ووکامرس

فروشگاه‌های ووکامرس با تعداد زیادی تصویر محصول، بیشترین سود را از Image CDN می‌برند.

تصاویر محصول با Image CDN

<?php
add_filter( "woocommerce_product_get_image", function( $image, $product, $size ) {
    $cdn = get_option( "wpk_image_cdn_url" );
    if ( ! $cdn ) {
        return $image;
    }
    // جایگزینی URL اصلی با CDN
    $image = preg_replace_callback( '/src="([^"]+)"/', function( $matches ) use ( $cdn ) {
        return 'src="' . $cdn . "?url=" . urlencode( $matches[1] ) . "&format=auto" . '"';
    }, $image );
    return $image;
}, 10, 3 );

گالری محصول

<?php
add_filter( "woocommerce_single_product_image_thumbnail_html", function( $html, $attachment_id ) {
    $cdn = get_option( "wpk_image_cdn_url" );
    if ( ! $cdn ) {
        return $html;
    }
    $full = wp_get_attachment_image_url( $attachment_id, "full" );
    $thumb = $cdn . "?url=" . urlencode( $full ) . "&w=800&format=auto";
    $html = str_replace( wp_get_attachment_image_url( $attachment_id, "woocommerce_single" ), $thumb, $html );
    return $html;
}, 10, 2 );

بهبود Core Web Vitals در صفحات محصول

- Preload تصویر اصلی محصول
- Resize تصویر گالری بر اساس device
- Lazy-load تصاویر گالری اضافی
- تبدیل همه تصاویر به WebP/AVIF
- حجم هر تصویر زیر 100KB

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

بهبود LCP با Image CDN

LCP در ۷۵٪ سایت‌ها توسط تصویر Hero تعیین می‌شود. Image CDN بیشترین تأثیر را بر این شاخص دارد.

الگوی بهینه LCP

<!-- تصویر Hero -->
<link rel="preload" as="image" href="https://cdn.example.com/hero.jpg?w=1200&format=auto" imagesrcset="..." />

<img
  src="https://cdn.example.com/hero.jpg?w=1200&format=auto"
  srcset="..."
  fetchpriority="high"
  loading="eager"
  decoding="sync"
  width="1200"
  height="600"
  alt="..."
/>

مقایسه LCP قبل و بعد

سناریوLCPحجم تصویر
JPEG 800KB بدون CDN4.5s800KB
WebP 300KB بدون CDN3.2s300KB
AVIF 150KB با Image CDN1.8s150KB
AVIF 80KB با CDN + Preload1.2s80KB

چک‌لیست بهبود LCP

□ Preload تصویر Hero
□ fetchpriority="high"
□ تبدیل به AVIF
□ Resize بر اساس viewport
□ کش لبه با TTL بالا
□ Preconnect به CDN
□ عدم Lazy-load تصویر Hero

پایش و مانیتورینگ

پایش Image CDN در سه سطح انجام می‌شود: Cache Hit Ratio، حجم صرفه‌جویی‌شده و Impact بر LCP.

متریک‌های کلیدی

- Cache Hit Ratio: هدف > 95%
- P75 LCP: هدف < 2.5s
- Bytes Saved: کاهش حجم
- Format Distribution: AVIF vs WebP vs JPEG
- Error Rate: خطای تبدیل

پایش RUM

import { onLCP } from "web-vitals";

onLCP( ( { value, attribution } ) => {
  // ثبت URL تصویر LCP
  const lcpUrl = attribution.url || "";
  fetch( "/api/vitals", {
    method: "POST",
    body: JSON.stringify( {
      metric: "LCP",
      value,
      element: attribution.element,
      imageUrl: lcpUrl,
    } ),
  } );
} );

راهنمای RUM و پایش واقعی کاربر نقطه شروع مناسبی است.

تست و اعتبارسنجی

تست Image CDN در سه سطح انجام می‌شود: سطح تبدیل، سطح کش و سطح تجربه کاربر.

تست تبدیل فرمت

curl -H "Accept: image/avif,image/webp" -I https://cdn.example.com/image.jpg?format=auto
# Content-Type باید image/avif یا image/webp باشد

تست کش

# درخواست اول
curl -I https://cdn.example.com/image.jpg?format=auto
# cf-cache-status: MISS

# درخواست دوم
curl -I https://cdn.example.com/image.jpg?format=auto
# cf-cache-status: HIT

تست Resize

curl -I "https://cdn.example.com/image.jpg?w=400&format=auto"
# Content-Length باید کمتر از نسخه اصلی باشد

اشتباهات رایج در تست

اشتباه اول، نبود تست با مرورگر قدیمی. اشتباه دوم، نبود تست با کش خالی. اشتباه سوم، نبود تست با تصویر بزرگ. اشتباه چهارم، نبود تست با تصویر ترانسپرنت. اشتباه پنجم، نبود پایش پس از Deploy.

پرسش‌های پرتکرار درباره Image CDN

آیا Image CDN جایگزین افزونه بهینه‌سازی است؟

خیر، مکمل است. افزونه، تصاویر را در سرور بهینه می‌کند، Image CDN در لبه.

چرا AVIF بر WebP برتری دارد؟

AVIF ۲۰-۳۰٪ حجم کمتر از WebP در همان کیفیت دارد.

آیا Image CDN روی SEO اثر دارد؟

به‌طور غیرمستقیم، از طریق بهبود LCP و Core Web Vitals. راهنمای Core Web Vitals و سئو را ببینید.

چگونه Invalidation را مدیریت کنم؟

با Versioned URLs یا Purge API. راهنمای Cache Invalidation در وردپرس را ببینید.

آیا Image CDN برای فروشگاه مقرون‌به‌صرفه است؟

بله، به‌ویژه در فروشگاه‌های با تعداد بالای تصویر محصول.

چند وقت یک بار باید Cache Purge کنم؟

فقط در تغییر تصویر. با Versioned URLs نیازی به Purge دوره‌ای نیست.

نتیجه و مسیر ادامه

Image CDN مؤثرترین راه بهبود LCP و سرعت تصاویر است. کلید موفقیت، تبدیل خودکار، Resize لحظه‌ای، کش لبه و یکپارچه‌سازی دقیق با وردپرس و ووکامرس است. اگر این لایه‌ها با دقت طراحی شوند، سرعت سایت به‌طور محسوس بهبود می‌یابد.

پیشنهاد می‌کنم مسیر یادگیری را با Web Vitals Monitoring و پایش سرعت ادامه دهید و سپس بهینه‌سازی ووکامرس برای سرعت فروشگاه را به‌عنوان مکمل مطالعه کنید. همچنین مفهوم Content delivery network و AVIF را در ویکی‌پدیا مرور کنید.

اگر روی پروژه واقعی خود Image CDN پیاده کرده‌اید، برایم جالب است بدانید کدام سرویس بیشترین تأثیر را داشته است. تجربه خودتان را در دیدگاه‌ها بنویسید.