WooCommerce product images with placeholder alt text

A product image whose alt text says IMG_4021.jpg, image or 1 passes every empty-field check and still tells shoppers and search engines nothing. CatalogLift finds every product image whose alt text reads like filler and — because this check carries an AI proposal — drafts real alt text from the product's own data for you to approve.

Images & media Medium severity AI proposal

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.

Fair questions, straight answers.

What counts as placeholder alt text?

Anything that fills the field without describing the image: a filename such as IMG_4021.jpg or DSC0042, the words image, photo, picture or product image, a bare number, a URL, lorem ipsum, and generic filler such as placeholder or product title. CatalogLift compares the normalized text, so capitalization, stray whitespace and HTML tags do not hide a match.

Is this different from missing alt text?

Yes. Missing alt text is an empty field. Placeholder alt text is a filled field that says nothing useful — and it is easier to overlook, because plugins and audits that only check for an empty attribute report it as fine.

Does CatalogLift write the alt text itself?

It drafts alt text for you to approve, using the product's own data — its title, attributes and category — never invented detail. You see the current alt text next to the draft as a before/after diff with evidence, and nothing is written to WooCommerce except on your authority. The next scan then confirms the placeholder is gone.

What if one image is used on several products?

The finding says so. Alt text lives on the attachment, not on the product, so CatalogLift shows how many products use the image and lists a sample of them as evidence, so you can judge one alt text against the places it will appear.

See it on your own catalog.

Create a free account, connect your WooCommerce store and this check runs on your real products, along with the rest.

No card required. The free plan never writes to WooCommerce.