「CF7 Increment Number」と 「Contact Form DB」の連携


ContactForm7のプラグインとして、この2つのプラグインがあります。CF DBについては、いろいろな拡張子との連携を考慮しているようですが、CF7IncrementNumberは考慮されていなかったので、この2つの連携について記載します。

IncrementNumber(お問合せ番号)はメールにしか記載できないので、Contact Form DBを使ってDBに登録させたい。

これを出来るようにするための方法を解説します。

この方法では同時の要求に対して、問合せ番号の排他ができない為、『没ネタ』とします。

下の方に修正記事を記載しておきます。

CFのフォーム管理

以下のように設定しているとします。

CF7
ContactForm7 のフォームには、以下のようにhiddenタグとして入れておきます。

<span style="display: block;">[text contact_id id:contact_id]</span>

fooder.phpで画面側で隠し項目としてJSで設定する

CF7 Increment Number は管理項目として「hps_cf7in_num」でシリアル番号を設定しています。get_option()を使って値を取得し、JQuery側でシリアル番号の書式を統一してあげます。以下はjQueryで記載しているので、header.php側でjQueryを読み込んでおいてください。

<?php
// =========== zamuu Add ============
// = get_option()で取得した値を6桁表示し接頭語をつける。
$hps_cf7in_num = get_option('hps_cf7in_num');
if(empty($hps_cf7in_num)) $hps_cf7in_num = '0';
$serialNo = "UKETSUKE-" . sprintf("%06d", $hps_cf7in_num);
?>
<script type="text/javascript">
(function ($) {
 // windowがloadされた際に実行したいコードを記述
 var serialNo = "<?php echo $serialNo;?>"
 $('#your-message').filter(function(){
 return 'readonly' === $(this).attr('readonly');
 }).addClass('readonly');
 $("#contact_id").val(serialNo);
}(jQuery));
</script>
<?php // =========== zamuu Add END============ ?>

プラグインの処理順番を指定する

デザイナーの方には難しい話になりますが、WordPressのActionhookとして、この2つのプラグインはいずれも『wpcf7_before_send_mail』を利用しています。CF7IncrementNumberが先にコールされると、確認時に勝手にインクリメントされてしまいます。その為、メール本文の受付番号とContactFormDBのカラム番号が±2の差が出てきてしまいます。CF7IncrementNumberを直接修正し対処します。CF7IncrementNumber更新時には上書きされてしまうので更新時は再度修正する必要があります。

contact-form-7-add-confirm/includes/controller.php の22行目辺り

</pre>
function wpcf7c_ajax_json_echo() {
 if (isset($_POST['_wpcf7c'])) switch($_POST["_wpcf7c"]) {
 case "step1":
 // $result = apply_filters( 'wpcf7_before_send_mail', $result );
 add_action("wpcf7_before_send_mail", "wpcf7c_before_send_mail_step1", 10, 2);
<pre>

優先順位が10番目となっているので、これより後にインクリメントされるよう指定します。

contact-form-7-increment-number/contact-form-7-increment-number.php の39行目辺り


// add_action( 'wpcf7_before_send_mail', 'hps_increment_number' ); // zamuu change
add_action( 'wpcf7_before_send_mail', 'hps_increment_number', 11 );

追加記事

CF7通し番号プラグインは、上記画面のまま『UKETSUKE-』の6桁通し番号を前提として修正箇所を記載します。

1.cf7 addconfirmプラグインの修正

ファイル:contact-form-7-add-confirm/includes/controller.php

「送信時」にPOSTデータとして、念のため通し番号を渡します。


case "step2":
 // =========== zamuu ADD =============
 // cf7Increment要素を付与
 $o = (get_option('hps_cf7in_num'))?intval(get_option('hps_cf7in_num')):0;
 $_POST['_wpcf7c']['contact_id']="UKETSUKE-" . sprintf("%06d", $o);
 // =========== zamuu ADD END =============

//$items = apply_filters( 'wpcf7_ajax_json_echo', $items, $result );
 add_filter("wpcf7_ajax_json_echo", "wpcf7c_ajax_json_echo_step2", 10, 3);

2.cf7incrementプラグインの修正

ファイル:contact-form-7-increment-number/contact-form-7-increment-number.php

CF7confirmの確認画面時は『_wpcf7c』というキーでPOSTデータ(step1)が渡されます。送信時は(step2)が渡されます。CF7Incrementでは、確認画面時のインクリメントは避けたいので、判定処理を差し込んでおきます。


// add_action( 'wpcf7_before_send_mail', 'hps_increment_number' ); // zamuu changed
add_action( 'wpcf7_mail_sent', 'hps_increment_number' );

function hps_increment_number( $wpcf7_contact_form ){
 // ======= zamuu ADD ========
 // CF7 confirm のstep1時はインクリメントしない
 $post = $wpcf7_contact_form ->posted_data;
 foreach($post as $k => $v ){
 if($k == '_wpcf7c' && $v == 'step1') return;
 }
 // ======= zamuu ADD ========

$o = (get_option('hps_cf7in_num'))?intval(get_option('hps_cf7in_num')):0;
 update_option('hps_cf7in_num',intval($o + 1) );
}

3.CF7DBプラグインの修正

ファイル:contact-form-7-to-database-extension/CF7DBPlugin.php

public function saveFormData($cf7) という関数があります。フォームからのデータ保存をする箇所です。ここで、POSTされてきた「contact_id」を格納するようにします。問合せ番号なので、そのままでは連想配列の最後尾に追加されるので、連想配列を再配置しています。


// =========== zamuu ADD =============
 $o = (get_option('hps_cf7in_num'))?intval(get_option('hps_cf7in_num')):0;
 $sort_array = array('contact_id' => "UKETSUKE-" . sprintf("%06d", $o));
 $cf7->posted_data = array_merge( $sort_array, $cf7->posted_data);
// =========== zamuu ADD =============

foreach ($cf7->posted_data as $name => $value) {
 $nameClean = stripslashes($name);
 if ($this->fieldMatches($nameClean, $noSaveFields)) {
 continue; // Don't save in DB
 }


「「CF7 Increment Number」と 「Contact Form DB」の連携」への8件のコメント

  1. 突然のメッセージで大変失礼致します。
    こちらの【「CF7 Increment Number」と 「Contact Form DB」の連携】
    http://blog.zamuu.net/2014/0624/incre_num_and_add_conf/

    について相談させ頂きたくコメントさせて頂きました。

    こちらの連携処理ですが、大変参考にさせて頂いております。
    この処理ですが同じようにcf7 addconfirmを使い、確認画面を経由してcf7incrementをインクリメントしようとし、記事に書かれている処理を追記したのですが、どうも確認ボタンをクリックしたところで処理が止まってしまい、次の確認画面へと遷移することができませんでした。
    確認したところ、どうも「2.cf7incrementプラグインの修正」にある
    foreach($post as $k => $v ){
    if($k == ‘_wpcf7c’ && $v == ‘step1’) return;
    }
    のforeachがずっとループしているような挙動を見せています。

    このような現象は確認できますでしょうか?プラグインのバージョンの違いによるところでしょうか・・・。
    (原因が分かれば有りがたいのですが。)

    また、もし差し支えなければこの記事中で使用しているプラグイン(contact from 7、cf7 addconfirm、contact from DB)のバージョンを教えて頂けると大変助かります。

    突然このようなメッセージで大変申し訳ございません。
    もしこのようなコメントへの対応不可の場合は無視して下さい。。。

    何卒宜しくお願い致します。

  2. 先ほどcontact from 7 の確認画面についてコメントした者です。
    申し訳ありません、自己解決しました。

    contact form 7のバージョンの違いでした。
    contact form v3.9 からposted_datが使用できなくなり、「WPCF7_Submission」オブジェクトを使うように変更されていました。
    そのため、2.cf7incrementプラグインの修正の次の箇所

    $post = $wpcf7_contact_form ->posted_data;

    を下の通りに変更することで対応できました。

    $submission = WPCF7_Submission::get_instance();
    if ( $submission ) {
    $post = $submission->get_posted_data();
    }

    大変お騒がせしました。

  3. 返信遅くなりました。コメントくださりありがとうございました。自己解決できてよかったです。

  4. はじめまして。
    「CF7 INCREMENT NUMBER」と 「CONTACT FORM DB」の連携について他に解説しているところがなかったのでとても助かります。
    atsu様が先にcf7incrementプラグインの修正の箇所について書かれていたので、そちらも変更してみましたが、送信ボタンをクリックしてからずっとくるくると回ったままでその先の完了画面に行きません。完了画面はその他の設定で飛ぶように設定しています。
    on_sent_ok: “location.replace(‘http://xxxx.jp/wp/form/thanks/’);”

    送信されていないのかと思っていたのですが、しっかり送信されて、DBにも残っています。
    完了画面へ飛ばないだけのようです。
    完了画面へ飛ばすためにはまだ何か必要なのでしょうか?

  5. すみません、またまた自己解決してしまいましたm(__)m
    1.cf7 addconfirmプラグインの修正
    これを修正前の元に戻したら完了画面へ移動しました。
    この修正はいらなかったようです。

  6. はじめまして。

    急遽必要に迫られ、切羽詰まった状況で、
    通し番号とDBの連携方法を探していたところ、
    こちらのページに出会うことが出来ました。

    ずぶの、ど素人で申し訳ないのですが、
    追加コードをどこに入れていいのかが判りません。

    大変恐れ入りますが、
    どうぞよろしくお願いいたします。

  7. 返信おそくなりすみません。コメントありがとうございます。自己解決できたようでよかったです。

    $o = (get_option('hps_cf7in_num'))?intval(get_option('hps_cf7in_num')):0;

    こちらの判定でErrorとなっていたのかと思います。もう少し考慮が必要かもしれませんね。

  8. 返信おそくなりすみません。コメントありがとうございます。
    コードの差し込み場所については、プラグインのファイル名を記載しております。
    「// =========== zamuu ADD =============」
    で上下囲っている部分が追加部ですので、
    それ以外のプログラム部分を参考に行数を探してみて頂けたらと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です