A Cyprus retailer of motorcycle and scooter parts asked us for a storefront where a customer can start from their bike and end at the right part, without reading a single part number.
The challenge
Parts retail lives or dies on fitment. The catalogue has to model vehicle type, make, model and part group, and the shopper has to be able to walk that tree in the order they think in: mini four-stroke, then Honda, then Chaly, then brakes. WooCommerce will hold four levels of product category, but two things break as soon as you use them. Nested category URLs repeat every ancestor, because WordPress refuses duplicate term slugs and the path is concatenated anyway. And a naive finder offers combinations that dead-end on an empty results page, which is worse than having no finder at all.
What we built
A WooCommerce storefront on a containerised WordPress stack, split into a theme and two plugins: one owning the category tree, its seeding and its command-line tools, the other owning the finder, its REST endpoint and its caching.
The finder is a cascading vehicle type, make and model selector, rendered full width under the hero and as a compact sticky bar on category and product pages, where it pre-fills from the category being viewed. It works with JavaScript switched off: the strip is a GET form whose button navigates to the deepest selected term, and that page renders the next level down. The script only removes the extra click. Options are drawn from terms that actually contain published products, so a path that dead-ends is never offered.
We made category URLs flat rather than nested to stop the repeated-ancestor problem, and kept breadcrumbs reading term parents so the full hierarchy still shows. Adding a bike is one command that creates the make, the model and all 23 part groups beneath it. Provisioning is idempotent and reports what it skipped, and a smoke-test suite covers the finder's queries.
The outcome
The shop can be run by someone who does not know WordPress: a new model is one command, and the finder updates itself from what is in stock. Nothing depends on JavaScript, so the fitment path is indexable and survives a bad connection in a workshop. The catalogue currently holds generated demonstration data, pending the retailer's own stock and photography.

