Contact Form DB でチェック処理
Contact Form DB でテーブルへの insert を行う前に、何らかのチェック処理を入れたい場合、フックを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
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行目付近に以下処理を追加します。
1 2 3 |
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行目付近の処理を以下のように変えます。
1 2 3 4 5 |
// if ( $this->skip_mail ) // return true; if ( $this->skip_mail ) { return false; } |
これは、元々、$cf7->skip_mail はメール送信を抑制するフラグなのですが、これが true の時、true を return しているので、ブラウザで見ると成功しているように見えるわけです。
そこで、$cf7->skip_mail が true の時(チェック処理に引っかかった時)に return false してあげれば、エラーが出てくれます。
ちなみに、メールはそもそも送りたくない場合は、さらに
1 2 3 4 5 6 7 |
// if ( $this->skip_mail ) // return true; if ( $this->skip_mail ) { return false; } else { return true; } |
という風に、else で return true してあげれば、チェック処理に引っかからない場合、DB登録したあと、成功のメッセージが表示されます。