WPML開発メモ:多言語対応で使える便利な関数や設定まとめ

※本記事のコードは参考用です。使用前にご自身で動作確認をお願いします。

WordPressで多言語対応サイトを構築する際に欠かせないのが「WPML(WordPress Multilingual Plugin)」です。今回は、開発時によく使う便利な関数や設定方法をまとめました。備忘録としても、これからWPMLを触る方にも役立つ内容です。

suppress_filters で意図的にフィルターを無効にする

WP_Queryなどのクエリで、多言語フィルターを無視したい場合に使います。
'suppress_filters' => trueと指定することで、WPMLが自動で追加するフィルター(例:現在の言語に絞るなど)を無効化できます。

ただし、管理画面内で投稿やカスタム投稿タイプごとに「翻訳済みのアイテムのみ表示」するか、「翻訳が利用可能な場合は使用し、そうでない場合はデフォルト言語にフォールバック」という設定が設けられているので、全ページ共通の場合には管理画面内で設定可能です。

$args = [
  'post_type' => 'post',
  'suppress_filters' => true
];
$query = new WP_Query($args);

言語スイッチャーを追加する

テンプレートに下記のアクションを記述することで、カスタムの言語スイッチャーを出力できます。

<?php do_action('wpml_add_language_selector'); ?>

言語による条件分岐

表示する言語ごとに処理を変えたい場合は、apply_filters( 'wpml_current_language', null )を使って簡単に判別できます。
これを使えば、現在表示中のページがどの言語であるかを2文字の言語コード(例:ja, en, fr)で取得できます。

現在の言語を取得して使う(PHP内で使う場合)

$current_lang = apply_filters( 'wpml_current_language', null );

if ( $current_lang === 'ja' ) {
    echo '日本語のページです';
} elseif ( $current_lang === 'en' ) {
    echo 'This is the English page.';
}

ショートコードとして使う(本文中に使いたい場合)

function get_language_shortcode() {
    return apply_filters( 'wpml_current_language', null );
}
add_shortcode( 'language', 'get_language_shortcode' );

記事やウィジェットなどに以下のようにショートコードを記述して利用します。

現在の言語は [language] です。 // 出力例:現在の言語は ja です。

※非推奨の方法:ICL_LANGUAGE_CODE

WPMLでは以前から ICL_LANGUAGE_CODE という定数でも言語コードが取得できますが、公式では非推奨とし、wpml_current_languageの利用を推奨しています。

The constant ICL_LANGUAGE_CODE works in a similar way. However, please note that this is a deprecated method for getting the current language and does not work in all cases. We strongly recommend using the wpml_current_language hook instead.
How can I get the current language with WPML? - WPML

翻訳可能な文字列をテンプレートで出力する

テーマ内で翻訳対応するためには、_e()__() を使います。

  • 第1引数:翻訳したい日本語(または他の言語)のテキスト
  • 第2引数:テキストドメイン(=翻訳ファイルの識別子)
<?php _e("翻訳したいテキスト","テキストドメイン") ; ?>

WPML または .moファイルの中で 「翻訳したいテキスト」に対応する英語訳が設定されていれば、英語ページでは英語訳が表示されるようになります。

なぜ 「テキストドメイン」 が必要なのか

WordPress は多数のテーマ・プラグインが同時に動作しているため、どのテーマ・プラグインの翻訳かを判別する必要があります。
(テキストドメインは、テーマの style.cssText Domain: にも一致している必要があります。)

load_theme_textdomain() と組み合わせて使う

また、load_theme_textdomain() を使って翻訳ファイルを読み込ませます。
この _e() 関数は、翻訳ファイルを読み込んでおくことが前提です。それを実現するのが load_theme_textdomain() です。

function my_theme_setup() {
  load_theme_textdomain( 'テキストドメイン' );
}
add_action( 'after_setup_theme', 'my_theme_setup' );

WPMLと一緒に使う場合

WPMLを使っている場合でも、_e() で書かれた文字列は「文字列翻訳機能」で自動的に抽出され、管理画面から翻訳できます。

WPMLでの翻訳手順:

  1. WordPress管理画面の WPML > テーマとプラグインの翻訳 にアクセス
  2. 使用しているテーマを探す
  3. 該当する文字列を見つけて翻訳を追加
  4. 各言語で保存すれば、サイト上でも切り替わって表示されます

翻訳ファイル.moを利用する場合

function my_theme_setup() {
  load_theme_textdomain( 'テキストドメイン', get_template_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'my_theme_setup' );

これにより、/languages/ja.mo/languages/en.mo の翻訳ファイルから翻訳を自動的に探して表示してくれます。

メニューの翻訳

WPMLはメニューごとに各言語版を用意できます。メニュー設定画面で、各言語のメニューを作成し、それぞれに割り当てることで自動的に切り替えられます。

通常通り管理画面内のカスタマイズでメニューを作成したあと、WPMLの機能でWPメニューを同期し、メニューで利用されているテキストを読み込んだあとに翻訳を追加、その後再度同期することで翻訳することが可能です。
詳しくは公式ドキュメントを参照してください。

WPMLを使用してWordPressメニューを翻訳する

<html>タグの言語属性を出力

HTMLタグに現在の言語コードを反映することで、検索エンジンがそのページの言語を正確に認識できます。WPMLが内部的に lang="ja"dir="ltr" を正しく出力してくれるので、SEOとアクセシビリティの両面で効果があります。

<html <?php language_attributes(); ?>>

他言語の投稿IDを取得する

指定した投稿(またはターム)の別言語版のIDを取得できます。リンクの切り替えなどに便利です。

$translated_id = apply_filters( 'wpml_object_id', $original_id, 'post', true, 'en' );

例:他の言語へのリンクを作成する

$translated_id = apply_filters( 'wpml_object_id', get_the_ID(), 'post', false, 'en' );
$translated_url = get_permalink( $translated_id );

投稿の言語を取得する

投稿がどの言語に属しているか、言語コードや元言語(翻訳元)など詳細情報を取得したいときに便利です。

$language_info = apply_filters( 'wpml_post_language_details', null, $post_id );

例:投稿の言語情報を使って処理を分ける

$lang_info = apply_filters( 'wpml_post_language_details', null, get_the_ID() );
if ( $lang_info && $lang_info['language_code'] === 'en' ) {
  echo 'This post is in English.';
}

まとめ

WPMLは高機能で柔軟な多言語対応プラグインですが、開発中に知っておくと便利な関数や設定も多くあります。
便利なフックはリファレンスにもたくさん記載されていますので、ぜひ自分でも使えそうなフックがないか確認してみてください。
WPML Hooks Reference - WPML

今回紹介した内容を活用することで、よりスムーズでトラブルの少ない多言語サイト構築ができるはずです。

参考

WPMLを使用してWordPressメニューを翻訳する
How can I get the current language with WPML? - WPML
Developers Information - WPML