WordPress Image Optimiser Not Working: LiteSpeed, Elementor and Others
Image optimisation plugins for WordPress promise smaller files and WebP or AVIF versions at the press of a button, yet a common complaint is that LiteSpeed Cache, Elementor's image optimiser or another plugin seems to do nothing. The queue sits still, the counts never move, or the plugin reports success while visitors still download heavy JPEGs. That matters because images are usually the largest part of a page, and they decide how fast the main content appears on a phone. This guide shows how to find which stage has failed, from background jobs and cloud allowances to blocked downloads and server rewrite rules, how to fix each one on Apache, nginx, Plesk and Cloudflare, and how to choose a plugin that suits your hosting.
- Why WordPress image optimisers stop working
- Common causes, by symptom
- How to diagnose it with a few commands
- LiteSpeed Cache image optimisation not working
- Elementor image optimiser and choosing a plugin
- Server and CDN notes: Apache, nginx, Plesk and Cloudflare
- The fix, step by step
- Edge cases worth knowing
- Keeping image optimisation working
- Questions and answers
Why WordPress image optimisers stop working
Every WordPress image optimisation plugin does the same three jobs, and a failure in any one of them looks the same from the dashboard: the numbers do not move, or the images on the page are still heavy JPEGs.
- Queue. When you upload an image, WordPress creates several resized copies (thumbnail, medium, large and any sizes your theme registers). The plugin adds the original and those copies to a queue, usually processed in the background by WP-Cron.
- Process. The plugin compresses each file and often makes a WebP or AVIF copy. Cloud plugins such as LiteSpeed Cache (through QUIC.cloud) and Elementor's image optimiser send the files, or a link to them, to an external service and fetch the results back. Local plugins use the image libraries in your own PHP, GD or Imagick.
- Deliver. The smaller file has to reach the visitor. That means rewriting the HTML to point at the new file, wrapping images in a
<picture>element, or a server rule that swaps the file when the browser says it accepts WebP.
Most "not working" reports are not a broken plugin. They are a stalled queue, a service that cannot reach your images, a used-up monthly allowance, or new files that exist on disk but are never served because the web server or a CDN ignores the rewrite. Finding which of the three stages has stopped is the whole diagnosis.
Common causes, by symptom
| Symptom | Likely cause | Where to look |
|---|---|---|
| Queue stuck at the same number, nothing processed | WP-Cron disabled or never triggered on a quiet site | DISABLE_WP_CRON in wp-config.php, the plugin's cron settings |
| Requests sent but images never come back | The cloud service cannot download your images: firewall, bot protection or hotlink rules return 403 | Your server access log and any security plugin or Cloudflare firewall events |
| Stopped part-way through the month | Free plan allowance or credits used up | The plugin's account or quota page |
| Error that the site is not connected or the key is invalid | Site URL changed, staging copy, or key not linked | Plugin connection settings |
| WebP files exist but the page still loads JPEG | Delivery not working: nginx ignores .htaccess, page cache serves old HTML, CDN cached the original | curl with an Accept header, page source |
| Local plugin says WebP is not supported | PHP GD or Imagick built without WebP or AVIF | PHP info for the version your site actually uses |
| Images broken, doubled or blurry | Two plugins compressing or rewriting the same files | Active plugin list, theme and page builder settings |
How to diagnose it with a few commands
If you have SSH access, these checks take a couple of minutes and tell you which stage has failed. Replace the paths and domain with your own. On Plesk the site usually lives under /var/www/vhosts/example.com/httpdocs.
1. Were optimised copies created at all?
cd /var/www/vhosts/example.com/httpdocs
find wp-content/uploads -name '*.webp' | wc -l
find wp-content/uploads -name '*.avif' | wc -l
ls -la wp-content/uploads/2026/09/ | head -20
A count of zero means the process stage has never completed. LiteSpeed Cache stores its copies next to the original with an extra extension, for example hero.jpg.webp. Other plugins use hero.webp or a separate folder.
2. Are background jobs running?
grep -n "DISABLE_WP_CRON" wp-config.php
wp cron test
wp cron event list --fields=hook,next_run_relative | grep -iE 'litespeed|image|optim'
If wp cron test fails, or events show as overdue by hours, the queue cannot move. WP-CLI comes with Plesk and most managed hosts.
3. Does the server deliver the new file?
curl -sI -H "Accept: image/webp,*/*" https://example.com/wp-content/uploads/2026/09/hero.jpg | grep -iE 'content-type|vary|cf-cache-status'
curl -s https://example.com/ | grep -oE 'src="[^"]+\.(webp|avif|jpe?g|png)"' | head
The first command shows whether a server rewrite swaps the JPEG for WebP, and whether a Vary: Accept header is sent. The second shows what the page HTML actually references. If the plugin rewrites URLs, you should see .webp addresses in the HTML.
4. Can PHP make WebP and AVIF?
php -r 'echo function_exists("imagewebp") ? "GD WebP yes\n" : "GD WebP no\n";'
php -r 'echo function_exists("imageavif") ? "GD AVIF yes\n" : "GD AVIF no\n";'
php -r 'echo class_exists("Imagick") ? implode(",", Imagick::queryFormats("WEBP")) . "\n" : "no Imagick\n";'
Run these with the same PHP version the site uses. On Plesk that may be /opt/plesk/php/8.3/bin/php rather than the system php, and the two can have different extensions loaded.
LiteSpeed Cache image optimisation not working
LiteSpeed Cache does not compress images on your server. It sends a request to QUIC.cloud, which downloads your originals, processes them and makes them ready to pull back. The image optimisation part works on any web server, not only LiteSpeed, although page caching needs a LiteSpeed server.
- Connection. The site has to be linked to QUIC.cloud from the plugin's general settings. A cloned staging site, a changed domain or a move from http to https can leave the link pointing at the wrong address. Reconnect from the live domain.
- Request and pull are separate. On the image optimisation screen you send a request, and the results are fetched later. If the auto pull cron is off and WP-Cron is not running, finished images sit on QUIC.cloud and never arrive. Turn on the auto request and auto pull options, or press the pull button by hand to test.
- Allowance. The free tier processes a limited number of images and requests are sent in batches. Large libraries take days, not minutes. Check the summary for how many are waiting.
- Blocked downloads. If Cloudflare bot protection, Wordfence, a hosting firewall or hotlink protection blocks unknown visitors to
/wp-content/uploads/, QUIC.cloud cannot fetch the originals. Allow its servers or relax the rule for that folder while the queue runs. - WebP replacement. Creating WebP copies and serving them are separate settings. The replacement option rewrites image addresses in the HTML so visitors receive the
.webpfile. After switching it on, purge the LiteSpeed cache and any CDN cache, or visitors keep getting the old cached HTML.
Elementor image optimiser and choosing a plugin
Elementor's image optimiser plugin is also a cloud service. It needs the site connected to an Elementor account, works through a monthly allowance on the free plan, and processes existing images through a bulk screen. When it does nothing, check that the site is still connected after any domain change, that allowance is left this month, and that the bulk screen shows no errors against single files.
Elementor's own lazy loading and image settings are separate from compression. If images are compressed but load late or not at all, see loading lazy not working rather than the optimiser.
Choosing an image optimisation plugin for WordPress
| Approach | Examples | Good for | Watch out for |
|---|---|---|---|
| Cloud compression | LiteSpeed Cache with QUIC.cloud, Elementor's optimiser, ShortPixel, Imagify, Smush | Shared hosting where PHP lacks good image libraries | Monthly allowances, service blocked by firewalls |
| Local conversion | Converter for Media, EWWW in local mode, the WordPress Performance Team's Modern Image Formats plugin | Servers with GD or Imagick that support WebP and AVIF | CPU use on large libraries, needs server delivery rules |
| Image CDN | A CDN or service that resizes and converts on the fly | Large catalogues and many sizes | Monthly cost, a second domain for images |
Pick one. The best choice is the one whose delivery method suits your server: URL rewriting in the HTML works everywhere, while Accept-header rewrites need server rules. For format choices see image format fixes, and for the wider WordPress picture see image fixes in WordPress.
Server and CDN notes: Apache, nginx, Plesk and Cloudflare
Plugins that swap files based on the browser's Accept header write their rules to .htaccess. That works on Apache and LiteSpeed. It does nothing on nginx, which never reads .htaccess.
Apache or LiteSpeed (.htaccess)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{REQUEST_FILENAME}.webp -f
RewriteRule ^(wp-content/uploads/.+\.(?:jpe?g|png))$ $1.webp [T=image/webp,L]
</IfModule>
<IfModule mod_headers.c>
<FilesMatch "\.(jpe?g|png)$">
Header append Vary Accept
</FilesMatch>
</IfModule>
nginx
The map block belongs in the http context, for example in its own file under /etc/nginx/conf.d/. The location block goes in the site's server configuration. This version suits copies named hero.jpg.webp:
map $http_accept $webp_suffix {
default "";
"~*webp" ".webp";
}
location ~* ^/wp-content/uploads/.+\.(png|jpe?g)$ {
add_header Vary Accept;
try_files $uri$webp_suffix $uri =404;
}
Test with sudo nginx -t and reload with sudo systemctl reload nginx.
Plesk
In Apache and nginx Settings, the option to serve static files directly by nginx means JPEG and PNG requests never reach Apache, so the plugin's .htaccess rules are skipped. Either remove jpg, jpeg and png from that list, or add the nginx rules above. The additional nginx directives box sits inside the server block, so put the map in a file under /etc/nginx/conf.d/ instead.
Cloudflare and other CDNs
Standard Cloudflare plans do not keep separate cached copies of an image for each Accept value, so an Accept-based swap behind the CDN can cache whichever version was requested first. Behind a CDN, prefer a plugin mode that rewrites the image URLs in the HTML to .webp files, then purge the cache. More on this in image CDN fixes.
The fix, step by step
Step 1
Find which stage has stopped
Open a page with recent images, view the page source and search for the image file names. Then check the uploads folder for .webp or .avif copies with find. If no copies exist, the queue or processing has failed. If copies exist but the HTML still references .jpg files, delivery has failed. Note which it is, because the rest of the fix depends on it, and write down the queue numbers the plugin shows today.
Step 2
Check the connection and allowance
In the plugin settings, confirm the site is connected to its cloud service on the live domain, not a staging address or the old http version. Open the account or quota page and check how many images or credits remain this month. If the allowance is used up, either wait for the reset, buy credits or switch to a local plugin. Reconnect if the domain has changed, then send a single image to test.
Step 3
Make sure background jobs run
Run wp cron test and look in wp-config.php for DISABLE_WP_CRON. If WP-Cron is disabled or unreliable, add a server cron that runs wp cron event run --due-now every five minutes for the site. In LiteSpeed Cache, switch on the automatic request and automatic pull options. Wait ten minutes, reload the image optimisation screen and check that the waiting count has fallen and the processed count has risen.
Step 4
Let the service reach your images
Send a batch, then search your access log with grep ' 403 ' for blocked requests on /wp-content/uploads/ made at that time. If a security plugin, Cloudflare bot rule, hosting firewall or hotlink protection is blocking requests, allow the optimisation service or relax the rule for the uploads folder. Send another batch and confirm the log now shows 200 responses and that images come back as optimised.
Step 5
Check PHP image support for local plugins
If you use a local plugin, check that the PHP version running the site has GD or Imagick with WebP and, if wanted, AVIF support, using php -r with function_exists('imagewebp'). On Plesk, use the PHP binary for the site's version. If support is missing, install or enable the extension in the PHP settings, restart PHP, and run the plugin's server check again until it reports WebP as available.
Step 6
Keep only one optimiser active
List active plugins with wp plugin list --status=active and look for more than one tool compressing images, creating WebP or rewriting image URLs. Page builders, themes and cache plugins often include their own. Keep the one you trust, switch off the overlapping features in the others, and clear their settings. Reload a page and check that each image appears once, sharp, with a single rewritten address.
Step 7
Fix delivery on the server or CDN
Choose a delivery method that suits your setup. Behind a CDN, use the plugin's HTML rewrite mode so pages reference .webp files directly. On Apache, check the plugin's .htaccess rules are present. On nginx, or Plesk with static files served by nginx, add the map and try_files rules, run sudo nginx -t and reload. Then rerun the curl test and confirm the content type is image/webp.
Step 8
Purge caches and verify
Purge the plugin page cache, any server cache and the CDN cache. Open the page in a private window, open DevTools, filter the Network panel by images and check the Type column shows webp or avif and the sizes are smaller. Run a lab speed test to compare the image transfer size with your earlier figure, and check a second template, such as a blog post, in the same way.
Edge cases worth knowing
- Background images in CSS. HTML rewriting does not reach images set in stylesheets or by a page builder's background setting. These stay as JPEG unless the plugin also rewrites CSS or you swap them by hand.
- Images from another domain. Plugins only optimise files in your media library. Images pulled from a different site or a third-party embed are untouched.
- Visually worse images. Aggressive or lossy modes can add artefacts to product photos and text in images. Use a balanced mode and compare a few files at full size.
- The hero is now lazy-loaded. Some optimisation plugins also switch on lazy loading for every image. That can slow the first screen; see the LCP guide.
Keeping image optimisation working
- Set up a real server cron that triggers WP-Cron every five minutes, so queues move even when the site has no visitors.
- Keep one optimiser active, and note in your site records which plugin owns compression, WebP and lazy loading.
- After any domain change, staging push or migration, reconnect the cloud service and check the allowance.
- Once a month, run the curl check on a recent upload and spot-check a page's HTML for
.webpor.avifaddresses. - Resize originals before upload. A 6,000 pixel photo compressed well is still far heavier than a 2,000 pixel one; see image size fixes.
For the speed effect of all this across your theme, the WordPress page speed guide covers caching and scripts alongside images.
1. Why is LiteSpeed image optimisation not working?
LiteSpeed image optimisation usually stops because the site is not linked to QUIC.cloud on its live domain, the automatic pull is off so finished images never come back, or a firewall blocks QUIC.cloud from downloading your originals. Check the connection first, switch on the automatic request and pull options, and make sure WP-Cron runs. If the queue moves but pages still show JPEG files, the WebP replacement setting is off or an old cached copy of the page is being served, so purge every cache layer after changing it.
2. Why is the Elementor image optimiser not working?
The Elementor image optimiser most often fails because the site lost its connection to the Elementor account after a domain or URL change, or because the monthly allowance on the free plan has run out. Reconnect from the live domain and check the remaining allowance. Then look at the bulk screen for errors against single files, and confirm WP-Cron is running so the background queue can move. If images compress but load late or blank, the cause is lazy loading settings rather than the optimiser.
3. What is the best image optimisation plugin for WordPress?
The best image optimisation plugin for WordPress is the one that suits your hosting and delivery set-up, rather than one named product. On shared hosting with weak PHP image libraries, a cloud plugin such as LiteSpeed Cache with QUIC.cloud, ShortPixel or Imagify is easiest. On a server with GD or Imagick supporting WebP and AVIF, a local plugin avoids allowances. Behind a CDN, choose a plugin that rewrites image URLs in the HTML. Whatever you choose, run only one.
4. Why are my images still JPEG after converting to WebP?
Your images are still JPEG because the WebP copies were created but are not being delivered. The page HTML may still point at the JPEG, the server may be ignoring the plugin rewrite rules, or a cache may be serving an older copy. nginx does not read .htaccess files, and Plesk can serve images straight from nginx, which skips Apache rules. Check the page source for webp addresses, test the image with curl and an Accept header, then purge the page cache and the CDN.
5. Do I need a LiteSpeed server to use LiteSpeed image optimisation?
No, the image optimisation in the LiteSpeed Cache plugin works on any web server, because the compression happens on QUIC.cloud rather than on your hosting. What needs a LiteSpeed or OpenLiteSpeed server is the page caching part of the plugin. On Apache or nginx you can still use the image features, but you need another way to cache pages, and you should check that WebP delivery works on your server, because some rewrite methods depend on server rules.
6. Can I use two image optimisation plugins at the same time?
You should not run two image optimisation plugins on the same images. Compressing an already compressed JPEG again lowers quality for little saving, and two plugins rewriting image addresses or adding picture elements can produce broken or duplicated images. It is fine to use one plugin for compression and a separate tool for something unrelated, such as page caching, as long as only one of them handles compression, WebP conversion and URL rewriting. Switch off the overlapping features in the others.
7. Will optimising images improve my SEO?
Optimising images helps SEO indirectly by making pages load faster, which improves Largest Contentful Paint and the experience for visitors on mobile. Google uses page experience signals, but they are a small factor compared with relevant content. Smaller images also mean Google can crawl your pages more efficiently, and correctly named files with good alt text help in image search. Compression alone will not lift rankings for a page that does not answer the search, so treat it as one part of a wider fix.
The image optimisation audit on aiwebpageseo.com lists every image on a page with its format, file size and dimensions, so you can see straight away whether your plugin's WebP or AVIF versions are actually being served.
Open Image Optimisation Fixes โ