投稿日:2021年10月2日

今回もContact Form 7 のカスタマイズについて書きたいと思います。
 

今回実装したのは、確認用メールアドレス入力欄と、既存のメールアドレスだったらエラーを表示する処理です。

 確認用メールアドレス入力欄の実装

メールアドレスを入力した際、確認用メールアドレスの再入力を求められる場合があります。
Contact Form 7のデフォルトには、その機能が搭載されておりません。
しかし、contact Form 7 の公式ページ には下記が紹介されています。

add_filter( 'wpcf7_validate_email*', 'custom_email_confirmation_validation_filter', 20, 2 );  
function custom_email_confirmation_validation_filter( $result, $tag ) {
  if ( 'your-email-confirm' == $tag->name ) {
    $your_email = isset( $_POST['your-email'] ) ? trim( $_POST['your-email'] ) : '';
    $your_email_confirm = isset( $_POST['your-email-confirm'] ) ? trim( $_POST['your-email-confirm'] ) : '';  
    if ( $your_email != $your_email_confirm ) {
      $result->invalidate( $tag, "Are you sure this is the correct address?" );
    }
  }  
  return $result;
}

$your_emailの入力値と$your_email_confirmの入力値を比較して、異なっていたらエラーメッセージを表示するロジックです。
7行目、Are you sure this is the correct address? を任意のメッセージに書き換えます。

 

Contact Form 7
Contact Form 7の設定画面です。
メールアドレス確認欄のショートコードに your_email-confirm と記述する必要があります。
 

Contact Form 7
▲結果、異なるメールアドレスを入力をすると、エラーが表示されるようになります。

 既存のメールアドレスだったらエラー処理

上記のバリデートの記述を参考にカスタマイズしてみました。
前回、紹介した  Contact Form 7 をデータベースに保存するPlug-In Contact Form 7 Database Addon – CFDB7
以下は、保存されたデータベースから内容を取得し、すでに登録済みのメールアドレスだったらエラーメッセージを表示する記述です。

add_filter('wpcf7_validate', 'wpdb7_validate_check', 11, 2);
function wpdb7_validate_check($result, $tags){
  global $wpdb;
  $email_name='your-email';
  foreach($tags as $tag){
    $name = $tag['name']; //name属性
    if($name == $email_name){ //name属性が your-email だったら

      // ▼ 入力されたメールアドレス
      $your_email = isset($_POST['your-email']) ? trim( $_POST['your-email']) : '';

      // ▼ CFDB7が作成するデータベース wp_db7_forms からform_valueフィールドを取得
      $wpdb7db = $wpdb->get_results("SELECT form_value FROM wp_db7_forms");

      // ▼ 登録されている数だけ繰り返す
      foreach($wpdb7db as $wpdb7dbs){

        // ▼ シリアル化されているので復元
        $wpdb7dbArray = maybe_unserialize($wpdb7dbs->form_value);

        // ▼ your-emailを取り出す
        $wpdb7dbResult=$wpdb7dbArray["your-email"];

        // ▼ 入力したメールアドレスが既存だったらエラー表示させる
          if(preg_match('/'.$your_email.'/',$wpdb7dbResult)){
            $result->invalidate($name, "このメールアドレスはすでに登録されています。");
          }
      }
    }
  }
  return $result;
}

▲コメントを記載してますが、特筆すべき記述を説明します。
 

データベース

CFDB7はデータベースにwp_db7_formsというテーブルを作ります。
登録した情報をform_valueフィールドに、下記のようにシリアル化 し保存します。
a:4:{s:12:"cfdb7_status";s:6:"unread";s:10:"your-email";s:13:"abc@gmail.com";s:18:"your-email-confirm";s:13:"abc@gmail.com";s:13:"Serial Number";s:3:"171";}
 

// ▼ シリアル化されているので復元
$wpdb7dbArray = maybe_unserialize($wpdb7dbs->form_value);

▲上の記述の19行目が、シリアル化を元に戻す記述になります。
PHPだと unserialize と書きますが、WordPressだと maybe_unserialize と書きます。
WordPress Codex 参照 
 

var_dump で出力すると array(4) { ["cfdb7_status"]=> string(6) "unread" ["your-email"]=> string(13) "abc@gmail.com" ["your-email-confirm"]=> string(13) "abc@gmail.com" ["Serial Number"]=> string(3) "171" } と配列で取得することができます。
 

// ▼ your-emailを取り出す
$wpdb7dbResult=$wpdb7dbArray["your-email"];

▲22行目。取得した配列から必要な your-email を取り出します。
 

// ▼ 入力したメールアドレスが既存だったらエラー表示させる
if(preg_match('/'.$your_email.'/',$wpdb7dbResult)){
 $result->invalidate($name, "このメールアドレスはすでに登録されています。");
 }

▲25行目。preg_match で入力した文字がデータベースに含まれていればエラーを表示させます。
ちなみに、変数を正規表現として扱うには '/'.$your_email.'/' のように記述します。
 

Contact Form 7
▲このように表示されます。
 

まとめ

前回はFlamingoと比較しましたが、データベースの処理を考えるとContact Form7 Database Addon – CFDB7が良さそうですね。
QRコードを使った申し込みシステムとの連携や、他にも色々と使えそうです。
お客さまのご要望に合わせた、便利な仕組みを作れればと思います。
 

最後まで読んでくださりありがとうございました。
 

関連記事




 

Pocket