This is a practical guide to multilingual SEO for WordPress sites. It covers what hreflang is and why it matters, how to choose a URL structure, how to set up sitemaps correctly, how to handle translated meta, and the mistakes that most commonly break international search rankings.
It’s written for site owners, developers, and SEO consultants who need to get multilingual SEO right on a WordPress installation. No fluff. No “here’s what SEO is.” Just the decisions you need to make and the details that matter.
Monolingual SEO is about ranking one page for the right keywords in one country. Multilingual SEO is about ranking multiple versions of the same page for the right keywords in the right countries — and making sure Google doesn’t serve the wrong language to the wrong visitor.
The unique problems multilingual sites face:
Multilingual SEO has good answers to all of these. Most of them involve hreflang.
Hreflang is an HTML attribute (and an XML sitemap annotation) that tells Google which URL on your site is the correct version for a given language and optional country. It looks like this in the <head> of your page:
<link rel="alternate" hreflang="en" href="https://example.com/blog-post/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/blog-post/" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/blog-post/" />
<link rel="alternate" hreflang="es-es" href="https://example.com/es/blog-post/" />
<link rel="alternate" hreflang="es-mx" href="https://example.com/es-mx/blog-post/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/blog-post/" />
Each tag says “this URL is the version of this page for this language (and optionally country).”
Without hreflang, Google guesses. And Google’s guesses are often wrong. A French visitor in Paris searches for something and gets your English page because Google couldn’t tell there was a French version. A Mexican visitor searches and gets your Spain-targeted Spanish page because Google couldn’t tell them apart.
Hreflang is how you tell Google: “here’s every language version of this page, and here’s which one matches which audience.” Google respects it.
Every language version of a page must link to every other language version, including itself. If you have English, French, and German, each version needs all three hreflang tags. If a page is missing from its counterparts’ hreflang sets, Google ignores the orphan.
This is one of the most common multilingual SEO mistakes — hand-maintained hreflang sets drift out of sync, and entire language versions go unindexed for no apparent reason.
The x-default tag tells Google which version to serve when none of the other language/country combinations match. This is usually your English or source-language version, serving as the fallback for anyone who doesn’t match a specific target.
If you’re using Lang Forge, hreflang is generated automatically — every translated post gets a complete, reciprocal set of tags in its HTML head, plus a dedicated multilingual XML sitemap at /sitemap-hreflang.xml, plus integration with Yoast, Rank Math, AIOSEO, and other SEO plugin sitemaps. No manual maintenance.
If you’re not using a multilingual plugin, you can add hreflang by hand through theme code or via a plain sitemap. It works but it’s painful to maintain as you add languages or translate new posts.
You have four options for how to structure URLs on a multilingual WordPress site. Each has tradeoffs.
example.com/en/blog-post/
example.com/de/blog-post/
example.com/fr/blog-post/
Pros: Single domain, shared domain authority, simple setup, works with any hosting.
Cons: No strong per-country signal (but hreflang fills that role).
This is what most multilingual WordPress sites should use. Simple, SEO-clean, and maintainable.
example.com/blog-post/?lang=de
Pros: No rewrite rules needed, works on any WordPress install.
Cons: Uglier URLs, sometimes tricky for caching, perceived as less SEO-friendly (though Google handles them fine with hreflang).
Use this only when directory URLs aren’t practical.
de.example.com/blog-post/
fr.example.com/blog-post/
Pros: Cleaner per-language server configuration, easier CDN splitting.
Cons: Slightly weaker domain authority sharing (subdomains inherit some but not all of the main domain’s authority), requires DNS setup.
Use this when you need per-language server or CDN behavior.
example.com/blog-post/
example.de/blog-post/
example.fr/blog-post/
Pros: Strongest per-country signal (TLDs are a ranking factor for local results).
Cons: No shared domain authority across domains, expensive to maintain, complex to set up.
Use this for large international operations where brand presence per country matters and budget allows.
An XML sitemap tells Google what URLs exist on your site and when they were last updated. For a multilingual site, your sitemap also needs to carry hreflang data.
Each URL entry in the sitemap should include an <xhtml:link> annotation for every language version:
<url>
<loc>https://example.com/en/blog-post/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/blog-post/"/>
<xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/blog-post/"/>
<xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/blog-post/"/>
<lastmod>2026-04-11</lastmod>
</url>
Submit this to Google Search Console → Sitemaps. Google will use it for discovery and international targeting.
Lang Forge generates this exact structure automatically at /sitemap-hreflang.xml. It also injects hreflang into the native WordPress sitemap and into any SEO plugin’s sitemap you’re using.
Your SEO title and meta description exist for the English version of a page. When you translate the page, both need to be translated too — and specifically, they need to be SEO-optimized in the target language, not literally translated.
A literal translation of “10 Best WordPress Plugins for SEO” into German is technically correct but misses the keywords German searchers actually use. Your translator (or your AI translator) needs to understand local search intent.
<title> tag)name, description, inLanguage)Lang Forge copies all 15 Yoast meta keys (plus equivalents for Rank Math, AIOSEO, SEOPress, and TSF) onto the translated post automatically. You then translate them in the visual editor or with AI, with hard character limits respected.
You translate your site. You forget hreflang. Your translated pages don’t rank in their target countries because Google doesn’t know they exist as separate language versions.
Fix: Use a multilingual plugin that generates hreflang automatically. If you’re hand-coding, use a generator and test every page with a tool like Sitebulb or Screaming Frog.
<html lang="en"> on every pageYour theme hardcodes <html lang="en"> in header.php. Every translated page still identifies as English to search engines and screen readers.
Fix: The lang attribute on the <html> element must match the page’s content language. WordPress provides language_attributes() for this. Make sure your theme uses it instead of hardcoding.
A Google Translate widget translates content on the fly in the visitor’s browser. No indexable URLs, no hreflang, no SEO value. It’s visitor convenience, not a multilingual site.
Fix: Use a real multilingual plugin that creates indexable pages. Every translation is a real post with its own URL.
You serve the same URL with different languages based on a cookie or the Accept-Language header. Visitors see the right language, but Google only indexes one.
Fix: Each language needs its own URL.
You translate “Products” into “Products” (same word in French) and your French URL is /produits/products/ because the path wasn’t translated too. Slug collisions cause 404s or redirects in unexpected places.
Fix: Translate slugs along with titles. Most multilingual plugins handle this automatically.
The translated page has translated content but the meta description is still in English. Your search snippet is mixed-language and users bounce.
Fix: Translate meta titles and descriptions for every translated post. Lang Forge copies them automatically; you still need to translate them.
Your translated posts exist but nothing on the site links to them except the language switcher. Google treats them as orphan pages with low authority.
Fix: Add a language switcher to every relevant page, translate your internal linking (a link to “Read more” in English should point to the English version; a link in the German version should point to the German version), and make sure your navigation is localized.
<html lang> set correctly on each language versionLang Forge is built so that every item on that checklist is handled automatically or with one setting. Hreflang tags are generated on every translated page. The multilingual sitemap is generated at /sitemap-hreflang.xml. SEO plugin meta fields are copied onto translations and available for translation in the visual editor. The language switcher is a widget, shortcode, or menu item. WooCommerce URLs, emails, and currency formatting are translated per language. ACF and Elementor content is translatable at the field and widget level.
You still make the content decisions — you still have to translate your copy well, pick the right keywords for each market, and write meta descriptions that convert. Lang Forge handles the mechanical parts so you can focus on the editorial ones.
Get Lang Forge — from $54/year →
Hreflang, sitemaps, translated meta, and real indexable URLs — all automatic.
We use analytics and marketing cookies (Google Analytics, Google Ads, Meta) to understand traffic and improve the site. Strictly-necessary cookies are always on. See our Privacy Policy.