WordPress: cforms2 & Ktai-style

WordPressのプラグインのcforms2とKtai-Styleの併せ技一本を狙う。
お客さんが携帯サイトをやっていて、携帯からのお問い合わせに対応したいと。しかし、携帯からのお問い合わせで送信されてくるメールが文字化けするんで助けてください!と後輩から頼まれたというのが経緯。

WordPressのフォーラムより、
携帯からの場合は文字コード変換処理を入れるとかの対応が必要だと思います (Ktai Style の is_ktai() 関数を使えばいけそう)。
という情報を手に入れたので、cforms2のソースコードに手をいれて、携帯の場合の処理を追加することにした。
ちなみに、cformsのバージョンは11.0です。

/wp-content/plugins/cforms/lib_validate.phpの先頭に追加。

// 携帯のアクセスの場合のみ、検証の前にUTF-8にエンコードしてしまう。
if(function_exists('is_ktai')){
  if(is_ktai()){
    foreach($_REQUEST as $key => $value){
      $_REQUEST[$key] = mb_convert_encoding($value, 'utf-8', 'auto');
    }
  }
}
// 以下略

次に、/wp-content/plugins/cforms/lib_email.phpを編集。
@mailを@wp_mailに全部変更する。
ここは@mailで検索すればいいのでソース省略。

次に、/wp-content/plugins/cforms/cforms.phpの354行目あたりを修正。

### start with form tag
// $content .= $ntt . '<form enctype="multipart/form-data" action="' . $action . '" method="post" class="cform'.( $cformsSettings['form'.$no]['cforms'.$no.'_dontclear']?' cfnoreset':'' ).'" id="cforms'.$no.'form">' . $nl;
// au でメール送信できないため、enctypeを除去
$content .= $ntt . '<form action="' . $action . '" method="post" class="cform'.( $cformsSettings['form'.$no]['cforms'.$no.'_dontclear']?' cfnoreset':'' ).'" id="cforms'.$no.'form">' . $nl;

これで、開発環境のほうは、メールの文字コードがutf-8で送信できるようになり、携帯からのお問い合わせにも文字化けしなくなった。しなくなったのだが、、、。

本番環境(xreaのcoreserver)で文字化けが続いた。
件名が文字化けするのだ。件名に『=?utf-8?B?44C(略)』と表示された。

調査すること3時間。遂に解決!!原因はWP Multibyte Patchの設定だった。
utf-8でエンコーディングされている件名をiso-2022-jpで解釈してるために化けているみたいだった。

/wp-content/plugins/wp-multibyte-patch/wpmp-config.phpを修正。
ない場合は、wpmp-config-sample.phpをコピーしてwpmp-config.phpを作成して修正。

// wp_mailに対してのパッチを外す
$wpmp_conf['patch_wp_mail'] = false;

ちなみに、上記の設定をtrueにしたままパッチプラグインの/ext/ja/config.phpでUTF-8を使うように指定したら、何故かさらに文字化けた。本文までiso-2022-jpで解釈されてしまった。UTF-8って指定したのに!!このあたりはまだよくわかっていない箇所なので、もっといい設定があるのかもしれない。

最後に、cformsのmy-functions.phpを修正する。
携帯でのアクセスの場合のみ、検証処理後に出力に用いられるデータをutf-8にエンコードしておく。

// 値の検証後、出力前にコールされる関数
function my_cforms_filter($POSTdata){
	if(function_exists('is_ktai')){
		if(is_ktai()){
			foreach($POSTdata as $key => $value){
				$POSTdata[$key] = mb_convert_encoding($value, 'utf-8', 'auto');
			}
		}
	}
	return $POSTdata;
}

これで、パソコンと携帯からお問い合わせフォームを利用してみたが、どちらも文字化けせずにメールが届いた!後輩も喜んで一件落着!!


カテゴリー PHP, WordPress | タグ     | パーマリンク

コメント・トラックバック一覧

  1. ちょうど携帯版サイトからcform入力すると文字化けする症状に悩んでおり、
    こちらの記事が大変役に立ちました!

    ありがとうございます。

  2. お役にたったようで何よりです。
    プラグインで文字化けすると、なかなか対処が難しいですからね。

  3. Pingback: お問い合わせフォームの携帯対応 | setting_web

  4. とみー says:

    こんにちは。
    携帯での文字化けで、こちらの記事がすごく参考になりました。ありがとうございます。
    そこで、つまづいた点があったのでお聞きしたかったのですが。

    今の現状は、au以外の環境ではうまく動くようになりました。しかし、auからの問い合わせのみ、文字が化けてしまうんです。
    そこで、

    // au でメール送信できないため、enctypeを除去

    を組み込んでみるのですが、うまく動かなくなってしまうんです。
    enctypeをトルと、それ以降が表示されなくなりphpが返ってきてくれなくなってしまいます。

    どうにか、助言をいただけるととても助かります。どうかよろしくお願いします!

  5. >とみーさん

    それ以降が表示されないということは、

    1.ダブルクォーテーションなどが対になっていない
    2.タグが閉じられていない
    3.phpエラーが起きている

    だと思いますので、ブラウザで表示後に
    ひとまずはページのソースを表示してみて、
    ソース上は出ているのであれば1か2、
    何も出ていないのであれば3です。

    php.iniの設定がいじられるのであれば、display_errorsを修正してエラーメッセージが画面に出るようにしてみてください。

    でないとちょっとわかりません(^^;)
    もう長いことWordPressいじってないんで…。

  6. とみー says:

    早速ありがとうございます!
    いろいろいじってみまして、

    それ以降が表示しないというのは解決できました。

    ただ、auからのみエラーが出て、
    enctypeを外すと文字が消えて送信できない。
    enctypeを入れると文字化けする。

    なにか、原因など思い当たったりしませんでしょうか?
    何か糸口でも分かるといいんですが…
    本当にすいません、お手数かけます…

  7. auはenctypeを理解できないのに無理矢理理解しようとして文字化けするので、
    なくすだけでよいというのが外部情報なんですけどね…。

    エラーとだけ言われても、正直わからんっす(T_T)
    (私がcforms作ってるわけじゃないし…。
     あともうauユーザではなくなってるので…。)

    エラーメッセージが出ているんなら、
    それを教えてもらえませんか?
    そうすればソースコードは読めるので
    助言はできるかもしれません。

    長くてもよいので貼ってみて下さい。お願いします。

  8. とみー says:

    そうなんですよねー
    どこを見てもenctypeなくすと、うまくいきました。と書いてはあるけれどうまくいかなくて。(T^T)

    特にエラー文が出ている訳では無いのですよ。

    ・enctypeをなくした場合
    auだけ入れたはずのテキストが空になってしまい送信できない。(文字が化けて認識できなくて空になってるのでしょうか。)

    あと一歩で解決できそうで、できないので、
    安心して夜も眠れません。

    ちなみに、enctype以外の方法ってあったりするんでしょかね。

    頼りっぱなしで、申し訳ないです。

  9. もし開発環境が私からも見えるようでしたら、
    時間のあるときに一度アクセスしてみますが、
    閉じた環境でテストしてるんでしょうか?

    よかったら教えてください。お力になりたいので。

    また、値の中身をみるために、return $POSTdata;の前にprint_r($POSTdata);とか入れて、値がどうなっているか試してみるのもいいかもしれません。ただ、au端末で見ると、xhtmlヘッダが出る前に出力されるだろうから見れないので、ログに出力するか、FireMobileSumilatorとかで試してみてはどうでしょうか?

  10. とみー says:

    助けていただけるなら環境見ていただいてもかまわないのですが、ここで公開するのは気が引けてしまいます(^_^;)

    値の中身を見るため、print_r($POSTdata);を入れてみました。すると、

    Array ( [%e3%82%bf%e3%82%a4%e3%83%88%e3%83%ab] => テスト [%e6%9c%ac%e6%96%87] => テスト [comment_post_ID] => 157 [cforms_pl] => /m_wp_admin_entry.html [cf_working] => %E5%B0%91%E3%80%85%E3%81%8A%E5%BE%85%E3%81%A1%E4%B8%8B%E3%81%95%E3%81%84%E3%80%82 [cf_failure] => %E9%80%81%E4%BF%A1%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%0D%0A%E3%81%8A%E6%89%8B%E6%95%B0%E3%81%A7%E3%81%99%E3%81%8C%E3%80%81%E3%82%82%E3%81%86%E4%B8%80%E5%BA%A6%E3%81%8A%E9%A1%98%E3%81%84%E3%81%97%E3%81%BE%E3%81%99%E3%80%82 [cf_codeerr] => Please%20double-check%20your%20verification%20code. [cf_customerr] => yyn [cf_popup] => nn [sendbutton] => 送 信 )

    と出ました。
    なにか、手がかりになりますでしょうか。

  11. 別にここに晒さなくても、
    メールかtwitterでDMくれたんでいいですよ。
    twitter_idはpatorashです。

    一応、うちがこのブログで書いたやつの開発環境で試してみましたが、$POSTdataをprint_rした結果は以下のようでした。ちなみに当たり前ですが、enctypeなしです。会社の同僚からAU端末貸してもらって試しました。
    環境はWordPress 2.8.4

    Array ( [cf_field_2] => テスト [cf_field_3] => テスト [cf_field_4] => 000000000000 [cf_field_5] => test@example.com [cf_field_6] => 2010/03/10 [cf_field_7] => 10:30 〜 19:00 [cf_field_8] => テスト [cf_working] => [cf_failure] => [cf_codeerr] => [cf_customerr] => [cf_popup] => [sendbutton] => 送信 )

    とみーさんのは連想配列のキーがURLエンコードされてるんじゃないでしょうか?もしくは、ソースのinputタグに付けられているnameがほぼ日本語か…。とみーさんの$POSTdataがenctypeありのバージョンだったら、なしでも試してもらっていいですか?

  12. とみー says:

    そうですね、メールで送らせていただきました!

  13. メールにて返事させてもらいました。

  14. >とみーさん

    Twitterで、Ktai-styleを作成されている方から、
    「cformsは非推奨、Contact form 7は使えます」
    というツイートを頂きました。

    こちらを確認してもらったほうがよいかもしれません。

  15. とみー says:

    いろいろ試してみたのですが、
    例の%うんたらが直りません…orz
    データベースもUTF-8みたいなんですけどね。(;_;)

    Contact form 7は、最初使っていたのですが、画像添付をさせたくて。
    そうなると、メールヘッダーでMIME タイプが image/jpeg になるよう書き換えなくてはならないようで…(T_ゝT)

  16. >とみーさん

    ようやく読めてきました・・・。
    まず、ガラケーでは、フォームでファイルをPOSTすることができません。よって、input type=”file”は使えません。なのに、とみーさんのフォームにはそれがあるのではないでしょうか?

    ちなみにenctypeの指定はtype=”file”がある場合のみ必要なので、デフォルトで付いているのでしょう。が、ケータイからも投稿できるようなフォームだとそれが必要ない(というかできない)から、みなさん(私も含めて)消してるんです。

    ドコモとかは理解できないタグは無視するらしいんですが、auはそうではないのでinput type=”file”を無理矢理処理しようとした結果、urlencodeがかかってキーが化けてるんでしょう、きっと。

    ということで、ケータイからは画像の添付はしないということでよいのでしたら(PCのみで)、enctypeを削除し、input type=”file”のタグの直前で、

    < ?php if(!is_ktai()): // ケータイ以外の場合、enctype付きのフォームタグを出力 ?>
    // PC用のフォーム開始タグ
    < ?php else: ?>
    // ケータイ用のフォーム開始タグ
    < ?php endif; ?>

    …色々とタグが入る

    < ?php if (!is_ktai()): // ケータイ以外の場合、以下を出す ?>
    input type=”file”タグなど
    < ?php endif; ?>

    とでもすればいいんではないかと思います。

  17. 返事がないので、どうなったかわかりませんが、
    とみーさんの問題が解決していることを願っています。

  18. とみー says:

    解決できなかったため、cformsプラグインを使わず、全キャリア共通で使えるプログラムを作ることで解決しました。

    いろいろアドバイス頂いたのに活かせず申し訳ないです。

    ありがとうございました∠(^ロ^)

  19. Pingback: やっぱり楽しいWordPress

  20. Pingback: wordpress複雑なメールフォームを作る – cformⅡ -|zamuu::BLOG

  21. 区長 says:

    大変助かりました。ありがとうございます。
    ずっと悩んでて、半年もここで助けられたのですが、今回は同じようにcform2 に手を加えるも携帯からは何をやっても上手く行きませんでした。バージョンもそれぞれ変わってるので、色々試しましたが…携帯からのアクセスからの場合…のis-ktai の判別をパスして、強制的にutf-8 に全部変更する事で、いまの所上手く行っています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です