Technical SEO and Core Web Vitals for Persian websites

Persian WordPress sites suffer from predictable Core Web Vitals problems — oversized Vazirmatn fonts, unoptimized hero images, and RTL layout bugs. Here is the fix list I actually ship.

۳۰ شهریور ۱۴۰۵

socials-vertical icons
Technical SEO and Core Web Vitals for Persian websites post featured image

Technical SEO and Core Web Vitals for Persian websites

Every few weeks I get a message that goes roughly like this: "My Persian site is beautiful, I rank for my keywords, but traffic is flat and Search Console says my pages are not good for users." Then they attach a PageSpeed report. Almost every time, the numbers are bad in the same three places: LCP, INP, and CLS, and the causes are the same too: a heavyweight WordPress theme stacked with plugins, Persian webfonts loaded like a multi-megabyte download, and hero images uploaded untouched.

This is not a rare condition. It is the default state of much of the Iranian web, and one competent developer can turn it around in a week.

Why Persian sites score badly, in practice

The typical case: a WordPress install running a Persianized theme, plus a page builder, a font plugin, a slider, social widgets, a chat widget, and an analytics snippet copied from a global tutorial. That is forty to seventy requests and three to five megabytes of transfer. On the mobile connections most Iranian visitors actually have, LCP lands between four and eight seconds.

Fonts are the most common culprit, and they are uniquely bad for Persian. Latin fonts ship small glyph subsets and the browser drops unused weights. Persian script carries larger connected glyph sets, and families like Vazirmatn, Estedad, or Sahel include many weights. A theme loading six weights as separate files ships far more glyph data than any page needs.

The RTL dimension most guides skip

RTL is not just setting direction on the body. Line metrics, text rendering, and layout stability all change.

Persian text is taller than Latin at the same font-size because of descenders, diacritics, and ZWNJ. Many Latin-derived CSS resets under-size line-height for Persian, so lines clip or overlap, and fixing that later shifts the layout, which makes CLS worse rather than better. Test with real strings containing ک, گ, ی and Persian digits ۰۱۲۳, never placeholders.

Bidirectional text is the other trap. A page with embedded English product names, mixed currency prices, or code snippets will show flipped parentheses and misplaced punctuation if isolated left-to-right runs are not handled. No automated test flags that.

What Google actually does with fa pages

Google Discover behaves differently in this market, and it comes up on nearly every client call. It leans hard on structured data and visually rich feeds, and its availability and click-through rate inside Iran is not comparable to organic search. Discover-first strategies that work for large international brands do not transfer cleanly.

So prioritize being fast, crawlable, and indexable, then add Article, BreadcrumbList, and Organization schema where it is genuinely accurate rather than treating Discover as the plan.

Fonts: the highest-leverage fix

Stop loading a font family. Load one family, two weights maximum, and only the weights visible above the fold.

Preload the primary woff2 file so the browser starts fetching before it finishes parsing CSS, and subset to Persian plus Latin digits where you can. Set `font-display` deliberately, because the common values behave very differently. `swap` creates an invisible-text window where fallback Latin metrics render and the Persian text then reflows into place, a direct CLS contributor. `optional` avoids that reflow, but a visitor on a cold cache may see the fallback. For a Persian content site where the typeface carries brand value, I usually test `optional` with a tight preload and let field data decide.

Images and the LCP element

On most Persian sites the LCP element is the hero image or the logo. Compress it, serve AVIF with a WebP fallback, size it to the largest layout slot, and declare explicit `width` and `height` so the browser reserves space before paint. Lazy-load everything below the fold, and never the LCP candidate, which is the most common self-inflicted regression I see.

Hosting and network reality in Iran

This is where a Western checklist stops being directly usable. Iranian visitors frequently hit high latency and packet loss toward European and North American origins, and access to some CDNs is inconsistent. A Cloudflare-fronted site can be excellent in Frankfurt and mediocre in Tehran, so judge any acceleration decision from real-user data inside Iran.

My default: host in Iran if your audience is entirely domestic, or in a nearby region such as Istanbul or the Gulf with a CDN in front and aggressive caching. Never cache HTML for more than a few minutes, cache static assets for a year behind versioned URLs, and compress text with Brotli.

The practical checklist

  • Cut plugins to only what earns its place; every script is a dependency you do not control.
  • Load one Persian font family, two weights, subset and preloaded.
  • Give every image explicit dimensions, use AVIF, never lazy-load the LCP image.
  • Verify line-height and baseline with real Persian strings.
  • Choose `font-display` on purpose and confirm with field CLS.
  • Brotli the text, long-cache static assets, short-cache HTML.
  • Review mixed Persian and Latin pages by eye for bidi problems.
  • Add structured data only where it reflects the real page.
  • Compare before and after with real-user monitoring segmented by country.

Core Web Vitals are not mysterious, and for a Persian site they are rarely about cleverness. They are about removing weight, choosing fewer font weights, and measuring from where your users actually are.

Key takeaways

  • Load one Persian font family, two weights maximum, subset and preloaded. It is the highest-leverage fix available.
  • Never lazy-load the LCP candidate. Compress it, serve AVIF with a WebP fallback, and declare explicit width and height.
  • Verify line-height and layout with real Persian strings, including ZWNJ and Persian digits, not English placeholders.
  • Judge hosting and CDN choices from real-user data inside Iran, because a site can be excellent in Frankfurt and mediocre in Tehran.
  • Prioritize being fast, crawlable and indexable first, then add structured data only where it is genuinely accurate.

FAQ

Q: My Persian site ranks fine but traffic is flat. Where do I start? A: The same three numbers fail almost every time: LCP, INP and CLS. The causes are a heavyweight theme stacked with plugins, Persian webfonts loaded as multiple weights, and untouched hero images.

Q: Should I use font-display swap or optional? A: swap renders fallback Latin metrics first, then reflows Persian text, which directly causes CLS. optional avoids that reflow but a cold-cache visitor may see the fallback, so I test optional with a tight preload and let field CLS decide.

socials-vertical icons

130

socials-vertical icons

1900

you might also like...

Moving from WordPress to Next.js: a migration guide for Persian websites post featured imageMoving from WordPress to Next.js: a migration guide for Persian websites

The staged path from a slow WordPress site to a fast Next.js one, keeping Persian content, Persian URLs and search traffic intact.

Next.js App Router: Why Server Components Changed How I Build Websites post featured imageNext.js App Router: Why Server Components Changed How I Build Websites

The App Router and React Server Components are not just new APIs; they change where your code runs. Here is how they cut bundle size, simplified data fetching, and made my pages measurably faster.

parsaaghayi's blog logoparsaaghayi's blog logo

© 2024

All Rights Reserved , Inc.

parsa aghayi
Technical SEO and Core Web Vitals for Persian websites | Parsa Aghayi's Blog