こんにちは、プログラマーの山本です。
今回はクライアント様からのご依頼で、
ContactForm7による申し込みについて、
同じメールアドレスからの送信を禁止するシステムを制作しました。
同じ人から一度しか申し込みを受け付けないといった場合に、
今回のシステムは役立つでしょう。
目次
フォームIDとメールアドレスをデータベースに保存させる
送信済みのメールアドレスをチェックするためには、まず
送信されたメールアドレスをデータベースに保存しておく必要があります。
ついでにフォームのIDも合わせて保存します。
以下のコードを function.php に追加してください。
add_action( 'wpcf7_submit', 'action_wpcf7_submit', 10, 2 );
function action_wpcf7_submit( $instance, $result ) {
global $wpdb;
//データベースがない場合は作成
$wpdb->query("CREATE TABLE IF NOT EXISTS `cf7_email_check` (
`form_id` int NOT NULL,
`email` text NOT NULL,
PRIMARY KEY (form_id))"
);
//メールアドレスの保存
$wpdb->query("INSERT IGNORE INTO cf7_email_check (form_id, email) VALUES ( '".$_POST['_wpcf7']."', '".$_POST['your-email']."' ) ");
};
wpcf7_submit のアクションフックを使って、
データベースがないなら新規作成し、
フォームIDとメールアドレスの組み合わせがないなら保存しています。
このようにすれば、重複したデータを保存しなくて済みます。
ContactForm7のカスタムバリデーションを追加する。
次に、フォーム送信の直前にメールアドレスのチェックを行います。
以下のコードを function.php に追加します。
add_filter('wpcf7_validate', 'wpcf7_validate_customize', 11, 2);
function wpcf7_validate_customize($result,$tags){
//ここにメールアドレスの重複チェックを書く。
return $result;
}
wpcf7_validate というフィルターフックを使って、
Contact Form 7 のバリデーションを上書きすることになります。
データベースからメールアドレスをチェックする
上記の3行目に以下のコードを追加します。
global $wpdb;
$EMAIL_NAME = 'your-email';
//メールアドレスの重複チェック
foreach ( $tags as $tag ) {
$name = $tag['name'];
if ( $name == $EMAIL_NAME ){
$database = $wpdb->get_results("SELECT * FROM cf7_email_check WHERE email = '{$_POST[$name]}'");
if(count($database) > 0){
$result->invalidate($name, "こちらのメールアドレスはすでに申し込み済みです。");
}
}
}
return $result;
2行目、”your_email”部分は、メールアドレスのname属性名を指定します。
これで、入力したメールアドレスがすでに
ContactForm7から送信したことがあるメールアドレスだった場合、エラーが表示されます。
複数のフォームがある場合に対応する
上記のコードは、すべてのフォームをチェックするので、
フォームAに登録済みのメールアドレスは、フォームBで登録できなくなります。
それで良い場合はそのままで良いのですが、
フォームごとにメールアドレスのチェックを行いたい場合は、
上記コードの 7行目を以下のように変更します。
$database = $wpdb->get_results("SELECT * FROM cf7_email_check
WHERE email = '{$_POST[$name]}' AND form_id = '{$_POST['_wpcf7']}'");
まとめ
コードをまとめると以下のようになります。
※ フォームごとにメールアドレスのチェックを行う場合
add_action( 'wpcf7_submit', 'action_wpcf7_submit', 10, 2 );
function action_wpcf7_submit( $instance, $result ) {
global $wpdb;
//データベースがない場合は作成
$wpdb->query("CREATE TABLE IF NOT EXISTS `cf7_email_check` (
`seq` int(11) NOT NULL AUTO_INCREMENT,
`form_id` int NOT NULL,
`email` text NOT NULL,
PRIMARY KEY (seq))"
);
//メールアドレスの保存
$wpdb->query("INSERT IGNORE INTO cf7_email_check (form_id, email) VALUES ( '".$_POST['_wpcf7']."', '".$_POST['your-email']."' ) ");
};
add_filter('wpcf7_validate', 'wpcf7_validate_customize', 11, 2);
function wpcf7_validate_customize($result, $tags){
global $wpdb;
$EMAIL_NAME = 'your-email';
//メールアドレスの重複チェック
foreach ( $tags as $tag ) {
$name = $tag['name'];
if ( $name == $EMAIL_NAME ){
$database = $wpdb->get_results("SELECT * FROM cf7_email_check WHERE email = '{$_POST[$name]}' AND form_id = '{$_POST['_wpcf7']}'");
if(count($database) > 0){
$result->invalidate($name, "こちらのメールアドレスはすでに申し込み済みです。");
}
}
}
return $result;
}
今回はデータベースからメールアドレスの重複をチェックしましたが、
上記のように、ContactForm7のバリデーションでデータベースのチェックを行えば、
様々なことが出来るようになるでしょう。
制作の依頼はこちら
もし、記事を読んでもご自分では実装が難しい場合や、
ContactForm7 周りのカスタマイズをご希望の場合は、
以下のフォームから弊社にご相談くださいませ。
また、今回のシステム以外にも、
Welcartにおけるシステムの追加やカスタマイズ、
Wordpressのテーマやプラグインのカスタマイズなど、
ウェブに関するご依頼ならほとんど対応可能です。
簡単なシステムなら1件¥3,000(税別)から承っております。
相場よりも費用を抑えて対応させていただくことが可能ですので、
以下のフォームから相談内容を記入して気軽にご連絡ください。