サポート » 使い方全般 » コンタクトフォーム7について

  • 解決済 wpwp5679

    (@wpwp5679)


    コンタクトフォーム7を使用しています。
    そのフォームで電話番号を入力する項目を作成したのですが、数字以外も入力できてしまいます。
    送信時にエラーとして再入力を求めるようにはなっていますが、初めから数字のみしか入力できないようにしたいです。

    また、初めの数字が何の数字かによって問い合わせできるかどうかもしたいです。

    0120の人は送信(問い合わせ)できない
    それ以外の人は送信(問い合わせ)できる
    問い合わせできない人は、別のフォームに移動できるようにしたいです。

    よろしくお願いいたします。

15件の返信を表示中 - 1 - 15件目 (全28件中)
  • wpwp5679さん、こんにちは。

    Contactform7のバリデーションを追加する方法については以下のフォーラムの回答が参考になると思います。

    Contact Form 7のテキストエリアに同一の値を入力したらエラーメッセージを出したい

    ご参考になれば。

    トピック投稿者 wpwp5679

    (@wpwp5679)

    確認したのですが、ソースコードは調べたらなんとなくわかったような気がするのですが、
    実際の使用方法がよくわかりませんでした。
    どうしたらフォームに反映できますか?

    トピック投稿者 wpwp5679

    (@wpwp5679)

    shokun0803さん、回答ありがとうございます。
    ためしに以下のように記述したのですが、反映されてないようです。
    タグの名前はcouponになっています。

    <?php
    /**
    * contact-form-7でバリデーションを追加
    */
    add_filter('wpcf7_validate', 'wpcf7_validate_post', 11, 2);
    function wpcf7_validate_post($result,$tag){
    //$tag = new WPCF7_Shortcode($tag);
    $name = $tag['coupon'];
    //$value = isset($_POST[$name]) ? trim(wp_unslash(strtr((string) $_POST[$name], "\n", " "))) : "";
    //$nameはContactForm7のフォーム要素(input等)のname="この部分"
    //$valueはユーザーが入力した(選択した)値
    
    //ここから一つ一つのフォーム項目にバリデーションを追加します。
    if ($name == 'coupon') {
    //your-emailという名前のフォームに対して
    $coupon = (int) $_POST[$name];
    if ( preg_match('/^(8|9)[0-9]*$/',$coupon )) {
      $result->invalidate( $name, 'クーポン番号が間違っているため送信できません。' );
    }
    //if(!この部分はPHPで指定)は指定したい条件に当てはまらない(!)場合は
    }
    //ここまでが一つのフォーム項目に対して適用させるかたまり。
    return $result;
    }
    //最後にこの部分が来るようにする。
    ?>

    もし、
    [tel* coupon] </label>
    に対するチェックを追加したいのであれば、

    下記のようになります。
    ポイントは3点
    1. wpcf7_validate_タグ名(今回は、tel* なので、wpcf7_validate_tel*
    *wpcf7_validateのように全部に対して考えることもできますが、そうすると制御しないといけない部分が増えるので、ピンポイントで指定のほうが楽です。

    2. タグに対する名前(<input type=”tel” name=”****” の ****の部分は、$tag[‘name’] で取得する。それが couponだったらというチェックにする

    3. preg_match のところですが、一致しない場合に「間違っているために送信出来ません」というエラーを出す構造だと思います。正規表現内をみると、事前に intでキャストしているので、先頭が 8, 9 あるいは 08, 09かどうかのチェックをしています。そのため、そうじゃない場合にエラーにする必要があると思います。

    add_filter('wpcf7_validate_tel*', 'wpcf7_validate_post', 20, 2);
    function wpcf7_validate_post($result,$tag){
    	$name = $tag['name'];
    
    	//ここから一つ一つのフォーム項目にバリデーションを追加します。
    	if ($name == 'coupon') {
     		//your-emailという名前のフォームに対して
     		$coupon = (int) $_POST[$name];
     		if (  ! preg_match('/^(8|9)[0-9]*$/',$coupon )) {
      			$result->invalidate( $tag, 'クーポン番号が間違っているため送信できません。' );
     		}
     		//if(!この部分はPHPで指定)は指定したい条件に当てはまらない(!)場合は
     	}
    	//ここまでが一つのフォーム項目に対して適用させるかたまり。
    	return $result;
    }
    //最後にこの部分が来るようにする。
    
    • この返信は2年、 5ヶ月前にkimipoohが編集しました。
    トピック投稿者 wpwp5679

    (@wpwp5679)

    kimipooh さん 回答ありがとうございます。

    教えて頂いたポイントを踏まえましたら、動作いたしました。
    しかし、実際使用しようとしていた正規表現を入力すると、何を入力してもエラーメッセージが出るようになってしまいました。

    使用したいルール
    4か9で始まる12文字の数字 (半角or全角スペース 4か9で始まる12文字の数字 半角or全角スペース 4か9で始まる12文字の数字)
    をルールとして設けたいです。
    ※1、()内はもしあれば記入という形にしたいです。
    ※2、※1は途中で必要と気が付いたので、下記のコードには入っていないです。

    正規表現の部分は以下のように入力したのですが、うまくいきませんでした。何が間違ってますでしょうか。
    コード
    if ( ! preg_match(‘/^(4|9)\d{11}( | )(4|9)\d{11}( | )(4|9)\d{11}$/’,$coupon )) {
    $result->invalidate( $tag, ‘クーポン番号が間違っているため送信できません。’ );
    }

    また、add_filter(‘wpcf7_validate_tel*’, ‘wpcf7_validate_post’, 20, 2);
    の20と2は何の数字なのでしょうか。

    • この返信は2年、 5ヶ月前にwpwp5679が編集しました。

    wpwp5679さん、こんにちは。

    正規表現チェッカーにかけてみましたが、なぜか\d{11}が通らなかったので、以下のようにしてみたら正規表現チェッカーは通過しました。
    ^(4|9)\d{11,11}( | )(4|9)\d{11,11}( | )(4|9)\d{11,11}$
    ちょっと理由は分かっていませんorz

    PS:いや、もう一度やったらチェッカーも通りましたね…
    ^(4|9)\d{11}( | )(4|9)\d{11}( | )(4|9)\d{11}$
    飛んでくるデータの末尾に改行文字や空白等が含まれていないか確認してみると良いかもしれません。

    ご参考になれば。

    • この返信は2年、 5ヶ月前にshokun0803が編集しました。

    その場合には、tel は電話番号と認識しないものは駄目になるので、
    text で指定する必要がありますね。
    それは後でコードを掲載するとして、
    もし、
    1. 先頭が4,9のいずれか
    2. 桁数が12桁(半角、全角スペースも1桁とカウントする)
    のであれば

    /^[49][0-9\s ]{11}$/u

    が正規表現になります。\s の右側の空白は全角空白です。
    半角、全角はあくまで入る可能性があるが、数字以外カウントしないということであれば
    正規表現でやるのは面倒そうなので、全角と半角空白については正規表現で判定する前に str_replace を使って消しておきます。
    つまり 400 232 111 222 となっていた場合、判定としては 400232111222 にしてから行うということです。

    $coupon = $_POST[$name];
    $coupon_fix = str_replace(“ ”, “”, str_replace(” “, “”, $coupon) );
    if ( ! preg_match(‘/^(4|9)[0-9]{11}$/u’, $coupon_fix) ) {

    上記の場合のコードの場合には (int) によるキャストは外しておく必要があります。

    また、
    [text* coupon]
    のように tel* ではなく text* を指定した上で、 text* に対して条件設定をする必要があります。

    add_filter('wpcf7_validate_text*', 'wpcf7_validate_post', 20, 2);
    function wpcf7_validate_post($result,$tag){
    	$name = $tag['name'];
    
    	//ここから一つ一つのフォーム項目にバリデーションを追加します。
    	if ($name == 'coupon') {
     		//your-emailという名前のフォームに対して
     		$coupon =  $_POST[$name];
     		$coupon_fix = str_replace(" ", "", str_replace(" ", "", $coupon) );
     		if ( ! preg_match('/^(4|9)[0-9]{11}$/u', $coupon_fix) ) {
      			$result->invalidate( $tag, 'クーポン番号が間違っているため送信できません。' );
     		}
     		//if(!この部分はPHPで指定)は指定したい条件に当てはまらない(!)場合は
     	}
    	//ここまでが一つのフォーム項目に対して適用させるかたまり。
    	return $result;
    }
    //最後にこの部分が来るようにする。
    

    また、add_filter(‘wpcf7_validate_tel*’, ‘wpcf7_validate_post’, 20, 2);
    の20と2は何の数字なのでしょうか。

    こちらについては、20 は実行される優先度です。まぁ12でも20でもあまり変わらないので気にする必要はありませんが、デフォルトが10なので、それより大きい数字にしておくことが一般的です。10は Contact Form 7のプラグイン本体で利用されている可能性が高く、それより速く処理するとややこしいことになるためです。

    2 のほうは、関数の引数です。
    wpcf7_validate_text* はフィルターフックとして、Contact Form 7側で用意されていますが、そちらで利用できる引数が2だとよいうことです。
    つまり、
    function wpcf7_validate_post($result,$tag){
    上記 function の () の個数が $resultと$tagで2つの引数があるからということです。
    参考:https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_filter

    このあたりは、今回のような add_filterを使ってカスタマイズするときには、カスタマイズ対象となるテーマやプラグイン側が指定するので、それに従うということになります。

    このあたりは PHPプログラミング等の話になってくるので、wpcf7_validate については、2 に設定されているという感じになります。実際どのように設定されているかは、Contact Form 7のソースをチェックする必要があります。

    • この返信は2年、 5ヶ月前にkimipoohが編集しました。
    トピック投稿者 wpwp5679

    (@wpwp5679)

    shokun0803さん kimipoohさん 回答ありがとうございます。

    条件としましては
    条件1. 先頭が4,9のいずれか
    条件2. 先頭の4,9を抜いて桁数が11桁
    条件3. 条件1と2が最大3回繰り返す可能性があります。(繰り返した場合は、半角または全角スペースが入ります)
    となります。

    欲しい結果としましては、
    例1:412345678901 912345678902 412345678903
    例2:412345678901 912345678902
    例3:412345678901
    のようなものです。
    以下のようなものはエラーメッセージを表示できるようにしたいです。
    例4:412345678901 912345678902 812345678903
    例5:412345678901912345678902
    例6:412-345678901
    エラーになる理由ですが、
    例4の場合は、3つ目の数字の先頭が8になっているから
    例5の場合は、13桁目にスペースがないから
    例6の場合は、数字とスペース以外のものが入っているから
    です。
    現状、例2と例6がエラーになります。

    今まで教わったことや、調べたことを踏まえて、以下のように修正したのですが、うまくいきませんでした。

    if( ! preg_match_all(‘/^([49][0-9]{11,11})|([49][0-9]{11,11}( | )[49][0-9]{11,11})|([49][0-9]{11,11}( | )[49][0-9]{11,11}( | )[49][0-9]{11,11})$/u’,$coupon ))

    上記の条件3にもあるように繰り返されてもいいように3つ分の判定を|で分けて判定しようとしました。
    しかし、4か9の判定は1つ目の数字ブロックしかされないようでした。(上記例4)
    また、全角スペースでもはじかれてしまいます。

    さらに、正規表現チェッカーで試した結果と自身の環境で試した場合、結果が異なることがありました。
    おそらく環境の違いだと思います…

    また、電話番号のハイフンなしの正規表現を追加したいのですが、同じtel属性を追加できますか?

    • この返信は2年、 5ヶ月前にwpwp5679が編集しました。

    なるほど。

    であれば正規表現ではちょっと大変そうで思いつかないので、
    1. 全角スペースを半角スペースに置換
    2. 半角スペースごとに分けて配列に保存する
    3. もし配列の要素数が3を超えた(つまり 412345678901 412345678901 412345678901 412345678901などになった場合)場合には即座にエラー。
    4. 配列の要素数が3以下の場合は、配列ごとに
    条件1. 先頭が4,9のいずれか
    条件2. 先頭の4,9を抜いて桁数が11桁
    の条件を正規表現でチェックする

    ということで実現できるかと思います。
    コードは下記のようになるでしょう。

    add_filter('wpcf7_validate_text*', 'wpcf7_validate_post', 20, 2);
    function wpcf7_validate_post($result,$tag){
    	$name = $tag['name'];
    
    	//ここから一つ一つのフォーム項目にバリデーションを追加します。
    	if ($name == 'coupon') {
     		//your-emailという名前のフォームに対して
     		$coupon =  $_POST[$name];
     		$coupon_fix = str_replace(" ", " ", $coupon); // 全角スペースを半角スペースへ置換)
     		$coupon_fix_list = explode(" ", $coupon_fix); // 半角スペースで分けて配列に保存
     		/* 以上の時点で、
     		   412345678901 のみ = $coupon_fix_list[0]に保存
     		   412345678901 912345678902 412345678903 だと
     		      $coupon_fix_list = array(
     		        412345678901, 912345678902, 412345678903);
     		   のほうに配列に保存されている。したがってループで1つずつチェックする
    		*/
    		if(count($coupon_fix_list) > 3){ // 最大は3つまでなので、配列が3を超えたら即座にエラーとする
      					$result->invalidate( $tag, 'クーポン番号が間違っているため送信できません。' );
    		}else{
    			foreach($coupon_fix_list as $value){
     				if ( ! (preg_match('/^(4|9)[0-9]{11}$/u', $value))){
      					$result->invalidate( $tag, 'クーポン番号が間違っているため送信できません。' );
     				}
     			}
     		}
     	}
    	//ここまでが一つのフォーム項目に対して適用させるかたまり。
    	return $result;
    }
    //最後にこの部分が来るようにする。
    • この返信は2年、 5ヶ月前にkimipoohが編集しました。

    /^([49][0-9]{11}[ | ]?){1,3}$/u
    こんな感じではどうでしょうか。

    おおー ishitaka さんの正規表現がよさそうですね!
    私ではちょっと思いつかなかった…

    tel属性にすると既存のルールも有効になってしまうはず。
    つまりは 数字とハイフンなど、電話番号として認識する Contact Form 7側のルールが適用されてしまうので、駄目のように思います。
    あくまでゆるい条件のもとで、条件を追加するというような感じになるかと思います。

    正規表現チェッカーは
    http://okumocchi.jp/php/re.php
    にあるように、PHP専用のものをつかうとよいかなと思います。

    トピック投稿者 wpwp5679

    (@wpwp5679)

    <?php
    	add_filter('wpcf7_validate_tel*', 'wpcf7_validate_post', 20, 2);
    	function wpcf7_validate_post($result,$tag){
    		$name = $tag['name'];
    
    	if ($name == 'coupon') {
     		$coupon = (int) $_POST[$name];
         if(  ! preg_match_all('/^([49][0-9]{11}[ | ]?){1,3}$/u',$coupon )){
            $result->invalidate( $tag, 'エラーになりました' );
        }
     	}
    	return $result;		
    	}
    ?>

     の正規表現を使用してみました。

    1.正常に送信できたもの
    412345678901
    412345678901 412345678901
    412345678901 412345678901 412345678901
    912345678901
    912345678901 912345678901
    912345678901 912345678901 912345678901

    2.正常にエラーになったもの
    812345678901
    4123456789-01
    4123456789ー01

    3.エラーになったて欲しくないがエラーになったもの
    全角スペースが入る

    4.エラーになって欲しいがならなかったもの
    412345678901 812345678901
    412345678901 412345678901 812345678901

    のような状況になっています。

    上記の3と4はなぜ起こってしまうのでしょうか。

    $coupon = (int) $_POST[$name];

    整数へキャスト (int) しているからではないでしょうか。

    トピック投稿者 wpwp5679

    (@wpwp5679)

    たしかに全角を入力できるようにするにはint型ではなくstr型にする必要がありそうですね。
    その場合は
    add_filter(‘wpcf7_validate_tel*’ ではなく
    add_filter(‘wpcf7_validate_text*’ にも変更の必要がありますかね?

    しかし
    4.エラーになって欲しいがならなかったもの
    412345678901 812345678901
    412345678901 412345678901 812345678901
    の部分が謎のままです。

15件の返信を表示中 - 1 - 15件目 (全28件中)
  • トピック「コンタクトフォーム7について」には新たに返信することはできません。