WPMLで多言語対応サイトを作るときのContactForm7でのエラー

dog-1407475

こんにちは!3plusです!

今日は、ちょっとニッチなネタですが、探してもなかなか出てこなかった問題を自力で解決したので、情報共有しておきたいと思います。

 

タイトル通り、WPML(Wordpress Multi Language)を利用して多言語対応サイトを作っていると、各言語の固定ページは以下のようなURLになります。

(中国語)http://your-domain/pagename/?lang=zh-hans
(日本語)http://your-domain/pagename/?lang=ja

余談になりますが、多言語対応サイトを作る場合、言語指定なしの標準状態は英語にしておく方がいいです。もちろん、国内向けの方が需要が多ければ標準を日本語にしてくださいね。

 

さて、上記のようなURLでContact Form 7を利用しようとすると・・・

標準言語ページでは正常動作するのに、言語指定がある場合には送信時にエラーとなり、送信中のまま止まってしまうことがあります。

 

他にもパターンはあるかもしれませんが、おそらくは

http://your-domain/wp-json/?lang=jp/contact-form-7/v1/contact-forms/[ID]/feedback

というアドレスにアクセスし、404エラーが発生しているケースが多いと思います。

 

標準言語で動作するときのアクセスを見てみると

http://your-domain/wp-json/contact-form-7/v1/contact-forms/[ID]/feedback

というアクセスが発生しています。

つまり、言語指定の「?lang=jp」の部分を有効なURLとしてとらえてしまい、Contact Form 7の応答が返せないアドレスにアクセスしてしまっている、という事がわかります。

 

それでは、これの簡単な解消方法です。

※この方法はContact Form 7のアップデート時にjsファイルが上書きされる可能性があるため、正しくは以下のページのような対応を行うべきです。ただ、単純にページ切替程度にWPMLを利用していて、ややこしい作りにするとクライアントが使いこなせない!というようなケースでは、この対応でとりあえず解消してしまう、というのも手です。(ご利用は計画的に)

Using Contact Form 7 with WPML – WPML
https://wpml.org/documentation/plugins-compatibility/using-contact-form-7-with-wpml/

 

さて、上記方法ではクライアントの要件を満たせない、ということが確認できたら、jsファイルをいじってしまいましょう。

wp-content/plugins/contact-form-7/includes/js/scripts.js

上記ファイルの335行目あたり(バージョンによって異なります)

$.ajax( {
type: ‘POST’,
url: wpcf7.apiSettings.getRoute(
‘/contact-forms/’ + wpcf7.getId( $form ) + ‘/feedback’ ),
data: formData,
dataType: ‘json’,
processData: false,
contentType: false
} ).done( function( data, status, xhr ) {

を、以下のように変更します。

var url = wpcf7.apiSettings.getRoute(‘/contact-forms/’ + wpcf7.getId( $form ) + ‘/feedback’ );
url = url.replace( /\?lang[^\/]+\//g,”);
$.ajax( {
type: ‘POST’,
  url:url,
data: formData,
dataType: ‘json’,
processData: false,
contentType: false
} ).done( function( data, status, xhr ) {

簡単ですね。

やっていることは、正規表現「\?lang[^\/]+\/」でひっかけて、「?lang=*****/」を削除しているだけです。

これで、送信処理が正常に動作するようになるので、みなさんも試してみてくださいね。

もちろん、Contact Form 7のアップデートには要注意です!!

 

それでは、またお会いしましょう!