WordPress Image Optimization: Plugin vs Pre-Upload Compression
Most WordPress image optimization advice starts with "install a plugin." Ends with "install a plugin." So half the time you end up with an optimizer you didn't need, plus another update cycle, plus another thing that can break during uploads.
Decide whether you actually need one first.
- Your Media Library is already full — a bulk optimizer (EWWW, ShortPixel) earns its keep. Processing the backlog is the real value
- New site, or you have a handful of images — compress before uploading, skip the plugin
- You're uploading phone photos straight from the camera roll — fix that before anything else. It matters more than every other lever in this article
First: WordPress is already compressing (most people miss this)
WordPress doesn't store your original JPEG untouched — it re-encodes every upload at quality 82 by default, and has since 4.5. Since 5.3, anything whose longest side exceeds 2560px also gets auto-resized (controlled by big_image_size_threshold). Upload a camera original and WordPress quietly serves you a scaled version.
You can change the quality in your theme's functions.php:
add_filter('jpeg_quality', function () {
return 75; // default is 82; lower = smaller files but more artifacts
}); Go below 75 and you'll start seeing edge artifacts in photographs. Honestly, reducing the file size of what you upload in the first place is a better lever than cranking quality down. You get the same result without the visual cost.
Option 1: Optimize with a plugin
If your Media Library is already stuffed with unoptimized images, this is the fastest path. The real value here is bulk processing the backlog. Automatic optimization of new uploads is a bonus, not the point.
| Plugin | What it does | When it makes sense |
|---|---|---|
| EWWW Image Optimizer | Runs locally on your server, no image count cap on the free tier. WebP conversion included | Large libraries, or you don't want to send images to a third-party API |
| Smush | Simple UI, straightforward setup. Free tier limits batch size | Smaller sites, or you just want the path of least resistance |
| ShortPixel | Aggressive compression. Credit-based monthly quota | You want maximum file reduction while keeping quality |
| Converter for Media | Focuses on WebP/AVIF delivery rather than compression itself | Specifically want next-gen formats served to visitors |
Whichever one you go with: back up before running a bulk operation. "I don't like how this looks, let me undo it" isn't always available afterwards. If the plugin offers to retain originals, turn it on. It costs disk space, but it buys you a way out.
Why you might skip plugins entirely
Optimization plugins run image processing on every upload. On shared hosting, that can hit CPU limits and cause timeouts during bulk uploads. Plugin conflicts of exactly this kind are one of the documented reasons image uploads fail in WordPress.
For a small or new site, uploading already-optimized images keeps both your server load and your plugin list lean.
Option 2: Compress before uploading
Structurally the better answer. Less data over the wire, faster uploads, no extra plugin running on every request.
On desktop
- Squoosh (browser-based, from Google) — drop an image in and tune quality visually
- ImageOptim (Mac) — drag a whole folder for batch processing
- 1600px on the longest side is plenty for in-content. Anything over 2560px gets resized by WordPress anyway
On a phone
This is where it breaks, though. iOS Photos doesn't do batch resize, and running images through an editor one at a time isn't a workflow. Meanwhile, iPhone photos are 3-6MB each — over 10MB on Pro models — which is enough to hit upload_max_filesize on plenty of hosts.
SnapPress resizes on send, with three quality presets, so you don't need a separate compression step before uploading. HEIC→JPEG conversion happens in the same pass. If your workflow is "photos taken on a phone, published to WordPress," this keeps the compression work off both your server and your plugin list.
Is WebP worth it?
WordPress 5.8 and later accepts WebP uploads. But automatic WebP generation isn't in core — it was proposed for 6.1 and dropped over server load and storage concerns.
To actually serve WebP you need a plugin (Converter for Media, EWWW) or a CDN-level transform like Cloudflare's. The payoff is real: 25-35% smaller than JPEG at visually equivalent quality, and it compounds on photo-heavy sites.
That said, if your JPEGs are already sized correctly, WebP is a marginal gain. Converting a 1MB image to WebP still leaves you with an image that was never sized properly. Get dimensions right first, then worry about format.
Target sizes that actually matter
| Use | Dimensions | Target file size |
|---|---|---|
| In-content images | 1200-1600px longest side | 100-200KB |
| Featured images | 1200x630px | around 150KB |
| Header / hero images | 1920px wide | 200-300KB |
| Thumbnails and icons | up to 2x display size | under 30KB |
These are guidelines, not rules. The real test is whether Largest Contentful Paint lands under 2.5s; once it does, further tuning is optional. For sizing featured images specifically, see WordPress featured image size.
When optimization doesn't make the site faster
A common and frustrating outcome: images are compressed, the score doesn't move. Usually the bottleneck is somewhere else.
- Oversized images still requested in HTML — a 1600px file rendering in a 400px slot. Verify
srcsetis doing its job - LCP isn't an image — run PageSpeed Insights, find the actual Largest Contentful Paint element. If it's a font or a script, image work changes nothing
- Lazy loading applied too aggressively —
loading="lazy"on an above-the-fold image delays LCP rather than improving it - No CDN — serving every image from one origin means every visitor pays the full distance
Bottom line
- WordPress already re-encodes JPEGs at quality 82 and resizes above 2560px. You're not starting from zero
- Plugins earn their place when you're processing an existing backlog. Otherwise, pre-upload compression is cleaner
- WebP auto-generation isn't in core — you need a plugin or CDN for that
- Aim for 100-200KB in content, ~150KB for featured. The real benchmark is LCP under 2.5s
- Uploading phone originals? Fix that before anything else
For managing the library itself, see the WordPress Media Library guide. If uploads are failing outright, start with Cannot Upload Images to WordPress? 8 Causes and How to Fix Each One.
Send iPhone photos to WordPress without a separate compression step
SnapPress resizes on send with three quality presets and converts HEIC to JPEG automatically. Up to 20 photos per batch, straight into your Media Library — no compression plugin, no desktop round trip. Free to start (10 photos/month).
Two steps to start: install the free "SnapPress Connect" plugin on WordPress, then install the iPhone app and pair them with a QR code.
About the author
Founder & CEO, 37Design
Founder & CEO of 37Design, a web and AI consultancy based in Tokyo, Japan. Built SnapPress to eliminate the pain of uploading dozens of iPhone photos to WordPress — one by one.
37design.co.jp