Why placeholder alt text holds products back
Alt text is how an image speaks when it cannot be seen: to a screen reader, to an image search crawler, and to a shopper on a slow connection waiting for the photo. A filename or the word image in that slot is worse than a gap, because it looks filled and so it never gets fixed.
- Image search ignores it. Search engines lean on alt text to understand what a product photo shows; a camera filename or a bare number gives them nothing to rank the image for.
- Screen readers read the junk aloud. A blind shopper hears “I M G underscore four zero two one dot j p g” where the product should be — an accessibility problem that accessibility audits do not catch, because the attribute is present.
- Bulk imports create it at scale. Importers and media plugins often copy the filename or a default label into the alt field for every uploaded image, so one import can leave a whole catalog with alt text that only looks done.
How to find placeholder alt text manually
Attachment alt text lives in postmeta under
_wp_attachment_image_alt. This WP-CLI query lists
featured images of published products whose alt text looks like a
filename, a generic word or a plain number:
wp db query "SELECT p.ID, p.post_title, alt.meta_value AS alt_text
FROM wp_posts p
JOIN wp_postmeta thumb
ON thumb.post_id = p.ID AND thumb.meta_key = '_thumbnail_id'
JOIN wp_postmeta alt
ON alt.post_id = thumb.meta_value
AND alt.meta_key = '_wp_attachment_image_alt'
WHERE p.post_type = 'product' AND p.post_status = 'publish'
AND (
alt.meta_value REGEXP '^(img|dsc|dscn|pxl)[-_ ]?[0-9]+'
OR alt.meta_value REGEXP '\\\\.(jpe?g|png|gif|webp|avif|svg)$'
OR alt.meta_value REGEXP '^[0-9]+$'
OR LOWER(TRIM(alt.meta_value)) IN ('image', 'photo', 'picture', 'product image', 'placeholder')
)
LIMIT 50;"
Adjust the table prefix if yours isn't wp_. Gallery
images are stored as a comma-separated list in
_product_image_gallery, so they need a second query.
This finds the obvious cases and misses the rest. It checks only the
featured image, so gallery images and variation images stay hidden.
The list of filler words is whatever you thought to type, so
Product photo, a URL pasted into the field, or a
Polish zdjęcie slip through. It also does not tell you
whether one attachment sits on many products, so a shared image gets
fixed once and reappears elsewhere. And it answers only for today: next
month's import can put the filenames straight back.
How CatalogLift finds and drafts it
Every scan reads the alt text of each synced image that is actually in use on a current product or variation, as a featured image, in the gallery or on a variation. It normalizes the text — strips HTML, collapses whitespace, lowercases — and then asks the same question several ways: does it match a known filler phrase such as placeholder, product title or lorem ipsum, is it a generic word such as image, photo or product photo in English or Polish, is it a URL, is it only digits, or does it look like a camera filename or end in an image extension. Empty alt text is a separate finding; this one raises at medium severity for text that is present but says nothing.
Each finding names the product, the image and its current alt text as evidence, together with the reason it was flagged, how many products or variations use the same attachment, and a sample of those usages when the image is shared widely. Because writing the fix is the real work, this check carries an AI proposal: CatalogLift drafts alt text from the product's own title, attributes and category — never from thin air — and shows it as a before/after diff with evidence and confidence. You approve, edit, or type your own; only what was decided is written to WooCommerce, and the next scan verifies the placeholder is gone. Because CatalogLift keeps watching, an import that reintroduces filenames becomes a fresh finding rather than a silent regression.