Articles · 2026-11-08
hreflang and canonical on a multilingual OpenCart store
Your store has two or three languages, but Google shows English pages to local users and Search Console complains about duplicates. The cause is almost always three tags: hreflang, lang and canonical. I’ve fixed this on several ocStore and OpenCart stores, and the mistakes repeat.
What each tag does
- lang on the html tag tells browsers and search engines what language the page is in;
- hreflang lists every language version of the same page so Google shows each user their own language;
- canonical names the main URL of the page so copies with parameters aren’t treated as duplicates.
Common mistakes
- the canonical of the English page points to the other language. Google treats the English version as a duplicate and doesn’t index it;
- hreflang points to the language home pages instead of the matching product or category;
- no self-reference in hreflang, or no return link from the other language, so Google ignores the pair;
- lang=”en” on every version because the theme hard-codes the language;
- wrong language codes: ua instead of uk for Ukrainian, for example;
- canonical with parameters for sorting, filters or pagination, so hundreds of variants of one category end up in the index.
SEO URLs after a mass change
A separate problem is changing SEO URLs in bulk, for example from transliteration to English words. Without 301 redirects from the old URLs, Google sees hundreds of 404s and rankings drop. And if two languages end up with the same keyword for different pages, SEO URL modules start to conflict and pages open in the wrong language.
How to check your store
- open the source of a product page (Ctrl+U) and find link rel=”alternate” hreflang and rel=”canonical”: the URLs must point to the same product in the matching language;
- check the same on the other language version: the links must be mutual;
- in Search Console, open the Pages report: “Duplicate, Google chose different canonical than user” often points to exactly this;
- use URL Inspection on an English page and see which canonical Google picked.
The fix
Usually it’s changes in the theme header template and the controller that builds URLs, plus a 301 redirect map for old addresses. After the fix Google rebuilds the index within a few weeks. For OpenCart 3 there’s also my SEO module with hreflang, canonical and structured data. If you’d like me to check your store, it’s a typical website support task; for speed see 7 reasons OpenCart is slow.
FAQ
Do I need x-default?
It’s recommended: it tells Google which version to show users whose language matches none of yours. Usually that’s the store’s main language.
Can a plugin solve this?
Sometimes, but on ocStore and OpenCart SEO modules are often the cause of the conflicts themselves. First look at what your template actually outputs.
Rather not dig into it yourself?
Tell me what is happening with your site, and I’ll reply with the cause and a fix estimate within a day.
Service: Website support & maintenance →
More articles
Nov 10, 2026
Moving a site to another CMS without losing rankings
Moving to another CMS (WordPress, WooCommerce, OpenCart, custom PHP): what to migrate, how to set up 301 redirects and what to check after launch.
Nov 10, 2026
OpenCart vs WooCommerce: which to choose
OpenCart vs WooCommerce compared: speed on a large catalog, extensions, payments and shipping, blogging and SEO, maintenance cost. When each one fits better.
Nov 10, 2026
Abandoned carts in OpenCart: simplify checkout
Customers add to cart but don't order? What gets in the way of OpenCart checkout, which fields to remove and how to win back those who left.