Most shop filters are built as JavaScript state. Tick two sizes, narrow a price range, then send the link to a friend and they get the unfiltered shop. Press the back button and you land somewhere unrelated. The filter worked; the page just had no memory of it.
Put the state where the browser already looks
Every filter control is a link that carries the full resulting state in its query string. Selecting a size produces a URL with that size added; selecting it again produces one with it removed. Sort order, price bounds and any active search term are carried along, so changing one filter never silently discards another.
Because the state lives in the address bar, three things come free that are awkward to add later: the back button works, the view can be bookmarked, and a customer can paste the link into a chat and the other person sees exactly what they saw.
It has to work without JavaScript too
Filters built as links function before any script runs. Enhancement can then intercept the click and update the grid in place, but the underlying page remains correct on a slow connection or a locked-down browser — the conditions under which a good share of shoppers actually browse.
A note on what search engines see
Filtered URLs multiply quickly, and most of them are not pages a search engine should hold in its index. Deciding early which parameter combinations deserve to be crawled — and marking the rest accordingly — keeps a useful feature from turning into thousands of near-duplicate URLs.
Key takeaways
- Filter state belongs in the URL; the back button and shareable links follow automatically.
- Each control should carry the complete resulting state, not just its own change.
- Build filters as links first, then enhance — not the other way round.
- Plan crawl rules for filtered URLs before they exist, not after they are indexed.
Related reading: shipping technical SEO as code, and our custom development work.
Running into a similar limitation in your own WooCommerce or WordPress store? Let’s Talk — ArtinTech Solution builds exactly this kind of custom store tooling.