【原因+解決】WooCommerceで受注メールに日本語ではなく英語「Thanks for your order. It’s on-hold until we confirm that payment has been received. In the meantime, here’s a reminder of what you ordered:」などが表示される

WordPressで、プラグインWooCommerceを使ってオンラインストアを構築しているときに、Japanized for WooCommerceなどを使って日本語対応していたり、一部クレジットカード決済プラグインを利用しているときに、受注メールに日本語が表示されず、「Thanks for your order. It’s on-hold until we confirm that payment has been received. In the meantime, here’s a reminder of what you ordered:」と表示される原因とその解決方法について備忘録を書いておきます。

原因

原因は以下のような要因によって起こります。簡単に言えば「翻訳に問題があるから」なんですが起こっていることは割と複雑なので下記に書きます。

  1. オンラインストアでは、日本語対応・日本文化対応や、プラグインで対応するときに、受注メールの内容を変更する必要がある。
  2. 通常、WooCommerceの動作に介入する(動作を変更する)ときは、「アクションフック」「フィルターフック」(まとめて「フック」といいます。)という機能を使う。この機能はWooCommerce側が用意しているもので、WooCommerceが想定したタイミングで介入できる。
  3. しかし、メールには適切な「フック」が無いため、代替の方法として「メールテンプレートの差し替え」を行う。
  4. 「メールテンプレート」には、多言語化に対応するために翻訳の仕組みが入っていて、esc_html_e()関数を使って、英語で書かれた文章を自動的に対応言語(今回の場合は日本語)に翻訳するようになっている。英語に対応する日本語は、WooCommece内の翻訳ファイルに保存されている。
  5. しかし、WooCommerce側で更新があってメールテンプレートが更新されると、同時に翻訳の元になる英語も変更されて、「英語で書かれた文章」が更新されてしまう。
  6. 一方で、WooCommerceに関係するプラグイン(Japanized for WooCommerceやクレジット決済プラグイン)は、テンプレートの差し替えを行って「古いメールテンプレート」のまま動作しているので、「英語で書かれた文章」と「日本語で書かれた文章」も古いままで、対応する翻訳が存在しない状態になってしまう。
  7. WordPressでは、英語に対する翻訳が存在しない場合、そのまま英語を表示するので、今回のような英語が表示されてしまう。

解決方法

結論としては翻訳に問題があるので、Wordpressに用意されているgettextフィルターフックでフィルタリングするのがいいかなと思います。

テーマフォルダのfunctions.php(/wp-contents/themes/(利用中のテーマのフォルダ名)/functions.php) の一番最後あたりに書いとけばいいんじゃないでしょうか。

// 英語を日本語に翻訳
function xnonce_filter_get_text($translation, $text, $domain)
{
    // $text: 翻訳する前の文章
    // $translation: 翻訳後の文章
    // $domain: 翻訳するドメイン(翻訳上のカテゴリみたいなやつ)
    if ($domain == 'woocommerce' && $text == 'Thanks for your order. It’s on-hold until we confirm that payment has been received. In the meantime, here’s a reminder of what you ordered:') {
        $translation = 'ご注文ありがとうございます。ご注文内容を確認後、商品を発送します。以下にご注文内容をお知らせします。';
    }
    return $translation;
}
add_filter('gettext', 'xnonce_filter_get_text', 100, 3);

もし、WooCommerceがアップデートされたら似たような方法で解決できると思います。

翻訳されていない英語が書かれているテンプレートを探して、ドメインと翻訳前の文章を調べて、gettextフィルタで介入するだけです。

まあでもたぶん時間がたてば、Japanized for WooCommerce さんや、その他プラグイン側が対応してくれると思いますので、「プラグインが更新されるまで待つ」というのも、ひとつの対応方法かもしれません。(セキュリティリスクはありますが…)

質問・相談・感想など

参考になれば幸いです。もし質問とか相談とかありましたら、コメントやメールいただけると嬉しいです。あっ。メールアドレスはサイトの一番下に書いてます。

質問・コメントなどあると嬉しいです