What Size Should a WordPress Featured Image Be?
The number most people want is 1200 x 630 pixels — the 1.91:1 ratio Facebook, LinkedIn and X use for link previews. But that is not the size your theme
Published
The number most people want is 1200 x 630 pixels. That is the ratio Facebook, LinkedIn, and X use for link previews (1.91:1), and it is what an Open Graph image should be. If you are setting a featured image mainly so shared links look right, use 1200 x 630 and stop there.
But that number is not what your theme actually displays on the post. WordPress rarely shows your featured image at its original size. The theme requests a specific registered image size, and WordPress serves whichever pre-generated crop matches. That is why an image that looks perfect on Facebook can look soft, stretched, or wrongly cropped inside your single-post template. The “correct” size depends on the theme, not on a universal rule.
Why the theme overrides the number
When you upload an image, WordPress does not store one file. It runs wp_generate_attachment_metadata() and creates a derivative for every registered image size: the three defaults (thumbnail, medium, large), the block-editor medium_large (768px wide), plus any size the theme or a plugin registered with add_image_size().
A theme that wants a wide 16:9 hero will do something like this in functions.php:
add_theme_support( 'post-thumbnails' );
add_image_size( 'hero-featured', 1200, 675, true );
The fourth argument, true, means hard crop. WordPress will crop your image to exactly 1200 x 675, throwing away whatever does not fit the 16:9 box. If your subject is near the top or bottom of the frame, it gets cut. Set to false (or omitted), it scales proportionally and the final dimensions can differ from what you asked for.
Then the template decides which size to pull:
the_post_thumbnail( 'hero-featured' );
Whatever name is passed to the_post_thumbnail() is the crop that renders. So the real featured image size on your site is defined in two places you did not write: the add_image_size() call and the the_post_thumbnail() call in the theme. Uploading a bigger file does not change either one.
There is one more layer. WordPress serves a srcset, so on smaller screens the browser may load the medium or large derivative instead of the full crop. The dimension you see in DevTools is often not the one you uploaded.
How to fix it, in order
1. Find out what your theme actually asks for. Before guessing, see every size WordPress generates from your image and which one is the cropped hero. Drop your image into the WordPress image sizes tool — it shows every derivative WP would create, at exact pixel dimensions, so you can match your source to the real target instead of the mythical 1200x630.
2. Upload big enough to cover the largest crop. If the theme’s hero is 1200 x 675, upload at least that, and ideally 2x for retina (2400 x 1350). WordPress downscales cleanly; it never upscales. An undersized source is the single most common cause of a blurry featured image.
3. Match your aspect ratio to the theme’s crop. If the theme hard-crops to 16:9, feed it 16:9. Compose with the subject centered so a hard crop does not decapitate anyone.
4. If the registered size is wrong, change it and regenerate. Edit the add_image_size() values in a child theme, then rebuild existing thumbnails — new dimensions only apply to future uploads until you do:
wp media regenerate --yes
No WP-CLI? The Regenerate Thumbnails plugin does the same thing from the dashboard.
What not to do
Do not just upload a 1200x630 image and assume it is handled. If the theme’s registered size is 16:9, WordPress hard-crops your 1.91:1 image and you lose the top and bottom. The Open Graph number and the display number are different jobs.
Do not disable WordPress image sizes to “keep the original.” People find advice to set the intermediate sizes to 0 or unhook the_post_thumbnail. Then the theme falls back to serving the full-size file scaled down in the browser — a 4000px JPEG shipped to a phone. That tanks your load time and Core Web Vitals. The derivatives exist for a reason.
Do not trust a plugin’s “recommended size” over your theme’s actual registered size. SEO plugins recommend 1200x630 for the OG tag, which is correct for that tag. It says nothing about what your single-post template crops to.
Do not skip wp media regenerate after changing sizes. Editing add_image_size() does nothing to images already uploaded. This is the step people forget, then conclude the code did not work.
Still stuck?
If the image is still wrong after matching dimensions and regenerating, the problem is usually the crop mode (true vs false) or a srcset serving a smaller derivative than you expect. Drop the file into the image sizes tool to see exactly which crops your setup produces, then compare that against what the browser is loading in DevTools. Match those two and the guesswork ends.