Skip to content

Make your WordPress site multilingual without copying posts

Each translation is stored in the post's own meta under its language code, so the post carries all of its languages itself.

A post in the block editor with a translation panel for each of its five languages
  • 1 post

    carries every translation in its own meta

  • 0 outbound requests

    from the plugin: no API, no account

  • 7 filters

    and that is the whole developer surface

  • 1.8.1

    released October 30, 2026

0:00
Add a language and every post gets a translation panel for it. The same post then answers at one address per language.
The Languages settings screen after French was added, with five active languages

Add your languages

Pick the languages you publish in from the settings screen. Each one gets a URL prefix, which is its language code. The default language keeps WordPress' own prefix-free URLs, so every post has a single canonical address.

The French translation panel on the post, with its title, slug and content filled in

Translate the content

Write each translation in the panel below the post: a title, a slug and a visual editor for the content. Give each language its own slug for a post. Nested pages keep their translated parents in the path.

The French version of the post on the site, with the language switcher under it

Show the switcher

Use the shortcode in any post or page, or the template tag in a theme file. Both take show_flag and show_name, on by default: pass show_name="false" for flags only. With both off the name stays, so a link is never empty. On a post the links lead to that post in each language, elsewhere to each language's home.

[multilify_switcher]
<?php multilify_switcher(); ?>

One post, four addresses

Rewrite rules route the prefixed address, a lookup on the translated slug finds the original post, and the stored translation for that language is what gets rendered.

/the-harbor-in-october/English
/de/der-hafen-im-oktober/Deutsch
/es/el-puerto-en-octubre/Español
/tr/ekimde-liman/Türkçe

All four addresses resolve to the same post.

<html lang="en">
<link rel="alternate" hreflang="en" href="https://example.com/the-harbor-in-october/">
<link rel="alternate" hreflang="de" href="https://example.com/de/der-hafen-im-oktober/">
<link rel="alternate" hreflang="es" href="https://example.com/es/el-puerto-en-octubre/">
<link rel="alternate" hreflang="tr" href="https://example.com/tr/ekimde-liman/">
<link rel="alternate" hreflang="x-default" href="https://example.com/the-harbor-in-october/">

Install it in one line

Install from the WordPress plugin directory, or with WP-⁠CLI.

wp plugin install multilify --activate

Or hand it to an AI agent

Paste one line into Claude Code, Cursor or Codex. The agent reads the setup guide, shows you a plan, adds your languages and checks every address before it reports back.

Read https://multilify.com/agents.md and set up Multilify on this WordPress site. Show me your plan before you change anything.