contactform7 入力制限について解説

WordPress
taro
taro

お問い合わせページの入力欄に制限をつけたいなぁ
何文字以上とか何文字以下とかできないかな

contactform7というプラグインを使用したお問い合わせページで、
入力制限を作りました。
例えば、何文字以上、何文字以下(文字数制限)、文字数カウント、先頭は○○からなどのバリデーションが作れます。

文字数制限、文字数カウントについて

contactform7の公式ページに載っているやり方です。

文字数制限

  • contactform7のお問い合わせページを開く
  • 編集ページで、[textarea minlength:10 maxlength:140]という感じで書きます。

文字数カウント

  • contactform7のお問い合わせページを開く
  • 編集ページで、[count yourmessage]という感じで書きます。

実際の例

メッセージの下にある数字が[count yourmessage]で表現した場合 
 0からカウント
その下にある数字が[count yourmessage down]で表現した場合 
 最大値から減っていくようにカウント

PHPの正規表現を使って、先頭一致などのバリデーション

次は、難しいですがPHPの正規表現を使ったバリデーションです。

まずは、フックでバリデーションを追加、フォームのnameの取得

/**
* contact-form-7でバリデーションを追加
*/
add_filter('wpcf7_validate_text', 'wpcf7_validate_post', 9, 2);
add_filter('wpcf7_validate_text*', 'wpcf7_validate_post', 9, 2);
function wpcf7_validate_post($result,$tag){
$tag = new WPCF7_FormTag($tag);
$name = $tag->name;
$value = isset($_POST[$name]) ? trim(wp_unslash(strtr((string) $_POST[$name], "\n", " "))) : "";
//$nameはContactForm7のフォーム要素 name="ここ"
//$value 入力した値

name=○○で場合分け(先頭一致)例:いちご○○

if($name === "itigo") {
  if(!preg_match("/^いちご/",$value)) {
  if (method_exists($result, 'invalidate')) {
  $result->invalidate( $tag,"いちご○○を入力してください");
  } else {
  $result['valid'] = false;
  $result['reason'][$name] = 'いちご○○を入力してください';
  }
  }
  }

name=○○で場合分け 例:半角英数字のみ入力可能

if($name === "half") {
  if(!preg_match("/^[a-zA-Z0-9_-]+$/",$value) ) {
  if (method_exists($result, 'invalidate')) {
  $result->invalidate( $tag,"半角英数字を入力してください");
  } else {
  $result['valid'] = false;
  $result['reason'][$name] = '半角英数字を入力してください';
  }
  }
  }
return $result;
}

name=○○で場合分け 例:ハイフンなしの電話番号のみ入力可能

add_filter('wpcf7_validate_tel', 'wpcf7_validate_post', 9, 2);
add_filter('wpcf7_validate_tel*', 'wpcf7_validate_post', 9, 2);
function wpcf7_validate_post($result,$tag){
$tag = new WPCF7_FormTag($tag);
$name = $tag->name;
$value = isset($_POST[$name]) ? trim(wp_unslash(strtr((string) $_POST[$name], "\n", " "))) : "";

if($name === "tel-209") {
  if(!preg_match("/^0\d{9,10}$/",$value) ) {
  if (method_exists($result, 'invalidate')) {
  $result->invalidate( $tag,"ハイフンなしで電話番号を入力してください");
  } else {
  $result['valid'] = false;
  $result['reason'][$name] = 'ハイフンなしで電話番号を入力してください';
  }
  }
  }
return $result;
}

最後のは、[text]ではなく[tel]なので、フックの修正が必要です。

コード解説

  • functions.phpに書いていく
  • フィルターフックで、バリデーションをcontactform7に追加
  • フォームのname部分をとってくる
  • nameが○○のときで場合分け
  • preg_matchで正規表現と一致していない場合は、エラーメッセージを出す
  • 一致している場合は、return

正規表現について

preg_match('/ここに正規表現を書く/')という感じで書いています
preg_matchに関しては、PHPのドキュメンテーションを参考にしてください



まとめ

文字数制限は、[textarea minlength:10 maxlength:140]といった感じでできます。

細かいバリデーションは、PHPの正規表現でほとんど可能かと思います。

間違いなどありましたらコメントよろしくお願いします。

コメント