Vyso Guides
WordPress image CDN: setup and service choices
A WordPress image CDN serves images through a distributed delivery network. A cache stores copies closer to visitors; an image optimization service can also resize, compress, or convert those copies. Choose the service according to the delivery problem you have, then verify the URLs and responses your public pages use.
If you already have appropriately sized, compressed images, a conventional CDN may cover the remaining delivery work. If mobile readers receive desktop-sized originals, you also need responsive markup or a transformation service. The WordPress image optimization workflow explains source preparation and loading behavior.
What changes when images use a CDN
With a pull CDN, a request for an uncached image can cause the CDN to fetch the file from your web server. Later requests can use the cached copy. The origin still needs to hold an accessible source unless you deliberately use a separate storage or offloading workflow.
Some WordPress CDN integrations rewrite image URLs to a provider hostname. A proxy CDN such as Cloudflare can serve requests through your existing hostname. An unchanged URL therefore does not prove that delivery still comes directly from your host.
A CDN plugin usually connects WordPress to an external service or rewrites its output. Installing the plugin alone does not create a worldwide delivery network. Confirm which account, configuration, and service plan it requires.
Cloudflare for image caching and optimization
Cloudflare's standard proxy can cache eligible image responses. Its default cache behavior depends on file extensions, response headers, and other rules. Check origin headers such as Cache-Control and Set-Cookie if an image is not cached. A request can pass through Cloudflare without being a cache hit.
For a conventional domain setup, follow Cloudflare's domain onboarding instructions, review imported DNS records, and enable proxying for the relevant website hostname. Check that the site and HTTPS work before changing optimization settings. Hosts with an existing Cloudflare integration may provide a different setup path.
Cloudflare image optimization for WordPress has separate options:
Polish compresses eligible origin images in Cloudflare's cache and keeps their URLs. It is available on Pro, Business, and Enterprise plans, with no Free-plan availability.
Image transformations can resize and convert images fetched from configured sources. Your integration must request the transformed versions. Enabling the feature does not update every WordPress image tag.
Cloudflare's Images pricing includes 5000 unique transformations per month on Images Free. The allowance applies to images stored outside Cloudflare Images; storage in Images requires a paid plan. A different source or set of transformation parameters can count as a separate transformation. Repeated requests for the same transformation within the month count once.
After the Free allowance is exceeded, existing cached transformations continue to be served, but new transformations return error 9422. For same-domain sources, Cloudflare documents an onerror option that can redirect to the original. Check how your integration handles that limit before relying on the free allowance for a large catalog.
Ordinary caching, Polish, and image transformations solve different parts of delivery. Choose a documented integration for the feature you need, and inspect a real image response to confirm it is active.
Bunny CDN with optional image optimization
Bunny CDN uses a paid delivery service, and its official WordPress plugin integrates CDN URL rewriting, Optimizer, and separate media offloading features. Offloading moves media to Bunny Storage; it should be configured deliberately when you want a storage change.
For a setup that keeps uploads on your existing host, use a pull zone with the website as the origin. You need access to the Bunny account and WordPress administration. Confirm that the zone's CDN hostname can fetch an existing upload, then configure the plugin's CDN integration. If you use a custom hostname, complete its DNS and TLS setup before enabling it in page output.
Bunny Optimizer adds compression, WebP output, and URL-based image transformations. Its listed price is $9.50 per month per website, with CDN bandwidth charged separately. The delivery pricing page lists bandwidth rates and a $1 monthly minimum. Verify the current billing terms for your zones and locations before enabling optional services.
Test an article photo, a featured image, and a page-builder background. A plugin can rewrite the usual WordPress output while a custom template still contains an origin URL. Check whether responsive candidates use the CDN as well as the main src.
Jetpack CDN for a free image delivery option
Jetpack's image CDN is a free option for a Jetpack-connected WordPress site. It can suit a public blog that wants image delivery without a separate bandwidth plan.
Enable Site Accelerator under Jetpack > Settings > Performance. The Site Accelerator documentation describes image URL rewriting to hosts such as i0.wp.com, resizing, and WebP delivery to supporting browsers. Keep the source images on your server.
Its asset CDN covers a limited set of WordPress core, Jetpack, and WooCommerce files. Theme assets and other plugins' files are outside that coverage. This matters when you want a WordPress CDN for the whole site's static files.
Jetpack also documents a cache limitation: replacing an image at the same URL does not provide normal cache invalidation. For a refreshed image, use a new filename; random query-string cache busters do not solve it. Individual removal requests go through support. It is a poor match for a workflow that repeatedly replaces images under permanent URLs and needs immediate self-service purging.
Compare delivery models and service limits
Start with the source of delay and the maintenance work your site can support. Geography, cache behavior, and image size can matter more than the provider's number of locations.
| Service | Delivery route | Image processing | Cost or limit to check |
|---|---|---|---|
| Cloudflare | Proxy through the site's hostname | Ordinary caching; Polish or image transformations are separate features | Images Free: 5000 unique transformations per month; Polish requires a paid website plan |
| Bunny CDN | Separate CDN hostname with WordPress URL rewriting | Optional Optimizer adds compression, WebP, and transformations | Bandwidth-based delivery; $1 monthly minimum. Optimizer: $9.50 per month per website, plus CDN bandwidth |
| Jetpack | Image URLs on hosts such as i0.wp.com | Resizing and WebP delivery | Free for connected sites; refresh an image by changing its filename |
For device-specific image delivery managed from WordPress, an adaptive optimizer such as Optimole is another option. The WordPress image optimization plugin comparison covers its delivery model and allowance alongside library compressors. Check current plans before a subscription or bulk operation.
Ask what happens when the source changes, a quota is reached, or the service is disabled. Test your most important visitor regions on the same pages. A provider's marketing example is not a benchmark of your site.
Roll out CDN image delivery on a small set of pages
Work on staging first. Back up the database and uploads, record the existing integration settings, and confirm access to WordPress administration and the CDN account. Domain proxying or a custom delivery hostname also requires control of the relevant DNS records. Start with delivery changes before enabling optional offloading, so you can check each operation separately.
Record the current image URLs, response sizes, and loading times on a representative article and an image-heavy page.
Configure the CDN source and verify that an image is accessible through its delivery path.
Enable the WordPress integration. Check rendered HTML for image URLs and responsive candidates.
Clear the site's page cache so readers receive the updated markup. Purge relevant CDN files when the source bytes changed.
Load the public pages while logged out at mobile and desktop widths. Check an article image, a featured image, and a builder background if the site uses them. Confirm the selected responsive candidates and inspect failures before enabling more transformations.
Keep one integration responsible for rewriting a given image's delivery path. Two layers that each transform or proxy the other's URL can make debugging difficult and create unnecessary variants. Compression on the origin can coexist with CDN delivery when their responsibilities are clear. The WordPress image compression guide explains how to compare source quality and transferred bytes.
Verify caching, formats, and replacement behavior
Use the image element's currentSrc property to identify the resource the browser selected. Compare its pixel dimensions with the displayed width and screen density. Rewriting src alone can leave an origin URL in srcset; check both.
In Chrome DevTools, open the Network panel, enable Disable cache, filter image requests, and reload with the mobile viewport already set. Record the selected URL, response headers, transferred bytes, and timing, then repeat at desktop width. The Network panel reference explains these controls. Disabling the browser cache does not clear a WordPress page cache or the CDN cache.
For a cache check, compare repeated requests to the same image URL and inspect the provider's response headers. Cloudflare's cache response documentation defines CF-Cache-Status: HIT as a response found in cache. MISS means the eligible image was absent and fetched from the origin. The first request can be a miss; repeated misses need investigation, and a CDN hostname alone does not establish a cache hit.
Inspect Content-Type when checking format conversion. A URL ending in .jpg can return WebP when the delivery service negotiates formats. Confirm the response in the browsers you support and inspect visible quality separately from the byte count.
Replace one test image using your normal editorial workflow and verify the update publicly. Cloudflare supports purging a specific file URL; your integration may also need to invalidate transformed variants or cached HTML. Provider-specific purge behavior should be part of your publishing process.
If images disappear, inspect the failing request before changing settings. A 403 suggests an origin access or security rule to investigate; a 404 suggests a wrong path or missing file. Confirm that HTTPS works on both the origin and delivery hostname. Temporarily disabling rewriting can help isolate the failure while retaining the source images.
Delivery from an existing media library
Vyso also combines CDN delivery with URL-based image transformations. Its CDN delivery URLs can request resized images, set output quality, and convert images to WebP or AVIF while retaining the original asset. If you manage images in Vyso, a WordPress template or integration can use those URLs in src and responsive srcset candidates. Check the resulting markup and responses with the same delivery checks.
Keep going
Make the media library less work.
See how Vyso brings search, enrichment, cleanup, and delivery into one product.
Start free