2019年3月11日に加筆・修正をしました。
Webサイトを多言語化するWordpressプラグインはいくつかあるようですが、設計が素晴らしく、使いやすかったBogoを紹介します。
Bogoのインストールと初期設定
プラグインのインストール
公式プラグインディレクトリからダウンロード後インストールする場合は下記から。
wp-cliでのインストール・アクティベートは下記で。
wp plugin install bogo --activate
表示されるURL
インストールすると、下記のようなURLで言語ごとの表示が可能になります。アドレス表示はhome_url()を使う前提です。
http://sample.com/en/
言語パックのインストール・アクティベート
言語を設定する場合は、まず言語パックのインストール後、それからアクティベートを行います。
英語パックをアクティベートした状態
テキストの翻訳
サイトのタイトルとキャッチフレーズ
管理画面の「Language(言語)」で「Terms Transition(テキストの翻訳)」を選択後、設定します。なお、サイトのタイトルやアドレス、キャッチフレーズの表示はbloginfo() を使う前提です。
カテゴリ名やターム名
サイトのタイトルやキャッチフレーズと同様に、「Terms Transition(テキストの翻訳)」の画面で設定します。
カスタム投稿ラベル
カスタム投稿ラベルの翻訳は管理画面では行えないようなので、poファイルで設定できるようにfunction.phpに下記の記述をします。参考: 【WPML】カスタム投稿ラベルを多言語化する | in-visible【大阪・堺、バンコクのホームページ制作会社】
カスタム投稿でBogoを有効にする方法はWordPress Bogo をカスタム投稿タイプでも使う – Qiitaで触れられてます。
カスタム投稿ラベルの多言語設定
function.php
<?php
// -----------------------------------------
// カスタム投稿
// -----------------------------------------
// フロントと管理画面では複数形のラベルが表示される
// カスタム投稿「ニュース」の場合 / 投稿タイプスラッグ:news
add_action( 'init', 'cptui_register_my_cpts' );
function cptui_register_my_cpts() {
$labels_news = array(
"name" => __( 'News', '(テーマのテキストドメイン)' ),
"singular_name" => __( 'news', '(テーマのテキストドメイン)' )
);
$args_news = array(
"labels" => $labels_news,
"description" => "",
"public" => true,
"show_ui" => true,
"publicly_queryable" => true,
"has_archive" => true,
"show_in_menu" => true,
"exclude_from_search" => false,
"capability_type" => "post",
"map_meta_cap" => true,
"hierarchical" => false,
"rewrite" => array( "slug" => "news", "with_front" => true ),
"query_var" => true
);
register_post_type( "news", $args_news );
}
?>
Custom Post Types UI の設定画面
カスタム投稿ラベルの取得
poファイルを編集したうえで下記の記述でカスタム投稿ラベルを取得すれば、タイトル属性の表示やパンくずリストの表示の際に自動で翻訳されるので便利です。
<?php
// カスタム投稿ラベル名
$post_type_label = esc_html(get_post_type_object(get_post_type())->label );
?>
翻訳ページの作成
ページごとに翻訳ページが作成できます。言語別にページが独立する仕様なのでそれぞれのエディターやカスタムフィールドに異なる情報を入力できます。また、各言語ページ同士の関係は維持されます。
他言語ページの作成は個別管理画面に追加される「Add Transition」からカスタムフィールドの情報も含めて複製扱いで作成します。一覧で言語別絞り込み表示もできるので、作成後は言語ごとの編集もラクに行えます。
Search Everything との併用は不可
サイト内検索用にSearch Everythingと併用した場合、管理画面での言語絞り込み検索時に何も検索に引っかからない不具合が起こります。代わりにCustom Fields Searchを試してみると、このような不具合はありませんでした。
その他
言語別に表示を分岐させる
専用の変数が用意されているので、言語別に表示内容を分岐させることができます。
テンプレート内の記述
<?php if( 'en_US' == $locale ): ?>
(英語用)
<?php else: ?>
(英語以外用、日本語と英語のみの場合は日本語用)
<?php endif; ?>
なお、get_postsではなくWP_Queryを使えば、特別な設定無しで言語別の投稿を表示できます。
タクソノミータームの扱い
投稿に設定されているタームを get_terms で言語別に取得することは、現時点ではできないようでした。日本語投稿で設定済みのタームがあれば、多言語でも「設定済み」の扱いとなるので、方法としては下記のようにするほか無いかと。
- 使用するタクソノミーを言語ごとに分ける。
- 日本語の投稿がある場合は、もれなく他言語も作成する。
Custom Post Type Permalinksを使っている場合
カスタムタクソノミーの設定をCustom Post Type Permalinks で行っている場合は、代わりに、Custom Post Type Permalinks の作者さんが別に作成されているSimple Post Type Permalinksを使うと言語別の表示をスムーズに行えます。
以上です。