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登録したあと、成功のメッセージが表示されます。