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; }
これで、パソコンと携帯からお問い合わせフォームを利用してみたが、どちらも文字化けせずにメールが届いた!後輩も喜んで一件落着!!
ちょうど携帯版サイトからcform入力すると文字化けする症状に悩んでおり、
こちらの記事が大変役に立ちました!
ありがとうございます。
お役にたったようで何よりです。
プラグインで文字化けすると、なかなか対処が難しいですからね。
Pingback: お問い合わせフォームの携帯対応 | setting_web
こんにちは。
携帯での文字化けで、こちらの記事がすごく参考になりました。ありがとうございます。
そこで、つまづいた点があったのでお聞きしたかったのですが。
今の現状は、au以外の環境ではうまく動くようになりました。しかし、auからの問い合わせのみ、文字が化けてしまうんです。
そこで、
// au でメール送信できないため、enctypeを除去
を組み込んでみるのですが、うまく動かなくなってしまうんです。
enctypeをトルと、それ以降が表示されなくなりphpが返ってきてくれなくなってしまいます。
どうにか、助言をいただけるととても助かります。どうかよろしくお願いします!
>とみーさん
それ以降が表示されないということは、
1.ダブルクォーテーションなどが対になっていない
2.タグが閉じられていない
3.phpエラーが起きている
だと思いますので、ブラウザで表示後に
ひとまずはページのソースを表示してみて、
ソース上は出ているのであれば1か2、
何も出ていないのであれば3です。
php.iniの設定がいじられるのであれば、display_errorsを修正してエラーメッセージが画面に出るようにしてみてください。
でないとちょっとわかりません(^^;)
もう長いことWordPressいじってないんで…。
早速ありがとうございます!
いろいろいじってみまして、
それ以降が表示しないというのは解決できました。
ただ、auからのみエラーが出て、
enctypeを外すと文字が消えて送信できない。
enctypeを入れると文字化けする。
なにか、原因など思い当たったりしませんでしょうか?
何か糸口でも分かるといいんですが…
本当にすいません、お手数かけます…
auはenctypeを理解できないのに無理矢理理解しようとして文字化けするので、
なくすだけでよいというのが外部情報なんですけどね…。
エラーとだけ言われても、正直わからんっす(T_T)
(私がcforms作ってるわけじゃないし…。
あともうauユーザではなくなってるので…。)
エラーメッセージが出ているんなら、
それを教えてもらえませんか?
そうすればソースコードは読めるので
助言はできるかもしれません。
長くてもよいので貼ってみて下さい。お願いします。
そうなんですよねー
どこを見てもenctypeなくすと、うまくいきました。と書いてはあるけれどうまくいかなくて。(T^T)
特にエラー文が出ている訳では無いのですよ。
・enctypeをなくした場合
auだけ入れたはずのテキストが空になってしまい送信できない。(文字が化けて認識できなくて空になってるのでしょうか。)
あと一歩で解決できそうで、できないので、
安心して夜も眠れません。
ちなみに、enctype以外の方法ってあったりするんでしょかね。
頼りっぱなしで、申し訳ないです。
もし開発環境が私からも見えるようでしたら、
時間のあるときに一度アクセスしてみますが、
閉じた環境でテストしてるんでしょうか?
よかったら教えてください。お力になりたいので。
また、値の中身をみるために、return $POSTdata;の前にprint_r($POSTdata);とか入れて、値がどうなっているか試してみるのもいいかもしれません。ただ、au端末で見ると、xhtmlヘッダが出る前に出力されるだろうから見れないので、ログに出力するか、FireMobileSumilatorとかで試してみてはどうでしょうか?
助けていただけるなら環境見ていただいてもかまわないのですが、ここで公開するのは気が引けてしまいます(^_^;)
値の中身を見るため、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] => 送 信 )
と出ました。
なにか、手がかりになりますでしょうか。
別にここに晒さなくても、
メールか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ありのバージョンだったら、なしでも試してもらっていいですか?
そうですね、メールで送らせていただきました!
メールにて返事させてもらいました。
>とみーさん
Twitterで、Ktai-styleを作成されている方から、
「cformsは非推奨、Contact form 7は使えます」
というツイートを頂きました。
こちらを確認してもらったほうがよいかもしれません。
いろいろ試してみたのですが、
例の%うんたらが直りません…orz
データベースもUTF-8みたいなんですけどね。(;_;)
Contact form 7は、最初使っていたのですが、画像添付をさせたくて。
そうなると、メールヘッダーでMIME タイプが image/jpeg になるよう書き換えなくてはならないようで…(T_ゝT)
>とみーさん
ようやく読めてきました・・・。
まず、ガラケーでは、フォームでファイルを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; ?>
とでもすればいいんではないかと思います。
返事がないので、どうなったかわかりませんが、
とみーさんの問題が解決していることを願っています。
解決できなかったため、cformsプラグインを使わず、全キャリア共通で使えるプログラムを作ることで解決しました。
いろいろアドバイス頂いたのに活かせず申し訳ないです。
ありがとうございました∠(^ロ^)
Pingback: やっぱり楽しいWordPress
Pingback: wordpress複雑なメールフォームを作る – cformⅡ -|zamuu::BLOG
大変助かりました。ありがとうございます。
ずっと悩んでて、半年もここで助けられたのですが、今回は同じようにcform2 に手を加えるも携帯からは何をやっても上手く行きませんでした。バージョンもそれぞれ変わってるので、色々試しましたが…携帯からのアクセスからの場合…のis-ktai の判別をパスして、強制的にutf-8 に全部変更する事で、いまの所上手く行っています。