“Out of stock and unavailable” but the stock is there
A variable product says “This product is currently out of stock and unavailable” while every variation shows a quantity. WooCommerce is not lying about stock; it dropped every variation from the form for one of four reasons, and the message is what an empty form looks like.

What the message actually means
This product is currently out of stock and unavailable.
That line lives in one place: the variable product template, and it is printed when the list of available variations comes back empty. It has nothing to do with the stock quantity on the parent product. WooCommerce builds that list by walking every variation and throwing out the ones it will not sell, and if nothing survives, the whole form is replaced by this sentence — even when the parent says 40 in stock, even when the variations say 10 each.
So the question is never “why does WooCommerce think I have no stock?” It is “which check is dropping every variation?” There are exactly four, and one cache that can make a fixed product keep failing.
1. A variation with no price is invisible
A variation is only visible if it is published and its price is not empty. Not zero — empty. A variation created by an import, a REST call or a bulk-edit that never wrote a regular price is silently excluded from the form. If every variation is in that state, you get the message. This is the commonest cause on shops that generate variations programmatically, and it is the one people look for last because the stock column looks fine.
Check: open the product, expand each variation, and look at the Regular price field. A blank field is the fault. The parent’s price is not inherited by variations; each one needs its own.
2. The Enabled box is unticked
Each variation has an Enabled checkbox at the top of its panel. Unticking it sets the variation’s post status to private, and a private variation is excluded from the form exactly like a priceless one. Imports and migration plugins sometimes create variations disabled by default; a staff member cleaning up an old size may untick it and forget. Re-tick, save, and the product comes back.
3. Stock really is zero — at the level that counts
Stock on a variable product is decided in one of three places, and only one of them is used for any given variation. If the variation has Manage stock ticked, its own quantity decides. If it does not, and the parent has Manage stock ticked, the parent’s quantity decides for every variation that defers to it. If neither manages stock, the variation’s Stock status dropdown decides, and that dropdown is what an import sets when it writes “outofstock” into a column you did not look at.
The trap is a parent showing a healthy number while each variation manages its own stock at zero. The parent quantity is not used by anything in that setup; it is just a field. Conversely, a parent at zero with Manage stock ticked will take down every variation that does not manage itself, whatever their own fields say.
On its own, an out-of-stock variation does not trigger the message — it is shown greyed out. It triggers the message when combined with the next setting.
4. “Hide out of stock items from the catalog” hides them from the form too
WooCommerce → Settings → Products → Inventory has a checkbox called “Hide out of stock items from the catalog”. Its name suggests it affects shop listings. It also removes out-of-stock variations from the product form, so a product whose variations are all at zero stops showing greyed-out options and shows the message instead. Turn the setting on, and every fully-sold variable product on the site changes from “sold out, pick a size” to “unavailable” at once, which is usually the day this question gets asked.
If you want sold-out sizes visible, untick the setting. If you want them hidden, the message is the expected result and the actual problem is cause 3.
Fixed it, still says unavailable: the transient
The list of a product’s variations is cached in a transient named wc_product_children_ followed by the product ID, and the parent’s own stock status is derived from its children and stored on the parent. Both are refreshed when the product is saved through the admin. They are not always refreshed when a variation is changed through the REST API, WP-CLI, a direct database update or an import that skips the WooCommerce data store, so the product keeps reporting the state it had before your fix.
- Open the parent product and click Update, without changing anything. That re-syncs the parent’s stock status from its variations.
- WooCommerce → Status → Tools → “Clear transients”. This drops the cached children list for every product.
- If the site uses Redis or Memcached as a persistent object cache, flush it too; transients live there rather than in the database.
- If a page cache or CDN is in front of the shop, purge the product URL. The HTML you are looking at may be older than any of the above.
Checking all four in one query
When there are two hundred variations, expanding each panel is not a plan. This shows, per variation, the three things the form checks: whether it is published, whether it has a price, and what its stock status is. Replace 123 with the parent product ID and the table prefix with your own.
SELECT p.ID,
p.post_status,
price.meta_value AS price,
stock.meta_value AS stock_status,
qty.meta_value AS stock_qty
FROM wp_posts p
LEFT JOIN wp_postmeta price ON price.post_id = p.ID AND price.meta_key = '_price'
LEFT JOIN wp_postmeta stock ON stock.post_id = p.ID AND stock.meta_key = '_stock_status'
LEFT JOIN wp_postmeta qty ON qty.post_id = p.ID AND qty.meta_key = '_stock'
WHERE p.post_parent = 123
AND p.post_type = 'product_variation';A row with post_status other than publish is cause 2. A row with price NULL or empty is cause 1. Every row at outofstock with the hide setting on is cause 4. If all rows look right and the page still says unavailable, it is the cache.
The checklist
- Every variation has a Regular price. Blank is not zero.
- Every variation you expect to sell has Enabled ticked.
- You know which level manages stock for each variation, and that level has quantity.
- “Hide out of stock items from the catalog” is set the way you actually want.
- You clicked Update on the parent and cleared transients after fixing anything outside the admin.
- You purged the page cache before deciding it is still broken.
The quieter version of the same problem
Most of the time nobody sees this message because every variation ran out at once. They see it because the only size anyone buys ran out weeks ago, the other sizes sat there looking like stock, and the last of those finally went. The parent product looked healthy the whole time. Stock is not a number on the product; it is a number per variation, and the one that matters is the one that sells.
