ブログ・お知らせ
# ワードプレス(wordpress)
ワードプレスメールフォームプラグイン
ContactFormCFDB7で
2重保存される仕様の対応
記事公開日:
最終更新日:
マザーシップウェブ制作事務所です。
以下の3つのプラグインを組み合わせたときに発生する、データベースに2重に保存される仕様に対応する方法を共有します。
❶ワードプレスのメールフォームプラグイン、Contact Form 7(CF7)
❷送信情報をワードプレスのデータベースに保管するプラグイン Contact Form CFDB 7
❸確認画面を表示するプラグイン、 Confirm Plus Contact Form7
失敗するとサイト自体が壊れる可能性があるので、バックアップを取って慎重に作業してくださいね!
➀ プラグインファイルエディターを編集
🙆メリット:お手軽、管理画面で完結する
🙅♂️デメリット:Contact Form CFDB 7 バージョンアップのたびに作業する必要がある
方法
1)ワードプレスの管理画面より、[プラグイン]-[プラグインファイルエディター]を選択
2)画面右上、編集するプラグインを選択で「Contact Form CFDB 7 」を選択。
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 バージョンアップのたびに作業する必要がない
🙅♂️デメリット:非公式プラグインである
方法
以下のファイルをダウンロードして管理画面の[プラグイン]-[プラグインを追加]よりアップロード、有効化。
有効化後
以上です。確認画面が出て&送信内容がデータベースに残せて&日付の入力もできる、そんなメールフォームプラグインは存在しませんよね~、しかしそこを工夫できるのがワードプレスの素晴らしさです。頑張りましょう!