サイトのユーザーが希望する言語でメールを送信することは重要です。この目的のために、WPMLはユーザーがサイトを使用している間に希望する言語を保存し、メールを送信する際にその設定を適用するAPIを提供しています。
このドキュメントでは、プラグインおよびテーマ開発者向けに、希望する言語のコンテキストで標準のWordPressのwp_mail()関数と自社製品を統合する方法を説明します。
ユーザーごとにローカライズされたメールを送信する必要があるケース
ユーザーが希望する言語でメールを送信する必要がある典型的なケースの例を以下に示します。
- 購読者にニュースレターを送信するサイト管理者の場合:サイト管理者がフランス人で、ニュースレターのインターフェースをフランス語で表示しているとします。結果として、すべてのメールはフランス語で送信されます。購読者は世界中から集まっているため、多くの人はこのメールを理解できません。
- ソーシャルネットワーキングサイトを運営している場合:このサイトのメンバーは写真を公開できます。他のメンバーはその写真に「いいね!」や星を付けることができ、「いいね!」されると画像の作成者にメールで通知されます。ここで、次のシナリオを考えてみましょう。
- ドイツ人のMathiasが写真を公開しました。
- フランス人の友人PierreがMathiasの写真を見つけ、いいね!ボタンをクリックします。
- このアクション中、Pierreはページをフランス語で表示していたため、Mathiasにはフランス語でメール通知が届きます。
- Eコマースサイトを運営している場合:一部の商品が一時的に在庫切れの場合、ユーザーはメールアドレスを登録して、商品が再入荷した際に通知を受け取ることができます。日本人の訪問者が一部の商品の下にメールアドレスを残したとします。その後、スペイン人であるサイト管理者が在庫状況を更新します。結果として、日本の顧客には「商品xが再入荷しました」という自動メールが日本語ではなくスペイン語で届きます。
これに似た例は他にも多数あり、これがプラグインやテーマで問題になるかどうかを最もよく把握しているのは開発者自身です。
これらすべてのケースにおいて、何らかの方法で受信者が希望する言語を保存し、メールを送信する間だけその言語に切り替える必要があります。
WPML固有のコードによるwp_mail()関数のラップ
メールを送信する際、プラグインまたはテーマのコードに次の3つのステップを追加する必要があります。
- メールの受信者が希望する言語に言語コンテキストを切り替えます。
- その後、実際にメールを送信するためのすべてのコードを実行します。
- 言語をサイトの言語に戻します。
2番目のステップは、現時点でおそらく準備ができているはずです。行うべきことは、WPML固有の2行を追加することだけです。太字の行を追加するだけです。
$email = get_option('receiver-email');
// Switch language context…
do_action('wpml_switch_language_for_email', $email);
// your code for sending email:
$subject = __('Hello, World!', 'text-domain');
$message = __('This is our newsletter', 'text-domain');
wp_mail($email, $subject, $message);
// switch language back
do_action('wpml_restore_language_from_email');
お分かりのように変更点はわずかですが、以下の2つの重要なポイントを覚えておく必要があります。
1. 最初のメールコンテンツを取得する前に言語を切り替える
メールのコンテンツを翻訳するために言語を切り替えることを忘れないでください。そのため、件名やメッセージの内容など、メールのコンテンツを取得する前に正しい言語を設定する必要があります。
以下のコードは機能しません。
$email = my_func_to_get_receiver_email();
$subject = my_func_to_get_title(); // will come in site’s lang
$message = my_func_to_get_msg_body(); // will come in site’s lang
do_action('wpml_switch_language_for_email', $email);
wp_mail($email, $subject, $message);
do_action('wpml_restore_language_from_email');
代わりに以下を使用します。
$email = my_func_to_get_receiver_email();
do_action('wpml_switch_language_for_email', $email);
$subject = my_func_to_get_title(); // will come in receiver’s lang
$message = my_func_to_get_msg_body(); // will come in receiver’s lang
wp_mail($email, $subject, $message);
do_action('wpml_reset_language_after_mailing');
2. 受信者の配列にメールを送信しない
wp_mail()関数では、$emailをメールのパラメータ配列として渡すことができます。残念ながら、メールのコンテンツを翻訳可能にする場合、これは禁止されています。
したがって、次のような機能しないコードがある場合は、
$emails = my_func_get_emails_array(); // array(email1, email2...)
do_action('wpml_switch_language_for_email', $emails); // will not work
$subject = my_func_to_get_title();
$message = my_func_to_get_msg_body();
do_action('wpml_restore_language_from_email');
次のように書き換える必要があります。
$emails = my_func_get_emails_array(); // array(email1, email2...)
foreach($emails as $email) :
do_action('wpml_switch_language_for_email', $email); // now is ok
$subject = my_func_to_get_title();
$message = my_func_to_get_msg_body();
do_action('wpml_restore_language_from_email');
endforeach;
受信者の言語の保存
WPユーザーの言語情報
受信者が標準のWordPressユーザーとして登録されている場合、言語情報を保存したりフックを作成したりする必要はありません。WordPress管理画面のプロフィール->プロフィールで希望する言語を設定できることをユーザーに知らせるだけです。
この情報は通常のユーザーメタフィールドに保存されるため、何らかの理由で取得したい場合は、次の便利なスニペットを使用できます。
$user = get_user_by( 'email', $email );
if ( $user && isset( $user->ID ) ) {
$lang = get_user_meta( $user->ID, 'icl_admin_language', true );
}
受信者が通常のWPユーザーではない場合
プラグインやテーマがメールアドレスを登録するたびに、受信者が希望する言語も保存する必要があります。このために特別な場所やデータ型は必要ありません。言語情報を返すフィルターを追加するだけです。フィルターの名前はwpml_user_languageです。
実装する必要があるサンプルコードは次のようになります。
add_filter(‘wpml_user_language’, ‘my_recipients_language’, 10, 2);
function my_recipient_language($lang, $email) {
return get_language_from_my_database($email); // implement it in your plugin/theme
}
言語ウィジェット
購読者向けに設定パネルを備えたフロントエンドのユーザーインターフェースを提供している場合、次のアクションフックを使用して言語を尋ねることができます。
do_action('wpml_user_language_switcher', array('mail'=>'mail@example.com') );
mail@example.comを現在の購読者の実際のメールアドレスに置き換える必要があることに注意してください。
このコードは、利用可能な言語のセレクトボックスを表示します。購読者がいずれかを選択すると、その値はAJAX呼び出しを通じてサーバーに送信されます。
次に、このデータをデータベースのテーブルに保存する必要があります。これを行うには、次のようにwpml_user_language_switcher_saveフィルターのフックを追加します。
add_filter('wpml_user_language_switcher_save', 'my_func', 10, 3);
function my_func($saved, $email, $language) { // your code to save email - language pair, i.e.:
save_language_in_my_database($email, $language);
// if you saved data correctly, return true
return true;
}
フィルターがtrueの値を返さない場合、またはそのためのフィルターがまったくない場合、WPMLはユーザーメタテーブルに言語情報を保存しようとします(次のセクションを参照)。
保存されていないアドレスへのメールの送信
データベースのテーブルに存在しないアドレスにメールを送信する必要がある場合があります。受信者がデータベースにいないため、受信者の言語設定も保存されていません。
そのようなケースでは、WPMLは以下の3つのグローバル変数のいずれかで言語コードが利用可能であることを想定しています。
$_POST['wpml_user_email_language']$_GET['wpml_user_email_language']$GLOBALS['wpml_user_email_language']
メールを翻訳する方法
メールのコンテンツの翻訳は、サイト内の他の文字列の翻訳と同じです。このトピックの詳細については、文字列翻訳のドキュメントページをご覧ください。
簡単に言えば、メールのコンテンツ(件名またはメール本文)として使用されるすべての文字列に以下が適用されていることを確認してください。
- 静的な文字列である場合は、gettext関数の_e()または__())でローカライズされていることを確認します。
- WordPressのオプションテーブルに保存され、get_option()関数を使用して取得される場合、それらも翻訳可能であることをWPMLに「通知」する必要があります。これは言語設定ファイルを使用して行います。
プラグインまたはテーマでこれらの条件が満たされている場合、ユーザーはWPML->文字列翻訳ページでそれらを翻訳できるようになります。
実践的な例
このページで説明した情報のより実践的な例については、SenseiプラグインでのWPML Mail API統合の使用に関するブログ記事をご覧ください。