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

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:
| Option | Pros | Cons |
|---|---|---|
| Just publish English posts | No plugin | They 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, free | Each language needs its own slug, and block theme labels can’t be translated |
| Paid plugins such as WPML | Lots of features | Paid, and overkill for a personal blog |
| A separate English site | Completely separate | Two 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
- Install and activate the plugin.
- Under Languages → Languages, add Korean first: the first language becomes the default. Then add English.
- 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.
- 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.
- Turn off browser language detection and media translation. (Both were off by default in 3.9.)
- Go to Settings → Permalinks and just click Save once. Skipping this can make
/en/URLs return 404 (see below).

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.

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.


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.


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).
Leave a Reply