Add an English Version to WordPress with Polylang – Keep Your Existing URLs

I added an English version to my Korean WordPress blog with the free version of Polylang. Korean posts keep their existing URLs, and English posts live under /en/. The key setting is “hide the language code for the default language”, and once an English post is linked to its Korean original as a translation, hreflang tags are added automatically. The blog now has nine English posts.

At a glance

  • Why: some posts get searched from abroad (a Sony RX1 repair, Apple Pay in Korea, a Seoul concert venue)
  • Plugin: Polylang 3.9, free (PHP 7.4+, WordPress 6.8+)
  • Key setting: Korean as the default language, with its language code hidden from URLs → existing URLs stay; English under /en/
  • Turned off: browser language redirect, media translation
  • Gotchas: /en/ returning 404, separate slugs and categories per language, Korean labels baked into a block theme
  • Result: automatic hreflang, and English posts never show up on the Korean home page or feed
Diagram of a Korean + English WordPress site with Polylang: Korean keeps its URLs, English under /en/, posts linked with hreflang
Korean keeps its URLs; English lives under /en/

Why an English version?

Some of my posts are more useful to people outside Korea than in it. The Sony RX1’s E:61 error is a known problem worldwide, and Apple Pay in Korea or getting to Yes24 Live Hall is exactly what visitors and K-pop fans search for.

I weighed a few options:

OptionProsCons
Just publish English postsNo pluginThey mix into the Korean home page, and search engines can’t tell which post translates which
Polylang (free)Per-language URLs, home pages and automatic hreflang, freeEach language needs its own slug, and block theme labels can’t be translated
Paid plugins such as WPMLLots of featuresPaid, and overkill for a personal blog
A separate English siteCompletely separateTwo sites to maintain

For a personal blog starting with a handful of translated posts, free Polylang was the obvious choice.

Before installing

  • Back up: every post, category and tag gets a language, so I backed up the database first.
  • Requirements: Polylang 3.9 needs PHP 7.4 and WordPress 6.8 or later.
  • Caching: I use a page cache (W3 Total Cache), so I didn’t use the option that redirects the home page by browser language. Mixed with cached pages, visitors can end up on the wrong language.

Setting up Polylang, step by step

  1. Install and activate the plugin.
  2. Under Languages → Languages, add Korean first: the first language becomes the default. Then add English.
  3. When Polylang says some posts and terms have no language, assign them all to the default language (Korean). My blog had 38 posts and pages and 179 categories and tags.
  4. Under Languages → Settings → URL modifications, set the language from the directory name and turn on hiding the language code for the default language. That’s what keeps every Korean URL unchanged.
  5. Turn off browser language detection and media translation. (Both were off by default in 3.9.)
  6. Go to Settings → Permalinks and just click Save once. Skipping this can make /en/ URLs return 404 (see below).
Polylang Languages screen with Korean as the default language (star) and English, with post counts per language
Languages → Languages: Korean is the default (★), English added

Publishing English posts and linking translations

  • Language: in the post editor’s language panel, choose English and link the Korean original as its translation. The two posts then point to each other.
  • Separate slugs: the free version can’t use the same slug in two languages, so English posts get their own. Example: /apple-pay-contactless-korea/ ↔ /en/apple-pay-in-korea/
  • Categories and tags per language: I created English categories and linked them to the Korean ones: IT 리뷰 ↔ Tech Reviews, IT 정보 ↔ Tech Guides, 공연·문화 ↔ Concerts & Culture, 여행 정보 ↔ Travel Guides, 카메라·사진 ↔ Cameras.
  • Shared images: with media translation off, both posts use the same images; the English post just gets English alt text.

I don’t translate word for word; I adapt for readers abroad. The Yes24 Live Hall guide leads with the subway and shuttle rather than parking, Korea-only affiliate links are dropped, and each English post ends with a line linking to the Korean original.

Doing it in bulk: WP-CLI

The free version of Polylang can’t set a post’s language through the REST API, so I create posts over REST and set the language and translation links with WP-CLI, calling Polylang’s own functions:

wp eval '
pll_set_post_language( 499, "en" );                              // English post ID
pll_save_post_translations( array( "ko" => 412, "en" => 499 ) ); // link to the original
'

One more catch: a post created over REST is saved in the default language first, and Polylang then swaps its English categories and tags for their Korean translations (or creates duplicate tags). So after setting the language, I set the categories and tags again by their English term IDs and remove any empty duplicates.

Gotchas

1. /en/ URLs returned 404

After adding the languages and publishing an English post, /en/… returned 404, and the URL without the language code redirected to /en/. The rewrite rules simply hadn’t been regenerated with the language prefix. Saving the permalinks again (or wp rewrite flush in WP-CLI) fixed it instantly.

2. A block theme’s Korean labels on English pages

Posts and categories switched to English, but the text written into the theme itself (the home page greeting, “최신 글” for “Latest posts”, the table of contents, the author box, footer links) stayed Korean. Free Polylang can’t translate text inside block theme templates.

English home page before and after: Korean greeting and "Latest posts" heading before, English after
The English home page, before and after

So I wrote a small mu-plugin that swaps the theme’s fixed labels for English only on English pages. It leaves post content alone and also overrides labels added through CSS.

add_filter( 'render_block', function ( $html, $block ) {
	if ( is_admin() || ! function_exists( 'pll_current_language' ) || 'en' !== pll_current_language() ) {
		return $html;
	}
	return strtr( $html, array(
		'>최신 글</h1>' => '>Latest posts</h1>',
		'>글쓴이</p>'  => '>Author</p>',
		// … one entry per label in the theme
	) );
}, 20, 2 );

The site tagline and Yoast’s “Home” breadcrumb are translated under Languages → Translations (string translations).

3. Switching between Korean and English

I added a language link at the end of the header menu, but only on posts that have a translation and on the home page. On untranslated posts an “English” link would just dump readers on the English home page.

English link at the end of the header menu on the Korean RX1 repair post
A translated Korean post: "English" in the header
Header of the English Apple Pay post with English category menu and a link to Korean
An English post: English categories and a link to Korean

The result

Two posts linked as translations get these tags automatically (RX1 in Korean ↔ in English):

<link rel="alternate" href="https://lavient.life/sony-rx1-e61-error-repair/" hreflang="ko" />
<link rel="alternate" href="https://lavient.life/en/sony-rx1-e61-error-diy-repair/" hreflang="en" />
  • English pages get <html lang="en-US">, and the sharing metadata (og:locale) switches to en_US.
  • English posts never appear on the Korean home page or feed; they have their own /en/ and /en/feed/.
  • The Yoast SEO sitemap includes the /en/ URLs, so I only had to request indexing for the new URLs in Search Console.
  • No existing Korean URL changed, and every main page loaded normally after the switch.
Korean home page of lavient.life with an English link at the end of the header menu
Korean home page: "English" at the end of the header
English home page of lavient.life with English categories, English greeting and a 한국어 link
English home page (/en/): "한국어" at the end of the header

Other things running on the same self-hosted WordPress: PHP 8.3 in Docker on Synology DSM 6.2.

Frequently asked questions

Is the free version of Polylang enough?

For a personal blog translating a few posts, yes. Per-language URLs, separate home pages, hreflang and per-language categories all work in the free version. Translating block theme text and sharing slugs across languages don’t.

Will installing Polylang change my existing URLs?

Not if you hide the language code for the default language. Posts in the default language keep their URLs; only the added language gets a prefix such as /en/.

My English post URL returns 404.

Go to Settings → Permalinks and click Save. If the rewrite rules weren’t regenerated after adding a language, /en/ URLs can 404.

Does it work with a caching plugin?

I use it with W3 Total Cache without problems, with browser language detection turned off. Clear the cache after changing settings.

This is a translation of my original Korean article: 워드프레스 Polylang으로 영어판 만들기 – 기존 주소 그대로 다국어 블로그. Last checked: 25 October 2026 (Polylang 3.9, WordPress 7.1.3).

lavient Avatar

Author

lavient

A personal blog from Korea about everyday life and the things I care about, written from what I have actually used, visited and lived through.

Leave a Reply