Merchlint
Available now
Next, in this order
  • DeutschDE
  • EspañolES
  • FrançaisFR
  • ItalianoIT
  • PortuguêsPT
  • NederlandsNL
  • SvenskaSV
  • TürkçeTR

A language shows up here once its pages are actually written. Nothing on this site is machine-translated.

Install free
← All checks

The menu points at something unbuyable

A hand-made menu entry outlives the product it points at. It is the most prominent link on the site and the one nobody thinks to check.

Group
Catalogue
Confidence
F — fact from the database
Version
Pro
Updated
Code
B3

The symptom

Somebody once pinned a bestseller directly into the main menu — “Baltic wool throw”, right there next to Home and Contact. Months later the product went out of stock, or was hidden from the catalogue, or was replaced by a newer model under a different ID. The menu entry did not notice.

Menu items in WordPress are their own post type. They store the target as a number and never ask again whether that number still leads anywhere useful.

What it costs

This is the most expensive dead link a store can have, because of where it sits:

  • It is on every page. The header renders on the homepage, on every category, in every product and at checkout. A broken entry there is not one bad link, it is one bad link times your whole catalogue.
  • It is the link people trust most. A visitor reads the main menu as the shop’s own recommendation. Following it to “Out of stock” reads as neglect in a way that the same product found through search does not.
  • It absorbs internal link weight that should be flowing to pages that can convert.

How to check it yourself

Menu entries are posts of type nav_menu_item, and the target ID lives in _menu_item_object_id:

wp db query "SELECT mi.ID AS pozycja, m.meta_value AS cel, p.post_title, p.post_status \
  FROM wp_posts mi \
  JOIN wp_postmeta m ON m.post_id = mi.ID AND m.meta_key = '_menu_item_object_id' \
  LEFT JOIN wp_posts p ON p.ID = m.meta_value \
  WHERE mi.post_type = 'nav_menu_item' \
  AND (p.ID IS NULL OR p.post_status <> 'publish')"

That catches deleted and unpublished targets. For products that exist and are published but cannot be bought, join _stock_status the same way and look for anything other than instock. Replace wp_ with your table prefix.

Custom links in the menu store a URL in _menu_item_url instead, and need checking separately — those are the ones a database query cannot resolve for you.

How to fix it

  1. Point the entry at a category rather than a product wherever the intent was “our best thing”. Categories survive product churn; individual products do not.
  2. If the product is coming back, leave the entry and make the product page say when. A dated promise converts better than a dead end.
  3. If it is gone for good, remove the menu item and redirect the old product URL to its replacement or its category.
  4. Check every menu, not just the primary one. Footer and mobile menus are separate rows and are edited far less often.

When it is a false positive

  • Menus scheduled around a launch, where the entry is deliberately in place before the product is published.
  • Membership or B2B catalogues where the product is hidden from anonymous visitors but visible and buyable once logged in. The database says “not visible”; the customer sees it.
  • Backorder products, if your checkout accepts them.
  • Menu items in an inactive menu that is not assigned to any theme location.

How Merchlint finds it

Merchlint reads every nav_menu_item in every menu, resolves its target, and checks three things about it: that the target still exists, that it is published, and that a customer could buy it today. Entries in menus not assigned to a theme location are reported separately and ranked lower, since nobody can see them.

The finding names the menu, the label as the visitor reads it, and what is wrong with the target — so you can fix it from the finding without hunting through the menu editor.

Confidence: F — fact from the database. The target row exists or it does not.

This check ships in the Pro add-on.

Run this check on your store

Disagrees with what you see in your store? Write to us — we read every message. contact@merchlint.com