質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.02%

【contact_form7】DBにラジオボタンの値がインサートされない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,574

uznetro

score 10

wordpressプラグインのcntact_form7で送信した値をDBに保存したい為、
ネットの情報を参考に、下記の様な形で実装しました。

テキストのフォーム部分は、DBにインサートされるのですが、
複数要素を持つ”ラジオボタン/チェックボックス”がうまくいきません。

初心者の為、説明/情報不足があるかと思いますが、
ご教授宜しくお願いします。 


▼環境
wordpress バージョン:4.3
contact_form7バージョン:4.3
MySQL バージョン:5.0.95


【出力されたHTMLソース】
<div role="form" class="wpcf7" id="wpcf7-f141-o1" lang="ja" dir="ltr">
  <div class="screen-reader-response"></div>
  <form action="/wordpress/form/poll/#wpcf7-f141-o1" method="post" class="wpcf7-form" novalidate="novalidate">
    <div style="display: none;">
      <input type="hidden" name="_wpcf7" value="141" />
      <input type="hidden" name="_wpcf7_version" value="4.3" />
      <input type="hidden" name="_wpcf7_locale" value="ja" />
      <input type="hidden" name="_wpcf7_unit_tag" value="wpcf7-f141-o1" />
      <input type="hidden" name="_wpnonce" value="d41c7e5b6b" />
    </div>

    <div class="formGroup">
      <p>お名前 (必須)<br />
        <span class="wpcf7-form-control-wrap name"><input type="text" name="name" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-validates-as-required" aria-required="true" aria-invalid="false" /></span>
      </p>
      <p>メールアドレス (必須)<br />
        <span class="wpcf7-form-control-wrap mail"><input type="email" name="mail" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-email wpcf7-validates-as-required wpcf7-validates-as-email" aria-required="true" aria-invalid="false" /></span>
      </p>
      <p>ラジオアイテム<br />
        <span class="wpcf7-form-control-wrap item"><span class="wpcf7-form-control wpcf7-radio"><span class="wpcf7-list-item first"><input type="radio" name="item" value="itemA" />&nbsp;<span class="wpcf7-list-item-label">itemA</span></span><span class="wpcf7-list-item last"><input type="radio" name="item" value="itemB" />&nbsp;<span class="wpcf7-list-item-label">itemB</span></span></span></span>
      </p>
      <p>
        <input type="submit" value="送信" class="wpcf7-form-control wpcf7-submit"/>
      </p>
    </div>
    <div class="wpcf7-response-output wpcf7-display-none"></div>
  </form>
</div> 

【contact_form7設定画面のソース】
<div class="formGroup">
  <p>お名前 (必須)<br />
    [text* name] 
  </p>
  <p>メールアドレス (必須)<br />
    [email* mail]
  </p>
  <p>ラジオアイテム<br />
    [radio item "itemA" "itemB"]
  </p>
</div>
<p>
  [acceptance acceptance] 規約に同意する
</p>
<p>[submit "送信"]</p>

【fuction.php】
/** Contact-form7 insert DB  [function.php]
*****************************************************/
function contactform7_before_send_mail( $form_to_DB ) {

  global $wpdb;

  $form_to_DB = WPCF7_Submission::get_instance();

  if ( $form_to_DB ) {
    $formData = $form_to_DB->get_posted_data();
  }

  $name =$formData['name'];
  $mail =$formData['mail'];
  $item =$formData['item']; //radio button
  $wpdb->insert ( 'wp_cf7db', array('name' => $name,'mail' => $mail), array( '%s','%s' ) );

  //下記はダメでした。JSONエラーがでて、DBにインサートされません。
  //JSON.parse: unexpected character at line 1 column 1 of the JSON data
  //$wpdb->insert ( 'wp_cf7db', array('name' => $name,'mail' => $mail,'item' => $item), array( '%s','%s','%s' ) );

}
remove_all_filters ('wpcf7_before_send_mail');
add_action( 'wpcf7_before_send_mail', 'contactform7_before_send_mail' );

CREATE TABLE IF NOT EXISTS `wp_cf7db` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `item` varchar(50) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `mail` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) 
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

以下要件を満たした、 Contact Form7のデータベース保存版の自己解決です。
・応募データの保存
・重複投票なし(DB側で処理)
・各フォームバリテーションチェック(JSで簡易バリテーション)

function contactform7_before_send_mail( $form_to_DB ) {
  global $wpdb;
  $form_to_DB = WPCF7_Submission::get_instance();
    if ( $form_to_DB ) {
  $formData = $form_to_DB-&gt;get_posted_data();
}

// 以下コメントは$formDataの検証
// foreach ($formData as $key =&gt; $val) {
//   $fmail .= $key.":".$val.";";
// }
// さらに配列の中身を確認する
// foreach($formData as $key =&gt; $val) {
//   foreach($val as $k =&gt; $v) {
//     $mail .= $k.":".$v;
//   }
// }

$item =$formData['item'][0];
$name =$formData['name'];
$mail =$formData['mail'];

$wpdb-&gt;insert ( 'wp_cf7db', array('item' =&gt; $item,'name' =&gt; $name,'mail' =&gt; $mail), array( '%s' ) );
}
remove_all_filters ('wpcf7_before_send_mail');
add_action( 'wpcf7_before_send_mail', 'contactform7_before_send_mail' );

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

insertメソッドに値を渡していないことが原因ではないでしょうか?
$wpdb->insert ( 'wp_cf7db', array('name' => $name,'mail' => $mail), array( '%s','%s','%s' ) );

$wpdb->insert ( 'wp_cf7db', array('name' => $name,'mail' => $mail, 'item' => $item), array( '%s','%s','%s' ) );
に変更して、試してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/18 16:30

    > contactform7_before_send_mailメソッドの先頭に以下の2行を追加
    はい!記述しています。

    > var_export($formData, true)とすれば
    やはりfunction内では何も出力されません。
    下記の様に、変数定義しても値を受け取れなかったです。
    function抜ければ結果が出るのですが。

    $item= array('aaa', 'bbb');
    var_dump($item);

    キャンセル

  • 2015/11/18 17:29

    > はい!記述しています。
    その結果、何か出力されたかを教えて下さい。

    > やはりfunction内では何も出力されません。
    var_export($item, true) は、var_dumpで出力される文字列を戻り値として返す関数です。

    ですので、例えば
    $exported = var_export($formData, true);
    file_put_contents('/tmp/export.log', $exported, FILE_APPEND);
    とすれば、"/tmp/export.log"というファイルに$formDataの内容が出力されます。
    http://php.net/manual/ja/function.file-put-contents.php

    出力するファイルは、ご自分の環境で開くことのできるものに適宜変更して下さい。

    > function抜ければ結果が出るのですが。
    どういう意味ですか?
    具体的に説明して下さい。

    キャンセル

  • 2015/11/19 09:06 編集

    > function抜ければ結果が出るのですが。
    function contactform7_before_send_mail( $form_to_DB ) {
    この中での処理(ご指示頂いたデバック関数や確認用に記述した変数など)が動かないということです。
    }

    ただし、メール送信すると配列型のフォームアイテム以外はDBに値が入る為、
    下記の様にすると、fmailフィールドにitemの配列が渡されている事が確認できました。

    foreach($formData as $key => $val) {
    foreach($val as $k => $v) {
    $fmail .= $k.":".$v;
    }
    }

    結論となりますが、ラジオボタンでの値はDBにインサートできたので、
    その他フォームアイテムで確認してみようと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる