コンタクトフォーム7について
-
PHP の整数については下記ページをご覧ください。
https://www.php.net/manual/ja/language.types.integer.php(int)’412345678901 812345678901’、
(int)’412345678901 412345678901 812345678901′
は、ともに412345678901となります。それは ishitakaさんがご指摘の通り、 文字列を int 型に変換しているからです。
実際に$str = “412345678901 412345678901 812345678901”;
echo (int)$str;とすると、
412345678901
という値になります。
参考:https://www.php.net/manual/ja/language.types.type-juggling.phpつまり先頭の数字しか、数値に変換されていません。
したがってエラーにならないということです。$coupon = (int) $_POST[$name]; から
$coupon = $_POST[$name]; に変更したら
以下の3と4は解決しました。intなどは必ずしも必要というわけではないのですね。3.エラーになったて欲しくないがエラーになったもの
全角スペースが入る4.エラーになって欲しいがならなかったもの
412345678901 812345678901
412345678901 412345678901 812345678901また、新たなことに気が付きました。
現状、以下の正規表現で検証しているのですが、
/^([49][0-9]{11}[ | ]?){1,3}$/u
この正規表現ではスペースを含まない場合も送信できてしまいます。
1つ目と2つ目の間や2つ目と3つ目の間は必ずスペースが欲しいです。
1つ目のみ や 2つ目や3つ目の終わりは必要ないです。さらに、現状にcouponとは別の項目で条件を追加したいときはどうしたらいいでしょうか。
電話番号ハイフンなしの条件を追加したいです。/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u
だったらどうでしょうか。
1. 412345678901 の最初の判定は個別にする
2. 2つ目以降が存在するなら、先頭は半角 or 全角スペースからスタートする判定にするという手法です。
さらに、現状にcouponとは別の項目で条件を追加したいときはどうしたらいいでしょうか。
if ($name == ‘coupon’) {
これが、[text* coupon] のときの判定です。
text* を使っている限り、
[text* coupon2]ならその条件を増やしていくことになります。
このあたりは PHPプログラミングの範疇になってくるので、やりたいことが増えれば増えるほど、それに沿ったプログラミングが必要になります。
text* 以外であれば、そのために別に準備が必要です。つまり下記のようにif の条件文についてそれ以外でもしという else if をつかうことになるでしょう。
<?php add_filter('wpcf7_validate_text*', 'wpcf7_validate_post', 20, 2); function wpcf7_validate_post($result,$tag){ $name = $tag['name']; if ($name == 'coupon') { $coupon = $_POST[$name]; if( ! preg_match_all('/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u',$coupon )){ $result->invalidate( $tag, 'エラーになりました' ); } }else if($name == 'coupon2') { $coupon = $_POST[$name]; // ここに駄目な条件を書いて、そのときにエラーになるようにする } return $result; } ?>
2番目の空白も必須ということなので、こんな感じではどうでしょうか。
if ( ! preg_match( '/^([49][0-9]{11}[ | ]){1,3}$/u', trim( $coupon, ' ' ) . ' ' ) ) {
/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u
なるほど。2つに分ければよかったのですね。text* を使っている限り ということは
textやtel*、telなどはadd_filter(‘wpcf7_validate_○○○’
を作成しなければいけないということでしょうか。
※○○○はtextやtel*、telなど使用しているものに合わせる。教えて頂いたコードに以下のように追加してみたのですが、
送信ボタンを押した後ずっと送信待ち状態になってしまいます。
「エラー」も「送信できました。」なども何も出ません。※else if後の駄目な条件は送信できなかったのでコメントアウトしてあります。
※else if後の駄目な条件は電話番号なのですが、種類が多いのでとりあえず
「00000000000」(11桁)「0000000000」(10桁)「0123456789」(10桁)の
3種類だけエラーになるようにしたいです。
もしかしたらいつかは正規表現を使用するかもしれないので、
動作確認として1つ目の条件をそのまま使ってます。<?php add_filter('wpcf7_validate_text*', 'wpcf7_validate_post', 20, 2); function wpcf7_validate_post($result,$tag){ $name = $tag['name']; if ($name == 'coupon') { $coupon = $_POST[$name]; if( ! preg_match_all('/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u',$coupon )){ $result->invalidate( $tag, 'エラーになります。1' ); } }else if($name == 'coupon2') { $coupon = $_POST[$name]; //if($coupon = '0000000000') // if( ! preg_match_all('/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u',$coupon )){ //$result->invalidate( $tag, 'エラーになります。2' ); //ここに駄目な条件を書いて、そのときにエラーになるようにする // } return $result; } } ?>
頂いた表現のtrim( $coupon, ‘ ’ ) . ‘ ‘ ) ) が分からなかったので調べたのですが、trim関数は
文字列の先頭・末尾にある空白(半角スペース、Tab)を除去する関数のようでした。
どういう意味になりますでしょうか。>textやtel*、telなどはadd_filter(‘wpcf7_validate_○○○’
を作成しなければいけないということでしょうか。このやり方をつかっている場合には、そうなるということです。
発想の転換で、全部 text* にして、条件は全部自前で書くという手もあります。
結局は何をどうしたいのかによって変わります。したがって最初に必要なのはシステム設計(仕様)です。
それを決めた上で、どうプログラミングしていくかが決まります。またコードを書く時には、インデント(字下げ)を使って、ブロックごとに整理してみてください。
今回のケースでは、{} (ブロック)で整理すると、 else if($name == ‘coupon2’) { の閉じカッコ(})が、return $result; あとに来てしまっています。wpcf7_validate_postの関数自体が return を要求しているので、 それがされない条件があるとそこでエラーになって止まってしまうということになっているようにみえます。
<?php add_filter('wpcf7_validate_text*', 'wpcf7_validate_post', 20, 2); function wpcf7_validate_post($result,$tag){ $name = $tag['name']; if ($name == 'coupon') { $coupon = $_POST[$name]; if( ! preg_match_all('/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u',$coupon )){ $result->invalidate( $tag, 'エラーになります。1' ); } }else if($name == 'coupon2') { $coupon = $_POST[$name]; //if($coupon = '0000000000') // if( ! preg_match_all('/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u',$coupon )){ //$result->invalidate( $tag, 'エラーになります。2' ); //ここに駄目な条件を書いて、そのときにエラーになるようにする //} } return $result; } ?>
つまり、人間の目からみて、たとえば if の範囲がどこまでなのかを視覚的にわかりやすくするのがインデントです。このあたりはプログラミングの書籍などに掲載されていると思いますが、意識されるのがよいかと思います。if とか else if とか漠然としかわかっていないのであれば、初学者向けのPHPプログラミングの書籍等を一通り読んで見るのも良いと思います(何がオススメかまではわかりませんが)。
文字列の先頭・末尾にある空白(半角スペース、Tab)を除去する関数のようでした。
どういう意味になりますでしょうか。trim() は念のためで、文字列の末尾に空白を一つ挿入するのが目的です。
末尾に空白を挿入することで、下記の正規表現に合わせています。
/^([49][0-9]{11}[ | ]){1,3}$/u
なるほど。わかりました。
インデントは最後でいいかなと思っていたのですが、その甘えがミスにつながってしました。
ありがとうございます。今後気を付けます。trim() は念のためで、文字列の末尾に空白を一つ挿入するのが目的です。
末尾に空白を挿入することで、下記の正規表現に合わせています。
/^([49][0-9]{11}[ | ]){1,3}$/u↑
なるほど。そういうことだったのですね。
ありがとうございます。
- トピック「コンタクトフォーム7について」には新たに返信することはできません。