SEO
Multilingual SEO handled automatically so search engines index the right language for every visitor.
<!-- Auto-emitted on every translated page -->
<link rel="alternate" hreflang="en-US" href="https://acme-bakery.com/"/>
<link rel="alternate" hreflang="en-GB" href="https://acme-bakery.com/en-gb/"/>
<link rel="alternate" hreflang="de" href="https://acme-bakery.com/de/"/>
<link rel="alternate" hreflang="x-default" href="https://acme-bakery.com/"/>Automatic Hreflang Tags
PerfLocale tells search engines about every translated version of each page. Choose page source, HTTP headers, or both for maximum coverage.
Sitemap Integration
The built-in WordPress sitemap is extended to include links to every translation. Search engines discover all your translated content automatically.
- 1First request builds the clusterHreflang tags, JSON-LD entities, Content-Language headers — computed once and stored in the WP object cache.
- 2Every later request hits the cacheNo DB lookups, no recomputation — tags are pulled directly from Redis / Memcached / transients.
- 3Translation edits auto-invalidatePerfLocale watches your translations — the next page load rebuilds fresh tags. No stale tags ever served.
Cached for Performance
SEO tags (hreflang, sitemap alternates, Content-Language headers, schema enrichment) are built once per page context and cached for 6 hours, so subsequent requests skip the rebuild and just emit the cached HTML. Cache clears itself when translations change.
- ActiveYoast SEOHandler matched · intercepting
wpseo_hreflang - DormantRank MathHandler available
- DormantSEOPressHandler available
- DormantAIOSEOHandler available
- DormantSlim SEOHandler available
- DormantThe SEO FrameworkHandler available
Smart Plugin Detection
If you use Yoast, Rank Math, SEOPress, AIOSEO, Slim SEO, or The SEO Framework, PerfLocale automatically disables their hreflang output to prevent duplicate or conflicting tags.
// Auto-augmented when the enrichment setting is on
{
"@type": "WebPage",
"@id": "https://acme-bakery.com/about/#webpage",
"inLanguage": "en-US",
"workTranslation": [
{
"@type": "WebPage",
"@id": "https://acme-bakery.com/de/ueber-uns/#webpage",
"inLanguage": "de"
},
{
"@type": "WebPage",
"@id": "https://acme-bakery.com/en-gb/about/#webpage",
"inLanguage": "en-GB"
}
]
}JSON-LD Schema Enrichment
PerfLocale augments the structured-data output of Yoast, AIOSEO, Rank Math, SEOPress, Slim SEO, and The SEO Framework. Every WebPage/Article/Product entity in the schema graph gets the correct inLanguage value, and translated siblings are cross-linked via workTranslation. On by default; zero runtime cost. Read the JSON-LD schema enrichment docs.
Modern SEO & UX
Five opt-in features that address gaps specifically affecting multilingual sites - each solves a problem that a generic SEO plugin can't, because only a translation-aware plugin knows the sibling graph and the fallback state.
/de/uber-uns/ edited- 🇺🇸
/about/en-US - 🇬🇧
/en-gb/about/en-GB - 🇩🇪
/de/uber-uns/edited - 🇫🇷
/fr/a-propos/fr
blocking=false · publish workflow not delayed- Bing
- Yandex
IndexNow Push-Indexing with Sibling Coordination
When you publish or edit a translation, PerfLocale pings Bing, Yandex, and (via the Cloudflare relay) Google to re-crawl within hours instead of days. Unlike generic SEO-plugin IndexNow (Rank Math, Yoast) which only pushes the edited URL, PerfLocale also pushes the sibling translations whose hreflang alternates just changed - only a translation-aware plugin knows the sibling graph. The 32-character verification key is auto-generated on enable and served natively at {host}/{key}.txt with constant-time comparison. Fires with blocking=false so your publish workflow isn't delayed. Works alongside any existing IndexNow integration.
HTTP/1.1 200 OK
Date: Tue, 30 Apr 2026 09:00:00 GMT
Server: nginx
Content-Type: text/html; charset=utf-8
Cache-Control: public, max-age=3600
Vary: Accept-Encoding, Accept-Language
Content-Language: de-DE+ PerfLocale<html lang> · Google, Yandex, and most CDN/proxy layers use it as a ranking hintContent-Language HTTP Header
The W3C-standard Content-Language response header tells search engines and proxies the page's language in BCP-47 format (de-DE, fr-CA, etc.) on top of <html lang>. Google, Yandex, and most CDN/proxy layers use it as a ranking signal. No downside - on by default.
<article data-nosnippet>
<!-- DE missing — English shown as fallback -->
<p>Welcome to our bakery — we bake…</p>
</article>data-nosnippet) —Fallback-Content Snippet Guard
When a translation is missing and you show the default language as fallback, Google indexes the English text under the /de/ URL - and happily serves English snippets in German SERPs, confusing visitors. PerfLocale wraps the fallback block with data-nosnippet so Google still indexes the page but omits the mismatched text from snippets. On by default; only triggers when fallback is actually active. No other multilingual plugin does this.
- 1Hover or focusVisitor lands on the 🇩🇪
Deutschlink in the switcher. - 2Background prerenderChromium fetches and renders
/de/uber-uns/off-screen via Speculation Rules. - 3Click → instant swapPage is already there — visible the moment they click.
Instant Language Switching
When a visitor hovers or focuses a language-switcher link, Chromium prerenders the target translation in the background. Language switch becomes effectively instant - the page is already loaded by the time they click. On WordPress 6.8+, PerfLocale integrates with Core's native Speculation Rules API via the wp_load_speculation_rules action - our rule lands inside Core's single speculation-rules script, automatically inherits any /cart/*//checkout/* exclusions other plugins register, and respects the global opt-out filter. On older WP it falls back to emitting a standalone script with the same behavior. Moderate eagerness triggers only on hover/focus, so there's no bandwidth cost for visitors who never switch.
prefers-reduced-motion — users who opt out get instant navigation. WCAG 2.1 SC 2.3.3 compliant.Smooth Switch Animation
Using the View Transitions API (Chrome 126+, Safari 18.2+), switching between languages crossfades smoothly between the old and new page - no white flash. Browsers without support just navigate normally; zero breakage. Progressive enhancement you can turn on in seconds.
Accessibility: the default CSS respects prefers-reduced-motion - users with the OS-level reduced-motion preference see instant navigation without the 240ms crossfade. WCAG 2.1 SC 2.3.3 compliant out of the box. See the Accessibility page for details.