こんにちは、プログラマーの山本です。

今回はクライアント様からのご依頼で、
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(税別)から承っております。

相場よりも費用を抑えて対応させていただくことが可能ですので、
以下のフォームから相談内容を記入して気軽にご連絡ください。

    必須 お名前
    必須 メールアドレス
    任意 サイトのURL
    必須 ご依頼内容や相談内容

    ※出来るだけ具体的に記載していただけると進行がスムーズになります。
    任意 画像やPDF

    ※必要があれば添付してください。




    原則2営業日以内に、ご返信させていただきます。