0
0

More than 1 year has passed since last update.

WordPressで独自テーブルにフォームデータを格納する。バリデーションや非同期通信もやってみる。

Posted at

■背景

仕事のため、必要だったため。
あまり記事もなく、調査が面倒だった。
自分共有用として。

mysqlのテーブル作成は記載していない。

■概略

処理の流れは以下

  1. フォームの送信ボタンをクリック時に、javascript起動(バリデーション、送信前の確認メッセージ、非同期で自身の固定ページにpost送信)

  2. 自身の固定ページにpost送信するので、配置しているショートコードがキック

  3. 使用しているテーマのメソッドがキック

■固定ページ

html

<h2>アンケート</h2>
<form action="" name="survey_form">
  氏名:<input id="full_name" name="full_name" required="" type="text" />
  →注意:wordpressはname属性に「name」とすると、post送信時にエラーとなる
  
  〜その他フォームなど〜
  
  <button id="survey_form" type="submit" onclick="manageSurvey_form();">送信</button>
</form>

javascript(送信ボタンクリック時に呼び出される)

<script>
  function manageSurvey_form() {
    /* 送信前のバリデーションをする */
    const full_name = document.getElementById('full_name').value;

    validation_msgs = checkSurvey_form(full_name);

    if(validation_msgs !== "") {
      alert(validation_msgs);
      return false;
    }

    // 確認メッセージを生成する
    confirmMessage =  '以下の内容で送信します。\n'
                        + '氏名:' + full_name;
  
    // 確認メッセージを表示する
    if (window.confirm(confirmMessage)) {
      // formdata作成
      const id = document.getElementById('survey_form');
      const form_data = new FormData(id);
      form_data.set('full_name',full_name);
			
      // 送信処理
      submitSurvey_form(form_data).catch(alert);
    }
  }

  // アンケートの入力値をチェックする
  function checkSurvey_form(full_name, company, mail) {
    /* バリデーション*/
    let validation_msgs = [];

    if(full_name === ""){ 
      validation_msgs.push('氏名を入力してください'); 
      
       バリデーション
    }
    
    return formated_validation_msgs;
  }

  // 非同期でアンケートをpost送信する
  async function submitSurvey_form(form_data) {
    // 自分自身の固定ページにデータを送信することで、同じ固定ページに配置したショートコードをキックする
    const response = await fetch("", {
        method: 'POST',
        body: form_data
    });

    if (response.ok){
      // post送信成功時の処理
    } else {
      throw new Error(response.status);
    }
  }
</script>

ショートコード

[store_survey]

■使用しているテーマの:funcitons.php

// ファイルダウンロードログをDBに格納する
function storeSurvey) {
  if(isset($_POST) 
      && !empty($_POST)
      && !empty($_POST['file_name'])){

    // DB接続情報取得
    global $wpdb;
    // テーブル名にはプレフィックス(wp_)は記載しない
    $tableName = $wpdb->prefix . "テーブル名";
    
    $wpdb->insert($tableName,
      array( 'file_name' => $_POST['file_name'] ),
      array( '%s' )
    );
  }
}
add_shortcode('store_survey', 'storeSurvey');
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0