ワードプレスメールフォームプラグイン
ContactFormCFDB7で
2重保存される仕様の対応

記事公開日:
最終更新日:

マザーシップウェブ制作事務所です。

以下の3つのプラグインを組み合わせたときに発生する、データベースに2重に保存される仕様に対応する方法を共有します。

❶ワードプレスのメールフォームプラグイン、Contact Form 7(CF7) 

❷送信情報をワードプレスのデータベースに保管するプラグイン Contact Form CFDB 7 

❸確認画面を表示するプラグイン、 Confirm Plus Contact Form7

失敗するとサイト自体が壊れる可能性があるので、バックアップを取って慎重に作業してくださいね!

 

➀ プラグインファイルエディターを編集

🙆メリット:お手軽、管理画面で完結する

🙅‍♂️デメリット:Contact Form CFDB 7 バージョンアップのたびに作業する必要がある

方法

1)ワードプレスの管理画面より、[プラグイン]-[プラグインファイルエディター]を選択

ワードプレスメールフォームプラグイン ContactFormCFDB7で 2重保存される仕様の対応|マザーシップウェブ制作事務所

2)画面右上、編集するプラグインを選択で「Contact Form CFDB 7 」を選択。

ワードプレスメールフォームプラグイン ContactFormCFDB7で 2重保存される仕様の対応|マザーシップウェブ制作事務所

3)114行目くらい(バージョンによりかわります)を変更

if ( $submission ) { // ここを変更

if ( $submission && $_POST['_wpcf7cp'] ==='status_confirm' ) { // ここを変更しました

4)保存、送信テスト

 

参考サイト

Contact Form CFDB7でのデータ重複について @ワードプレスフォーラム

 

➁functions.php に追加

🙆メリット:Contact Form CFDB 7 バージョンアップのたびに作業する必要がない

🙅‍♂️デメリット:テーマファイルを編集する知識が必要、修正に失敗するとサイト全体が表示されなくなる可能性がある

 

方法

functions.php に以下のソースを追加しましょう。wpcf7_before_send_mail フックを 上書き する方法で、プラグインを直接編集せずに同様の挙動を実現できるのです。

/* -------------
Contact Form 7 + Confirm Plus 使用時の CFDB7 の2重保存を防止
-------------- */
// 元のフックを削除(Contact Form CFDB7 が登録したもの)
remove_action( 'wpcf7_before_send_mail', 'cfdb7_before_send_mail' );
// 自分のフィルターを追加
add_action( 'wpcf7_before_send_mail', 'cfdb7_before_send_mail_custom', 1 );
function cfdb7_before_send_mail_custom( $form_tag ) {
    if ( ! isset($_POST['_wpcf7cp']) || $_POST['_wpcf7cp'] !== 'status_confirm' ) {
        return; // 確認送信でない場合は処理しない
    }
    if ( ! class_exists('WPCF7_Submission') ) return;
    // 以下、元のcfdb7_before_send_mail関数の内容をコピーして記述
    global $wpdb;
    $cfdb          = apply_filters( 'cfdb7_database', $wpdb );
    $table_name    = $cfdb->prefix.'db7_forms';
    $upload_dir    = wp_upload_dir();
    $cfdb7_dirname = $upload_dir['basedir'].'/cfdb7_uploads';
    $bytes         = random_bytes(5);
    $time_now      = time().bin2hex($bytes);
    $submission   = WPCF7_Submission::get_instance();
    $contact_form = $submission->get_contact_form();
    $tags_names   = array();
    $strict_keys  = apply_filters('cfdb7_strict_keys', false);  
    if ( $submission ) {
        $allowed_tags = array();
        $bl   = array('\"',"\'",'/','\\','"',"'");
        $wl   = array('"',''','/', '\','"',''');
        if( $strict_keys ){
            $tags  = $contact_form->scan_form_tags();
            foreach( $tags as $tag ){
                if( ! empty($tag->name) ) $tags_names[] = $tag->name;
            }
            $allowed_tags = $tags_names;
        }
        $not_allowed_tags = apply_filters( 'cfdb7_not_allowed_tags', array( 'g-recaptcha-response' ) );
        $allowed_tags     = apply_filters( 'cfdb7_allowed_tags', $allowed_tags );
        $data             = $submission->get_posted_data();
        $files            = $submission->uploaded_files();
        $uploaded_files   = array();
        foreach ($_FILES as $file_key => $file) {
            array_push($uploaded_files, $file_key);
        }
        foreach ($files as $file_key => $file) {
            $file = is_array( $file ) ? reset( $file ) : $file;
            if( empty($file) ) continue;
            copy($file, $cfdb7_dirname.'/'.$time_now.'-'.$file_key.'-'.basename($file));
        }
        $form_data   = array();
        $form_data['cfdb7_status'] = 'unread';
        foreach ($data as $key => $d) {
            if( $strict_keys && !in_array($key, $allowed_tags) ) continue;
            if ( !in_array($key, $not_allowed_tags ) && !in_array($key, $uploaded_files )  ) {
                $tmpD = $d;
                if ( ! is_array($d) ){
                    $tmpD = str_replace($bl, $wl, $tmpD );
                } else {
                    $tmpD = array_map(function($item) use($bl, $wl){
                        return str_replace($bl, $wl, $item ); 
                    }, $tmpD);
                }
                $key = sanitize_text_field( $key );
                $form_data[$key] = $tmpD;
            }
            if ( in_array($key, $uploaded_files ) ) {
                $file = is_array( $files[ $key ] ) ? reset( $files[ $key ] ) : $files[ $key ];
                $file_name = empty( $file ) ? '' : $time_now.'-'.$key.'-'.basename( $file ); 
                $key = sanitize_text_field( $key );
                $form_data[$key.'cfdb7_file'] = $file_name;
            }
        }
        $form_data = apply_filters('cfdb7_before_save_data', $form_data);
        do_action( 'cfdb7_before_save', $form_data );
        $form_post_id = $form_tag->id();
        $form_value   = serialize( $form_data );
        $form_date    = current_time('Y-m-d H:i:s');
        $cfdb->insert( $table_name, array(
            'form_post_id' => $form_post_id,
            'form_value'   => $form_value,
            'form_date'    => $form_date
        ) );
        $insert_id = $cfdb->insert_id;
        do_action( 'cfdb7_after_save_data', $insert_id, $form_data );
    }
}

 

③CFDB7 Confirm Fixプラグイン追加

🙆メリット:管理画面だけで完結する、Contact Form CFDB 7 バージョンアップのたびに作業する必要がない 

🙅‍♂️デメリット:非公式プラグインである

方法

以下のファイルをダウンロードして管理画面の[プラグイン]-[プラグインを追加]よりアップロード、有効化。

cfdb7-confirm-fix.zip

ワードプレスメールフォームプラグイン ContactFormCFDB7で 2重保存される仕様の対応|マザーシップウェブ制作事務所

有効化後

ワードプレスメールフォームプラグイン ContactFormCFDB7で 2重保存される仕様の対応|マザーシップウェブ制作事務所

 

以上です。確認画面が出て&送信内容がデータベースに残せて&日付の入力もできる、そんなメールフォームプラグインは存在しませんよね~、しかしそこを工夫できるのがワードプレスの素晴らしさです。頑張りましょう!





ページの先頭へ