This is a tutorial, not a survey of theory. Every step below is something you actually do — in this exact order — to take a typical image from “decoration the page slows down” to “indexable asset Google rewards.” Most images need 9 of these 10 steps. Run through them once, build a workflow, then it takes about 90 seconds per image going forward.
Worked example throughout: we’ll optimise a real product hero photo — a leather backpack — taken on an iPhone, originally IMG_4827.HEIC, 4032×3024px, 4.8MB. By the end you’ll see exactly what that file looks like, how it’s named, and how it’s described after a proper SEO pass.
An image is SEO-optimised when Google can: (1) find the image (it’s in your sitemap, properly linked from a page), (2) understand what the image shows (alt text, filename, surrounding context), (3) verify the image won’t hurt user experience (file size, format, lazy loading, dimensions specified), and (4) attribute the image to your domain (IPTC copyright, structured data). Skip any of these and you’re leaving ranking signals on the table.
Here’s the order of operations — Step 1 has the highest impact, Step 10 the lowest. The numbering matters; some steps depend on earlier ones being done correctly.
This is the single most-skipped step in image SEO and the one with the biggest payoff. Google reads the URL of every image file as a ranking signal. IMG_4827.HEIC tells Google nothing. brown-leather-backpack-canvas-strap.jpg tells Google exactly what the image shows.
Rules for SEO-optimised filenames:
brown-leather-backpack.jpg, not backpack-brown-leather.jpg.backpack-leather-backpack-bag.jpg is keyword stuffing. Google penalises it.Worked example: IMG_4827.HEIC → brown-leather-backpack-canvas-strap.jpg
iPhones and modern cameras shoot at 4000+px wide. Your website displays images at 1200px wide max. Uploading the camera original means visitors download 10× more pixel data than they’ll ever see. Resize before uploading.
Target dimensions by use case (these are 2026 best practice, accounting for retina displays):
| Image type | Resize to | Why |
|---|---|---|
| Hero / featured image (blog post) | 1200×630px | Matches Open Graph standard; Google Discover requires 1200px minimum |
| Body image (inline) | 1024px wide max, proportional height | Wider than container = wasted bytes |
| Product image (e-commerce) | 2000×2000px (allows zoom) | Google Shopping rewards high-res; users zoom on product detail |
| Thumbnail / icon | 400×400px | 2× the displayed size for retina, no more |
| Logo / SVG | SVG or 500px wide PNG | SVG scales infinitely without quality loss |
Tools: macOS Preview (Tools → Adjust Size), Windows Photos (Resize), Squoosh.app (free, browser-based, also handles compression). For batch resizing: ImageMagick (mogrify -resize 1200x backpack.jpg) or Photoshop’s Image Processor script.
WebP delivers 25–35% smaller file sizes than JPEG at equivalent visual quality. AVIF goes further (40–50% smaller) but with marginally less universal browser support — fine in 2026 with a JPEG fallback. Both are supported natively in WordPress 5.8+.
Convert at the moment of upload, not after. Plugins that convert “after upload” force a separate process to run on every image — slower, more failure-prone, and they often skip already-uploaded images.
The simplest workflow: drag your JPEG into Squoosh, choose WebP at quality 80%, save. Or run cwebp -q 80 backpack.jpg -o backpack.webp on the command line. Compression at quality 80 is the sweet spot — visually indistinguishable from the original to most viewers, but ~30% smaller.
Worked example: brown-leather-backpack-canvas-strap.jpg (3.2MB, JPEG) → brown-leather-backpack-canvas-strap.webp (380KB, WebP). 88% smaller, same visual quality.
Even after format conversion, you may need additional compression. The 2026 file-size targets:
Tools that compress without quality loss: ImageOptim (Mac), TinyPNG (web), Squoosh.app. For WordPress, plugins like ShortPixel, Imagify, or EWWW will do this on existing libraries automatically.
IPTC metadata travels with the image file. Google reads two IPTC fields and uses them in image search results: the copyright field (displays as a “credit” link in Google Images) and the caption/description field. Setting these takes 30 seconds and they earn Google Images credit attribution back to your domain.
Using ExifTool from the command line:
# Set copyright + creator + caption on a single image
exiftool -IPTC:Copyright="© 2026 YourBrand"
-IPTC:By-line="YourBrand"
-IPTC:Caption-Abstract="Brown leather backpack with canvas straps, men's everyday carry bag"
brown-leather-backpack-canvas-strap.webp
# Apply same template to all images in a folder
exiftool -IPTC:Copyright="© 2026 YourBrand"
-IPTC:By-line="YourBrand"
/path/to/images/*.webp
If you don’t use the command line: Adobe Lightroom and Bridge both have metadata template panels. Set a default IPTC template once and apply it on every export.
Phone photos embed your exact GPS coordinates by default. For a personal blog photo of your home or office, that’s a privacy risk. For SEO, camera EXIF data (model, aperture, ISO) adds 5–15KB per image with zero ranking benefit — Google has stated repeatedly that camera metadata is not used for ranking.
Strip camera EXIF and GPS while preserving IPTC copyright:
exiftool -all= --iptc:all --xmp:all brown-leather-backpack-canvas-strap.webp
This removes everything except IPTC and XMP metadata (which contain your copyright and caption from Step 5).
Alt text is the highest-impact ranking signal in image SEO. It’s the text Google reads to understand what the image shows, and it’s also what screen readers announce to visually impaired users. Both audiences benefit from the same kind of description: specific, contextual, and natural.
The formula that works: [what the image shows] + [relevant context for the page topic].
| Bad alt text (avoid) | Good alt text (use this) | Why |
|---|---|---|
| “backpack” | “Brown leather backpack with canvas straps, men’s everyday carry bag” | Specific descriptors + product context |
| “backpack leather backpack bag brown” | “Brown leather backpack on wooden table, lifestyle product photography” | Reads naturally; no keyword stuffing |
| “image” | “” (empty alt for purely decorative images) | Empty is correct for decorative; missing alt makes Google guess |
| “IMG_4827” | “Backpack worn over shoulder, real-world use shot” | Filename != description |
Length: typically 80–125 characters. Long enough to be specific, short enough that screen readers don’t drone. Some accessibility guidelines suggest hard limits — there are technically none in HTML, but Google’s quality team flags suspiciously long alt text (300+ characters) as potential keyword stuffing.
For sites with hundreds of images that need alt text added retroactively, manual writing is impractical. ImageSEO reads each image and generates contextually-tuned alt text in your site language — typically processing thousands of images in under an hour.
Three HTML attributes that change how Google scores your image:
width and height — must be explicit and match the image’s actual pixel dimensions. Prevents Cumulative Layout Shift (CLS), a Core Web Vitals factor.loading="lazy" — defers loading until the user scrolls near the image. WordPress 5.5+ adds this automatically to all non-featured images.fetchpriority="high" — for your hero image only. Tells the browser to download it first. Improves Largest Contentful Paint (LCP).Correct HTML for a hero image:
<img src="brown-leather-backpack-canvas-strap.webp"
alt="Brown leather backpack with canvas straps, men's everyday carry bag"
width="1200"
height="630"
loading="eager"
fetchpriority="high">
Correct HTML for a body image (below the fold):
<img src="backpack-detail-stitching.webp"
alt="Close-up of leather backpack stitching and brass hardware"
width="1024"
height="683"
loading="lazy">
Common mistake: lazy-loading the hero image. This drastically worsens LCP. The hero must be eager + fetchpriority high; everything else can be lazy.
Google can only rank images it has discovered and indexed. The XML image sitemap explicitly tells Google: “here are all the image URLs on my site, here are the pages they live on, here are their alt texts.” Without it, Google has to discover images through page crawling — slower and incomplete for large sites.
Setup in 60 seconds:
https://yourdomain.com/sitemap_index.xml → Submit.Within 7–14 days check Search Console → Coverage → Indexed pages. The image count under “Discovered” should rise to match your library. If it doesn’t, Google can’t read your sitemap — check for crawl errors.
This step is increasingly important and most sites skip it entirely. ImageObject is structured data markup that gives Google (and increasingly ChatGPT, Claude, and Perplexity) machine-readable details about an image: who created it, what license it’s under, what it represents.
Pages with proper ImageObject schema are cited 4× more often in AI-generated answers (per Anthropic’s published guidance on Claude’s image attribution behaviour). For e-commerce, ImageObject is also part of the Product schema that drives Google Shopping rich results.
The minimum useful ImageObject schema, embedded in the page where the image appears:
{
"@context": "https://schema.org",
"@type": "ImageObject",
"contentUrl": "https://yourdomain.com/wp-content/uploads/2026/04/brown-leather-backpack-canvas-strap.webp",
"width": 1200,
"height": 630,
"caption": "Brown leather backpack with canvas straps, men's everyday carry bag",
"creator": {"@type":"Person","name":"YourBrand"},
"copyrightNotice": "© 2026 YourBrand",
"license": "https://yourdomain.com/image-license/"
}
RankMath and ImageSEO both add ImageObject schema automatically when properly configured. For pages where you’ve manually added it, validate at Google’s Rich Results Test before publishing.
| Property | Before (raw upload) | After (full SEO pass) |
|---|---|---|
| Filename | IMG_4827.HEIC | brown-leather-backpack-canvas-strap.webp |
| Format | HEIC (Apple-only) | WebP (universal) |
| Dimensions | 4032×3024px | 1200×900px |
| File size | 4.8 MB | 92 KB |
| Alt text | (empty) | “Brown leather backpack with canvas straps, men’s everyday carry bag” |
| IPTC copyright | (none) | © 2026 YourBrand |
| EXIF GPS | 40.7128, -74.0060 (your home) | Stripped |
| HTML attributes | <img src> only | width, height, loading, fetchpriority all set |
| In sitemap | No | Yes (image XML sitemap) |
| Schema | None | ImageObject + (if e-commerce) Product |
That image now: loads 50× faster, ranks for Google Image searches, displays correctly in social shares, won’t expose your address, and gets cited by AI search. Total time invested per image: 90 seconds once you have a workflow.
The 10 steps above describe how to handle images going forward. For images already uploaded, the math gets harder. A typical 5-year-old WordPress site has 800–3,000 images, most without alt text or proper filenames. Doing this manually is unrealistic.
The retroactive playbook in priority order:
Three places to check measurable impact, ordered from fastest to slowest signals:
| Mistake | What it costs | Step that fixes it |
|---|---|---|
| Camera-original filenames (IMG_xxxx) | Zero filename ranking signal | Step 1 |
| Uploading 4MB+ originals | Poor LCP, ranking penalty | Steps 2–4 |
| JPEGs where WebP would do | ~30% larger files for no benefit | Step 3 |
| No copyright IPTC | No Google Images credit attribution | Step 5 |
| GPS coordinates leaking from phone uploads | Privacy risk + bloat | Step 6 |
| Empty or generic alt text | Invisibility in Google Images | Step 7 |
| Missing width/height attributes | High CLS, poor Core Web Vitals | Step 8 |
| Lazy-loading the hero image | Drastically worsens LCP | Step 8 |
| No image sitemap | Google may never index your images | Step 9 |
| No ImageObject schema | Cited 4× less in AI search answers | Step 10 |
For a single new image: about 90 seconds once you have a workflow set up. For a retroactive pass on an existing 1,000-image library: 30 minutes if you use a plugin like ImageSEO that handles alt text, format conversion, and sitemap updates automatically; 4–6 hours manually if you focus on the top 50–100 pages and let plugins handle the rest.
Steps 1–4 and 7–9 are non-negotiable for every image. Steps 5 and 6 (IPTC and EXIF stripping) matter most for hero images, product images, and original photography you want credited. Step 10 (ImageObject schema) is essential for product pages and AI-search visibility but optional for casual blog images.
WordPress handles a lot automatically once you’ve configured it correctly: lazy-loading (5.5+), WebP support (5.8+), automatic image sitemap (via RankMath or Yoast), explicit width/height (Gutenberg sets these). What WordPress doesn’t do for you: rename files (you must do this before upload), write alt text (you do this in the media library, or use a plugin that auto-generates), or add ImageObject schema (configure in your SEO plugin).
Three changes that move the needle in under an hour: (1) install a compression plugin that bulk-converts everything to WebP, (2) install a tool that bulk-generates alt text on images that are missing it, (3) enable image sitemap in your SEO plugin and resubmit to Search Console. The combined impact on a typical 1,000-image WordPress site: LCP improvement within 2 weeks, image impressions up within 30 days, organic traffic measurable improvement at 60–90 days.
Both. Image signals (alt text, filename, schema) feed into Google’s understanding of the entire page. Pages with well-optimised images consistently score higher for relevance on the underlying topic. Image SEO also affects regular rankings via Core Web Vitals (image performance is a major LCP factor) and engagement signals (relevant images increase dwell time). Google has stated explicitly that alt text is “used to determine the best result for a user’s query” — that includes web results, not just image results.
WebP for most cases — supported in 97%+ of browsers, smaller than JPEG, natively handled by WordPress. AVIF is better compression but with marginally less support — fine if you serve a JPEG or WebP fallback via the <picture> element. SVG for logos, icons, and simple illustrations. Never PNG for photographs. JPEG only as a legacy fallback.