投稿日: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の設定画面です。
メールアドレス確認欄のショートコードに your_email-confirm
と記述する必要があります。
▲結果、異なるメールアドレスを入力をすると、エラーが表示されるようになります。
既存のメールアドレスだったらエラー処理
上記のバリデートの記述を参考にカスタマイズしてみました。
前回、紹介した 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.'/'
のように記述します。
▲このように表示されます。
前回はFlamingoと比較しましたが、データベースの処理を考えるとContact Form7 Database Addon – CFDB7が良さそうですね。
QRコードを使った申し込みシステムとの連携や、他にも色々と使えそうです。
お客さまのご要望に合わせた、便利な仕組みを作れればと思います。
最後まで読んでくださりありがとうございました。