Contact Form DB でチェック処理
Contact Form DB でテーブルへの insert を行う前に、何らかのチェック処理を入れたい場合、フックを使います。
function my_form_chk( $cf7 ) {
// 入力フォームの値取得
foreach ($cf7->posted_data as $posted_name => $posted_value) {
// 元の値は変えないため別変数へ
$posted_name_2 = $posted_name;
$posted_value_2 = $posted_value;
// 値の整形
$posted_nameClean = stripslashes($posted_name_2);
$posted_value_2 = is_array($posted_value_2) ? implode($posted_value_2, ', ') : $posted_value_2;
$posted_valueClean = stripslashes($posted_value_2);
// それぞれの変数に代入
if( $posted_nameClean == 'a' ) {
$input_param_a = $posted_valueClean;
}
if( $posted_nameClean == 'b' ) {
$input_param_b = $posted_valueClean;
}
if( $posted_nameClean == 'c' ) {
$input_param_c = $posted_valueClean;
}
}
// チェック処理
if ( $input_param_a !== $input_param_b || $input_param_a !== $input_param_c ) {
$cf7->skip_mail = true;
}
}
add_action('wpcf7_before_send_mail', 'my_form_chk', 1);
上記の例では、入力フォームで a,b,c という3つの入力項目があり、その値を受け取って、a と b、または a と c が一致指定なければ $cf7->skip_mail に true を代入しています。
こうすると、Contact Form 7 のメール送信はスキップされます。しかしDBへの登録はとまりません。
そこで、 Contact Form DB のソースを一部改変します。
/wp-content/plugins/contact-form-7-to-database-extension CF7DBPlugin.php 467行目付近に以下処理を追加します。
if ($cf7->skip_mail) {
return; // Don't save in DB
}
単純に、$cf7->skip_mail が true を代入されていたら、Contact Form DB の処理を終了するということです。
これでDBへのinsertがとまるのですが、これだけだとブラウザで見た時、あたかも登録されたようなメッセージが出力されてしまいます。
そこで、さらに Contact Form 7 のソースを一部改変します。
/wp-content/plugins/contact-form-7/includes classes.php 467行目付近の処理を以下のように変えます。
// if ( $this->skip_mail )
// return true;
if ( $this->skip_mail ) {
return false;
}
これは、元々、$cf7->skip_mail はメール送信を抑制するフラグなのですが、これが true の時、true を return しているので、ブラウザで見ると成功しているように見えるわけです。
そこで、$cf7->skip_mail が true の時(チェック処理に引っかかった時)に return false してあげれば、エラーが出てくれます。
ちなみに、メールはそもそも送りたくない場合は、さらに
// if ( $this->skip_mail )
// return true;
if ( $this->skip_mail ) {
return false;
} else {
return true;
}
という風に、else で return true してあげれば、チェック処理に引っかからない場合、DB登録したあと、成功のメッセージが表示されます。