A variation nobody can select
The combination exists, has stock and has a price. The attribute value it needs was renamed or removed, so no dropdown on the page can reach it.
The symptom
The product has twelve variations. The dropdowns offer eleven combinations. The twelfth is published, in stock, correctly priced and completely unreachable — its attribute value is no longer in the list the customer picks from.
This happens quietly, usually during a tidy-up. Someone renames the attribute value Navy to Navy blue on the parent product. WooCommerce stores the variation’s attribute as a slug, and the old slug now matches nothing.
What it costs
The stock is real, the demand is real, and the two cannot meet:
- Held stock that cannot be sold through the only channel that lists it. It counts as available in every report and is unavailable to every customer.
- The parent product may advertise its price. If the orphaned variation is the cheapest, the category shows “From 39 zł” for a combination nobody can choose — which is a promise the store cannot keep, and one of the more effective ways to lose a customer at the product page.
- It survives every visual check. The product page renders perfectly. Nothing is broken on screen; a combination is simply missing, and only somebody who knows the range would notice.
How to check it yourself
Compare what the variation asks for against what the parent offers:
wp db query "SELECT p.post_parent AS produkt, p.ID AS wariant, m.meta_key, m.meta_value \
FROM wp_posts p JOIN wp_postmeta m ON m.post_id = p.ID \
WHERE p.post_type = 'product_variation' AND p.post_status = 'publish' \
AND m.meta_key LIKE 'attribute_%' AND m.meta_value <> ''"
Replace wp_ with your table prefix. Each row is one attribute the variation requires. Then read
the parent’s _product_attributes meta, or its assigned pa_* terms, and check that every value
above still appears there. A variation asking for a value the parent no longer offers is orphaned.
WooCommerce itself will not warn you. An empty attribute_* value means “any”, which is valid, so
the storage layer cannot tell a wildcard from a stale slug.
How to fix it
- Decide whether the combination should exist. Most orphans are leftovers from a value that was deliberately retired, and the right fix is to delete the variation.
- If it should exist, re-select the correct attribute value on the variation itself. Renaming the value back on the parent works too, but only if nothing else has moved on since.
- Regenerate the lookup tables afterwards so the price range on the category page catches up:
wp wc tool run regenerate_product_lookup_tables --user=1
- If an importer maintains this product, fix the mapping there. Attribute slugs are the part of a feed that drifts most often.
When it is a false positive
- Variations deliberately left as drafts while a new colourway is prepared.
- Products where a plugin builds the selection at runtime — configurators and made-to-order builders often bypass the standard dropdowns entirely.
- Deliberately retired combinations kept published so their order history stays intact and reportable, in setups where deleting them would break reporting.
How Merchlint finds it
Merchlint reads every attribute_* meta row on every published variation and resolves it against
the attribute values its parent product actually offers. A variation is reported when at least one
of its non-empty attribute values has no match on the parent — which means no combination of
dropdowns on the page can produce it.
Each finding shows the parent product, the variation, the value it is asking for, and whether that variation holds stock or sets the parent’s advertised minimum price. Those two facts are what decide whether you delete it or repair it.
Confidence: F — fact from the database. The slug matches a value on the parent or it does not.
This check ships in the Pro add-on.
Disagrees with what you see in your store? Write to us — we read every message. contact@merchlint.com