A category with nothing to buy in it
The menu offers it and search ranks it, but everything inside is gone or out of stock. The visitor arrives at a dead end wearing your branding.
The symptom
The category is in the menu, in the sidebar filter and in the sitemap. The visitor clicks it and gets “No products were found matching your selection.” — or, more often, a page full of products that all say Out of stock.
Both versions look the same from the admin, where the category still reports a product count. WooCommerce counts products assigned to the term; it does not count the ones a customer can buy.
What it costs
An empty category is a dead end you paid to send people to:
- It is usually the deepest a visitor will ever go. Menu, category, nothing. There is no next click on that page, so the session ends there.
- It ranks, and it keeps ranking. Category pages accumulate links and history, so an empty one can outrank the products that would have answered the query.
- It advertises abandonment. Three empty categories tell a first-time visitor more about whether this store is still trading than any trust badge does.
The all-out-of-stock version is the more expensive of the two, because the visitor scrolls the whole page before finding out.
How to check it yourself
Terms with no published products at all:
wp db query "SELECT t.name, tt.count FROM wp_terms t \
JOIN wp_term_taxonomy tt ON tt.term_id = t.term_id \
WHERE tt.taxonomy = 'product_cat' AND tt.count = 0"
The stock version needs the product side too — every published product in the term whose
_stock_status is not instock:
wp db query "SELECT t.name, COUNT(*) AS niedostepne FROM wp_terms t \
JOIN wp_term_taxonomy tt ON tt.term_id = t.term_id \
JOIN wp_term_relationships tr ON tr.term_taxonomy_id = tt.term_taxonomy_id \
JOIN wp_posts p ON p.ID = tr.object_id AND p.post_status = 'publish' \
JOIN wp_postmeta m ON m.post_id = p.ID AND m.meta_key = '_stock_status' \
WHERE tt.taxonomy = 'product_cat' AND m.meta_value <> 'instock' GROUP BY t.term_id"
Compare the count against tt.count for the same term: equal means nothing in it can be bought.
Replace wp_ with your table prefix.
How to fix it
- Decide whether the category should exist right now. If the range is discontinued, remove it from the menu and let the term itself redirect or 404 deliberately.
- If it is temporary, keep the category but say so on it. A category description explaining that the new season lands in March is worth more than an empty grid.
- If it is a structure problem — products that belong there were assigned somewhere else — fix the assignment rather than the category.
- Check your menu separately. Removing a term does not remove the menu entry pointing at it.
When it is a false positive
- Categories used only for structure, never linked, existing to group child categories. Those are legitimately empty at their own level.
- Backorder stores where out of stock still means buyable. If
_stock_statusisonbackorderand your checkout accepts it, the category is fine. - Seasonal categories kept live on purpose between seasons, with an explanation on the page.
- Categories excluded from the menu and from search, used only as an internal tag.
How Merchlint finds it
Merchlint walks every product_cat term, counts the published products assigned to it, and then
counts how many of those a customer could actually add to a cart — in stock, priced, and visible in
the catalogue. It reports two cases separately: nothing in the category at all, and nothing in it
that can be bought.
Each finding names the term, its product count, and whether the category is currently reachable from a menu — because an unreachable empty category is tidying, and a linked one is a leak.
Confidence: F — fact from the database. Terms, relationships and stock status are all rows.
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