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.css
の Text 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での翻訳手順:
- WordPress管理画面の WPML > テーマとプラグインの翻訳 にアクセス
- 使用しているテーマを探す
- 該当する文字列を見つけて翻訳を追加
- 各言語で保存すれば、サイト上でも切り替わって表示されます
翻訳ファイル.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メニューを同期し、メニューで利用されているテキストを読み込んだあとに翻訳を追加、その後再度同期することで翻訳することが可能です。
詳しくは公式ドキュメントを参照してください。
<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