Before uploading to WordPress: resize to 1200–1600px wide and compress to under 200KB for blog images, under 500KB for hero images. WordPress auto-generates 5+ derivative sizes from your upload — a 5MB original means 5MB worth of storage for every size it creates. A 150KB original means lean files across the board.
The derivative size problem most WordPress guides miss
When you upload an image to WordPress, it doesn't just store your file. By default, WordPress generates multiple resized copies:
- Thumbnail: 150×150px (square crop)
- Medium: up to 300×300px
- Medium Large: up to 768px wide
- Large: up to 1024px wide
- Full: your original file
Many themes add their own custom sizes on top of these defaults. A theme might register a "hero" size at 1920×600 and a "card" size at 400×250 — those are generated automatically for every uploaded image too.
WordPress generates each derivative size from your original at 82% JPEG quality. If you upload a 6MB, 6000px wide photo, WordPress creates 6+ files, each derived from a 6MB source. If you upload a 150KB, 1400px wide photo, it creates the same 6+ files but derived from a lean source — which means the derivative files are smaller and faster to generate.
The practical implication: compressing before upload compounds the benefit. Every derivative size inherits the efficiency of your source file. A 500KB upload doesn't save 500KB — it saves 500KB × however many sizes your theme generates, across every image in your media library.
Target dimensions by content type
| Content type | Width before upload | File size target |
|---|---|---|
| Blog post inline image | 1200 px | Under 150KB |
| Featured / hero image | 1600 px | Under 400KB |
| Product image | 1000–1200 px | Under 200KB |
| Logo / header graphic | 2–4× display size | Under 50KB |
| Background / banner | 1920 px | Under 500KB |
| Author photo / thumbnail | 200–400 px | Under 80KB |
WordPress's own compression and how to work with it
WordPress applies JPEG compression at 82% quality by default when generating derivative sizes. This is applied to the source file you upload — it doesn't re-compress an already-compressed derivative.
If you upload a JPEG that you've already compressed at 80% quality, WordPress's 82% re-compression produces a file that's been through two rounds of lossy compression. This causes some quality degradation. To minimize this: either upload your images at 90–95% quality and let WordPress's 82% compression be the primary compression step, or compress to your target quality and accept the minor double-compression effect.
For PNG images, WordPress's quality setting doesn't apply — PNG is lossless. WordPress stores the PNG as-is and generates derivative sizes from it without quality loss. This is why large PNG screenshots can silently bloat a WordPress media library: WordPress generates 6+ copies of a 2MB PNG, none of which are compressed.
The right workflow: compress before upload
- Resize the image to the appropriate width (see table above)
- Compress to under 200KB for blog images, or to your target size for other content types
- Upload the compressed file to WordPress Media Library
- Insert using the block editor — WordPress will select the appropriate derivative size for the display context automatically
This workflow means WordPress's derivative sizes are all generated from a lean, appropriately-sized source. Your media library stays small. Pages load faster. And you never have a situation where WordPress is serving a 1200px-wide image at 300px display width because the theme's responsive image logic fell back to the original.
What to do about existing unoptimized images
If you have hundreds of existing WordPress images uploaded at full resolution, a compression plugin can help. These plugins (Smush, ShortPixel, Imagify, etc.) batch-process your media library, compress images on their servers, and replace the originals plus regenerate derivative sizes.
This is useful for clearing up a bloated existing library. For ongoing uploads, the before-upload workflow above is more efficient: you see the exact file size before committing to WordPress, you control the compression quality directly, and you avoid the dependency on a plugin staying active and operational.
For new images: compress to under 150KB for inline blog images before uploading. That's a sweet spot that works well with WordPress's derivative generation and keeps page weight manageable as your post count grows. If you're processing a large batch of images at once, see our guide on how to compress images in bulk for the fastest free methods.
