2026年6月19日
2026年6月19日
WordPressで多言語サイトを作る方法(Polylangの設定手順とWPMLとの違い)
WordPress 本体には、1つのサイトで複数の言語の記事を管理する機能がありません。日本語と英語のページを並べて運営するには、多言語化のプラグインを使います。代表的なのは、無料で使える Polylang と、有料の WPML です。
この記事では、Polylang で日本語を既定の言語、英語を2つめの言語にする手順を説明します。手順とコードは、2026年11月時点の Polylang 3.9.2(WordPress 7.1・PHP 8.3)で動作を確かめました。WPML については公式サイトとドキュメントの記載をもとに違いをまとめています。
PolylangとWPMLの違い
| 項目 | Polylang(無料版) | WPML |
|---|---|---|
| 入手先 | wordpress.org のプラグインディレクトリ | 公式サイト(wpml.org)から購入してダウンロード |
| 料金 | 無料(有料版 Polylang Pro もある) | 有料(下記) |
| 翻訳の入力 | 言語ごとに投稿を作り、自分で書く | 自分で書くほか、自動翻訳や翻訳者への依頼の機能がある |
| WooCommerce | 別売りのアドオン Polylang for WooCommerce が必要 | 上位プランに含まれる |
| URL のスラッグ | 言語ごとに別のスラッグにする(同じスラッグは Pro の機能) | 言語ごとに同じスラッグも使える |
WPML の料金は、2026年11月時点の公式サイトの表示で、Multilingual Blog が39ユーロ(本番1サイト)、Multilingual CMS が99ユーロ(本番3サイト)、Multilingual Agency が199ユーロ(サイト数無制限)で、どれも1年間のサポートと更新が付きます。Multilingual Blog には WooCommerce 対応と文字列翻訳が含まれません。
個人のブログや会社案内のように、ページ数がそれほど多くなく、翻訳は自分で書くサイトなら Polylang で足ります。商品数の多い WooCommerce のストアや、翻訳者と分担して大量のページを訳す場合は WPML の方が向いています。
Polylangを入れて言語を追加する
インストール
管理画面の「プラグイン」→「プラグインを追加」で「Polylang」を検索してインストールし、有効化します。WP-CLI が使える場合は次のコマンドでも入ります。
wp plugin install polylang --activate
有効化すると、設定ウィザードが始まります。ウィザードを閉じた場合も、管理画面の「言語」メニューから同じ設定ができます。
言語を追加する
- 「言語」→「言語」を開きます。
- 「言語を選択」で「日本語」を選び、「言語を追加」を押します。
- 同じように「English (United States)」などを追加します。
最初に追加した言語が既定の言語になります。既定の言語は、言語一覧の星印で変えられます。
言語を追加すると、すでにある投稿や固定ページに言語が付いていない旨の案内が出ます。表示された操作で、既存の記事をまとめて既定の言語(日本語)に割り当てます。
URLの形を決める
「言語」→「設定」の「URL の修正」で、言語を URL のどこで区別するかを決めます。
| 設定 | URL の例 |
|---|---|
| 言語はプリティーパーマリンク内のディレクトリ名から設定される(初期値) | example.com/en/about/ |
| サブドメイン名から設定される | en.example.com/about/ |
| 異なるドメインから設定される | example.com と example.jp など |
初期値では「URL にデフォルトの言語の言語情報を表示しない」も有効なので、日本語の記事は今までどおり example.com/about/、英語の記事は example.com/en/... になります。既存の日本語ページの URL が変わらないので、すでに運営しているサイトに英語を足す場合はこの組み合わせが無難です。
この設定は、公開後に変えると URL がまとめて変わり、検索エンジンの評価や外部からのリンクに影響します。英語のページを公開する前に決めておきます。
設定を変えたら、「設定」→「パーマリンク」を開いて「変更を保存」を押し、パーマリンクを更新しておきます。
投稿と固定ページを翻訳する
Polylang は自動では翻訳しません。言語ごとに別の投稿を作り、それらを「互いの翻訳」として結び付ける仕組みです。
- 「投稿」→「投稿一覧」を開くと、言語ごとの列が追加されています。
- 英語版を作りたい記事の行で、英語の列にある「+」を押します。
- 新しい投稿の編集画面が開き、言語が English に設定されています。題名・本文を英語で書きます。
- スラッグは日本語版と別のものにします(たとえば日本語版が
aboutならabout-enなど)。無料版では、言語が違っても同じスラッグは使えません。 - 公開します。
カテゴリーとタグも、言語ごとに作って結び付けます。「投稿」→「カテゴリー」の一覧に、投稿と同じ言語の列があります。
言語スイッチャーを置く
訪問者が言語を切り替えるリンクは、Polylang の「言語スイッチャー」で置けます。テーマの種類によって置き方が違います。
- ブロックテーマ(Twenty Twenty-Five など): サイトエディターでヘッダーのナビゲーションを開き、Polylang の言語スイッチャーのブロックを追加します。
- クラシックテーマ: 「外観」→「メニュー」の左側に「言語スイッチャー」の項目があるので、メニューに追加します。表示されない場合は、画面右上の「表示オプション」で「言語スイッチャー」にチェックを入れます。
- ウィジェットを使うテーマ: 「外観」→「ウィジェット」で言語スイッチャーをサイドバーなどに追加します。
国旗の表示、言語名の表示、ドロップダウン表示などは、それぞれの設定欄で選べます。
コードで切り替えリンクを出す
テーマのテンプレートに直接リンクを出したい場合は、pll_the_languages() に 'raw' => 1 を渡して、言語ごとの URL と名前を配列で受け取ります。次のコードは、表示中のページに翻訳があるときだけ、本文の最後にほかの言語へのリンクを付けます。
wp-content/mu-plugins/my-lang-switcher.php に保存すると読み込まれます。Polylang を無効にしても画面が真っ白にならないよう、function_exists() で確かめてから呼び出しています。
<?php
/**
* Plugin Name: 言語切り替えリンク
*/
// 翻訳がある言語へのリンクを並べる(Polylang が無効なら何も出さない)
function my_language_links() {
if ( ! function_exists( 'pll_the_languages' ) ) {
return '';
}
$languages = pll_the_languages( array( 'raw' => 1 ) );
$items = array();
foreach ( $languages as $lang ) {
if ( $lang['current_lang'] || $lang['no_translation'] ) {
continue; // 表示中の言語と、翻訳が無い言語は出さない
}
$items[] = sprintf(
'<a href="%s" hreflang="%s" lang="%s">%s</a>',
esc_url( $lang['url'] ),
esc_attr( $lang['slug'] ),
esc_attr( $lang['slug'] ),
esc_html( $lang['name'] )
);
}
return $items ? '<p class="my-lang-links">' . implode( ' / ', $items ) . '</p>' : '';
}
// 本文の最後に付ける
add_filter( 'the_content', function ( $content ) {
if ( is_singular() && in_the_loop() && is_main_query() ) {
$content .= my_language_links();
}
return $content;
} );
Polylang 3.9 で pll_the_languages() の引数が整理され、dropdown・show_names・display_names_as などの古い引数は非推奨になりました。HTML をそのまま出す使い方をする場合は、引数の説明(プラグインの src/api.php のコメント)を確認してください。'raw' => 1 で配列を受け取る使い方は、この変更の影響を受けません。
ほかによく使う関数は次のとおりです。
| 関数 | 返す値 |
|---|---|
pll_current_language() |
表示中の言語のコード(ja、en など) |
pll_default_language() |
既定の言語のコード |
pll_get_post( $post_id, 'en' ) |
指定した投稿の英語版の ID(無ければ空) |
pll_home_url( 'en' ) |
英語版のトップページの URL |
テーマ内の固定の文言を翻訳する
フッターの「お問い合わせはこちら」のように、テーマのコードに直接書いた文言は、投稿の翻訳では訳せません。pll_register_string() で登録すると、「言語」→「翻訳」(文字列翻訳)の画面で言語ごとの訳を入力でき、pll__() で表示中の言語の訳を取り出せます。
<?php
// 文字列を登録する(functions.php など)
add_action( 'init', function () {
if ( function_exists( 'pll_register_string' ) ) {
pll_register_string( 'footer-contact', 'お問い合わせはこちら', 'my-theme' );
}
} );
// テンプレートで表示する
$label = function_exists( 'pll__' ) ? pll__( 'お問い合わせはこちら' ) : 'お問い合わせはこちら';
echo esc_html( $label );
サイトのタイトルとキャッチフレーズは、登録しなくても「翻訳」の画面に最初から並んでいます。
hreflangと検索エンジン向けの設定
Polylang は、翻訳がある投稿や固定ページの <head> に、各言語版を示す hreflang のリンクを自動で出力します。<html lang="..."> も表示中の言語に変わります。自分で wp_head に hreflang を出すコードを足すと二重になるので、足さないでください。出力された内容は、ページのソースを表示して hreflang で検索すると確認できます。
Yoast SEO を使っている場合は、Polylang 側に Yoast SEO との連携が組み込まれていて、XML サイトマップに各言語の記事が入り、Yoast SEO のタイトルの雛形なども「言語」→「翻訳」の画面で言語ごとに訳せます。
WPML も、翻訳があるページに hreflang を自動で出力します。
WPMLを使う場合
WPML は wordpress.org に無いため、wp plugin install wpml のようなコマンドでは入りません。wpml.org で購入し、アカウントの画面からインストーラーをダウンロードして、「プラグイン」→「プラグインを追加」→「プラグインのアップロード」で入れます。
テーマやプラグインから WPML の情報を使うときは、WPML が用意しているフィルターを apply_filters() で呼びます。WPML が無効なときは、第2引数の値がそのまま返るので、エラーになりません。
<?php
// 表示中の言語のコード
$current_lang = apply_filters( 'wpml_current_language', null );
// 投稿 ID 123 の英語版の ID(翻訳が無ければ元の ID を返す)
$en_id = apply_filters( 'wpml_object_id', 123, 'post', true, 'en' );
// URL を英語版の URL に変換する
$en_url = apply_filters( 'wpml_permalink', get_permalink( 123 ), 'en' );
注意点
- 言語の切り替えとキャッシュ。 URL に言語が入るディレクトリ方式なら、言語ごとに URL が分かれるので、ページキャッシュとの相性の問題は起きにくくなります。「ブラウザーの言語の検出」を有効にしている場合は、トップページで訪問者のブラウザーの言語に振り分ける動きが入るため、キャッシュ系のプラグインを使っているときは、別の言語のブラウザーでトップページが正しく表示されるか確かめてください。
- 翻訳が無いページ。 英語版が無い記事は、英語の言語スイッチャーに出ないか、英語のトップページへのリンクになります(設定による)。主要なページから順に訳すと、英語の訪問者が迷いにくくなります。
- プラグインの乗り換え。 Polylang と WPML は翻訳の結び付けの保存方法が違うため、あとから乗り換えると移行作業が必要になります。WooCommerce を使う予定があるかどうかなど、先に方針を決めてから始めます。