Synonyms in WooCommerce search: 495 searches returning zero because they were spelled differently
"blue lock" finds 22 products; "bluelock", zero. Measured today on a real store: six words customers write differently from the catalogue added up to 495 searches in 68 days, and the store had zero synonyms configured. How to find yours and fix them today.
Three weeks ago I wrote about typos: someone types "figrua" and WooCommerce search returns zero. At the end I flagged a second problem, the vocabulary one. Today I measured it.
This is what the native search on a real WooCommerce collectibles store, with 1,483 active products, returned today, 15 September 2026. The store is Spanish, so some words are Spanish:
| What the customer types | Results | What the catalogue says | Products |
|---|---|---|---|
bluelock |
0 | blue lock | 22 |
haikyuu |
0 | haikyu | 32 |
peluches (plushes) |
0 | peluche | 28 |
yugioh |
0 | yu-gi-oh | 10 |
kitagawa |
0 | marin | 7 |
tokio |
0 | tokyo | 4 |
Not one of the six is a typo. "Bluelock" is how plenty of people write it, joined up. "Haikyuu" is a common romanisation of the Japanese; "Haikyu!!" is the commercial title. "Tokio" is the Spanish spelling. Kitagawa is the character's surname, and the product page only has her first name. And "peluches" is… the plural.
The customer didn't get anything wrong. Your catalogue and your customer speak differently, and the search box doesn't translate.
Why even the plural fails
In the typos article we saw that WordPress searches with LIKE '%word%': the word has to be there as-is, as a piece of the title or description. That has an odd, very unintuitive effect:
peluch→ finds "peluche", because it's a piece of it.peluches→ zero, because "peluches" isn't written on any product.
Typing too little works; typing too much doesn't. A plural is one letter too many. The same goes for "haikyuu" against "haikyu!!" and for any word the customer writes longer than your product page. And "bluelock" against "blue lock" is worse: the space splits the word in two and there's no piece left to match.
In English the plural trap is the same: "mugs" won't find a product that only ever says "mug".
How much it weighs
These are the numbers from that same store, 10 July to 15 September 2026 — 68 days and 68,335 searches:
| Word | Searches | Distinct visitors |
|---|---|---|
kitagawa |
177 | 105 |
haikyuu |
162 | 97 |
peluches |
47 | 35 |
bluelock |
42 | 18 |
yugioh |
36 | 23 |
tokio |
31 | 18 |
| Total | 495 |
495 searches in 68 days that native search would have sent to an empty page, with the product in stock.
That's six words. I haven't counted every one on the store, only the ones I could check one by one today against the live site and the catalogue. It's a floor.
And the figure that struck me most: the store had zero synonyms configured. Not because it didn't care, but because nobody knew the problem existed. Those searches leave no trace in WooCommerce.
(That store runs WildRock, so in practice those 495 searches did find products: semantic and fuzzy search covered the gap without anyone writing a synonym. But what you just saw is what the same site returns with the stock search, which is what almost everyone has.)
The four kinds of synonym to look for
When you go through your list, nearly everything lands in one of these four boxes. Knowing which helps you find the rest:
- Joined or split, hyphen or no hyphen: bluelock / blue lock, yugioh / yu-gi-oh, spiderman / spider-man, t shirt / t-shirt.
- Plural and singular: mugs / mug, figures / figure. In Spanish it's the most frequent one and the one fewest people suspect.
- Another way of saying it: tokio / tokyo, hoodie / sweatshirt, sneakers / trainers, cell phone / smartphone. This is where the names you use on the product page and the customer's own words part ways.
- The customer's name for something you call something else: a character's surname, the show's name instead of the licence's, "the one from TV" instead of the model.
How to find yours
You need the search log from the typos article (the twenty-line mu-plugin that records every search and how many results it gave). If you don't have it, it's here, and in a week you'll have data.
With that, this query pulls out the words that get searched most and never return anything:
SELECT term, COUNT(*) AS times
FROM wp_searches
WHERE results = 0
GROUP BY term
HAVING times >= 3
ORDER BY times DESC
LIMIT 100;
And here's the trick for telling synonyms apart from typos and from products you don't carry: for each word on the list, search your store for a shorter version. Drop the final "s", drop a doubled letter, split it in two, add a hyphen. If any version returns products, it's a synonym and goes on your list. If none does, it's either a typo (the other article) or something you don't sell (which is also information: people are asking for it).
With WP-CLI, the plural check is automatic:
wp db query "SELECT term FROM wp_searches WHERE results=0 AND term LIKE '%s' GROUP BY term ORDER BY COUNT(*) DESC LIMIT 30" --skip-column-names \
| while read t; do
n=$(wp post list --post_type=product --post_status=publish --s="${t%s}" --format=count)
[ "$n" -gt 0 ] && echo "$t -> ${t%s} ($n products)"
done
What prints is your list of broken plurals, with how many products each one recovers.
How to fix it today, for free
Another file in wp-content/mu-plugins/, for instance search-synonyms.php:
<?php
/**
* Plugin Name: Search synonyms
* Description: Translates what the customer types into what the catalogue calls it.
*/
add_action('pre_get_posts', function ($query) {
if (is_admin() || !$query->is_search() || !$query->is_main_query()) {
return;
}
// What the customer types => how it appears on your products.
// Phrases before single words: they're applied in this order.
$synonyms = [
'bluelock' => 'blue lock',
'yugioh' => 'yu-gi-oh',
'spiderman' => 'spider-man',
'haikyuu' => 'haikyu',
'tokio' => 'tokyo',
'kitagawa' => 'marin',
'mugs' => 'mug',
'hoodie' => 'sweatshirt',
];
$original = mb_strtolower(trim($query->get('s')));
$search = $original;
foreach ($synonyms as $customer => $catalogue) {
// \b stops 'tokio' from changing inside another word.
$search = preg_replace('/\b' . preg_quote($customer, '/') . '\b/u', $catalogue, $search);
}
if ($search !== $original) {
$query->set('s', $search);
}
});
Two important things:
- It's one-way, on purpose. You translate from how the customer says it to how your catalogue says it, never the other way round. Native search can't do "look for this OR that" without rewriting the SQL, so the sensible move is to always steer the search towards the word that is actually on your product pages.
- If you're the one who's off, fix the product page. If your customers write "Tokio" and you write "Tokyo", the synonym patches it, but adding "Tokio" to the product description fixes it for Google and ChatGPT too, which read your product pages and not your
mu-plugin.
Paste in your ten or twenty worst and you've recovered most of it. Ten minutes.
Where it stops working
A hand-written list has a clear ceiling: it only fixes what you already know. Every new product brings a new name, and people will write it joined, split, plural and in their own language before you have time to note it down. One-way replacement also loses nuance: "mugs" becomes "mug", but "travel mugs set" now depends on your list being in the right order.
Past a certain size, what works is not depending on the list:
- Normalising before searching: stripping accents, hyphens, plurals. Solves boxes 1 and 2 without writing anything.
- Semantic search, which compares meanings instead of letters. That's what solves boxes 3 and 4: "tokio" and "tokyo", "hoodie" and "sweatshirt", the surname and the character.
- And a synonym list on top, for the few things only your store knows.
That's what a dedicated search engine does: all three at once, fused. And it's why, on that store, those 495 searches found products without anyone writing a synonym.
In order, what I'd do this week:
- The thirty-second test. Search your store for the plural of a product you sell. If it returns zero, you know you have the problem.
- Set up the search log if you don't have it yet. Without it, all of this is a hunch.
- After seven days, pull the zero-result list and run the shorter-version test on it.
- Paste the worst ten into the synonyms
mu-plugin. And if any is your product page's fault, fix the page. - If new ones show up every week, that's the signal it's time for a search engine that does it on its own.
If you're at that last point, there's the guide on how to choose an ecommerce search engine, with each option's prices verified and when each competitor is better than us.
Is your store losing sales to searches that find nothing?
WildRock adds a search to your WooCommerce that understands what shoppers mean, and tells you in euros how much it generates. Free plugin, no code.
Keep reading
Why Google Analytics doesn't tell you what happens in your store
Measured today on a real WooCommerce store: 47,956 searches in a month, and not one of them changed the URL, which is the only thing Google Analytics looks at to detect a search. Nor would it know which ones returned zero results: its event doesn't carry that. Here is what GA misses in a store, and how to log it yourself today with a 30-line mu-plugin.
Abandoned carts in WooCommerce: what actually gets recovered
Measured on a real WooCommerce store: the median time from search to order is 7.5 minutes, and 90% of orders land within the first hour. The abandoned-cart email arrives after the decision is made. Here is where the money is really lost, and how to read the carts already sitting in your database today.
