WordPressのプラグイン flamingo は、メールフォームプラグイン Contact Form 7 の送信データをデータベース上に保存するプラグインです。
このデータをグラフ化する案件があったので覚書です。とある装置の日々の測定データの報告をメールフォームで送ってもらい、それをグラフ化するといった感じです。
グラフ化には Highcharts.js を使いました。つまり、flamingo に保存されたデータから Highcharts.js でグラフ化する方法です。

Contact Form 7 でフォームを作る

flamingo にデータを保存するので、Contact Form 7 でフォームを作ります。今回は下記のような感じです。
<dl class="report"> <dt>担当者</dt> <dd>[select* your-name first_as_label "選択してください" "佐藤" "鈴木" "高橋" "田中"]</dd> <dt>装置1</dt> <dd class="implement-ck"><span>測定:</span>[radio measuring-1 use_label_element default:2 "実施" "未実施"]</dd> </dl> <div class="measuring-1 hide"> <dl class="report"> <dd class="measuring-time"><span>測定時刻:</span>[select hour-1 include_blank "00" "01" "02" "03" "04" "05" "06" "07" "08" "09" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23"]:[select min-1 include_blank "00" "10" "20" "30" "40" "50"]</dd> <dd class="measuring-value"><span>測定値:</span>[number value-1 min:3000 max:20000 placeholder "99999"]mg/L</dd> </dl> </div> <dl class="report"> <dt>装置2</dt> <dd class="implement-ck"><span>測定:</span>[radio measuring-2 use_label_element default:2 "実施" "未実施"]</dd> </dl> <div class="measuring-2 hide"> <dl class="report"> <dd class="measuring-time"><span>測定時刻:</span>[select hour-2 include_blank "00" "01" "02" "03" "04" "05" "06" "07" "08" "09" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23"]:[select min-2 include_blank "00" "10" "20" "30" "40" "50"]</dd> <dd class="measuring-value"><span>測定値:</span>[number value-2 min:0 max:20 placeholder "6.5"]pH</dd> </dl> </div> <dl class="report"> <dd class="cleaning"><span>清掃:</span>[radio cleaning use_label_element default:2 "実施" "未実施"]</dd> </dl> <p class="submit">[submit class:fas " 送 信"]</p>
ラジオボタンで関連箇所の表示/非表示(本題と関係ありません)
ラジオボタンの選択が“未実施”の場合に入力不要なinput要素を含む要素を非表示にしましたが、本題とは関係ありません。
(function($){
$('.implement-ck input[type="radio"]').change(function(){
var c = $(this).attr("name");
$('div.' + c).removeClass('hide');
if($('.implement-ck input[name="' + c + '"]:checked').val() == "未実施"){
$('div.' + c).addClass('hide');
}
});
})(jQuery);
グラフを入れる要素と日付を遡るためのform
id=”test-graph”のdiv要素にグラフが表示されます。
日付を遡るためのformは、Contact Form 7 とは別のformです。
<!-- ↓グラフの日付を遡るためのフォーム↓ --> <form action="" method="POST"> <span class="offset">最新より<input type="number" name="offset" class="offset" min="0" max="366" aria-invalid="false" placeholder="0" />日前</span><span><input type="submit" name="submit" value="送 信" /></span> </form> <!-- ↓グラフを表示するコンテナ↓ --> <div id="test-graph" style="height: 400px; margin: 0 auto;"></div>
フォームの外観を整えるCSS
/*### Contact Form 7 のフォーム用 ###*/
dl.report dt,
dl.report dd {
margin-left: 0;
}
dl.report dd {
margin-bottom: .5em;
}
.measuring-time span:nth-of-type(1),
.measuring-value span:nth-of-type(1) {
width: 8em;
display: inline-block;
}
.cleaning > span:nth-of-type(1) {
width: 7em;
display: inline-block;
}
.measuring-time span:nth-of-type(2) {
margin-right: .5em;
}
.measuring-time span:nth-of-type(3) {
margin-left: .5em;
}
.measuring-time input {
width: 3.5em;
}
.measuring-time select {
width: 4.0em;
}
.measuring-value input {
width: 6em;
}
.measuring-1.hide,
.measuring-2.hide { /*ラジオボタンによる非表示スクリプト用*/
display: none;
}
/*### グラフ上部フォーム用 ###*/
.entry-content form {
margin-bottom: 40px;
}
.entry-content form span {
display: inline-block;
}
.entry-content form span.offset {
width: 13em;
margin-left: 1em;
margin-bottom: 10px;
}
.entry-content form input.offset {
width: 5em;
}
.entry-content form input[name="submit"] {
width: 5em;
}
テンプレートファイルにコード追加
今回は固定ページ用のテンプレートファイル page.php をコピーしてグラフ用のテンプレートファイル page-graph.php を作成し、その最上部(header要素より上)に下記のコードを追加しました。
flamingo のデータは post_type が flamingo_inbound のカスタムフィールドなので、get_post_meta() で取得可能です。それをJSONエンコードしてJavaScriptで使用できる形式に変換します。
// フォームから送信されたinputの値を$offsetに格納
if(isset($_POST["offset"])) {
$offset = $_POST["offset"];
} else {
$offset = 0;
}
//投稿データ作成のためのパラメータ
$args = array(
'post_type' => 'flamingo_inbound', // flamingoのデータはpost_typeがflamingo_inbound
'posts_per_page' => 10, // 10件取得
'orderby' => array(
'date' => 'DESC' // 最新から取得したいので降順
),
'offset' => $offset // 取得開始位置(日付を遡るため)
);
$flamingo_posts = get_posts( $args ); // 投稿データの配列作成
// 空の配列をそれぞれ作成
$report_date_arr = array();
$report_time_arr = array();
$your_name_arr = array();
$measuring_1_arr = array();
$measuring_2_arr = array();
$hour_1_arr = array();
$min_1_arr = array();
$hour_2_arr = array();
$min_2_arr = array();
$value_1_arr = array();
$value_2_arr = array();
$cleaning_arr = array();
// 配列を繰り返し処理
foreach( $flamingo_posts as $value ) { // 要素の値を$valueに代入
$post_id = $value->ID; // $valueからIDを取得
$flamingo_post = get_post( $post_id ); // IDから投稿レコードを取得
$report_date = $flamingo_post->post_date; // 投稿レコードから送信日時を取得
$report_time = mysql2date('H:i:s', $flamingo_post->post_date); // tooltip表示用書式(時:分:秒)
// IDからカスタムフィールドの値を取得
$your_name = get_post_meta( $post_id, '_field_your-name', true ); // 担当者取得
$measuring_1 = get_post_meta( $post_id, '_field_measuring-1', true); // 装置1測定実施/未実施取得
$measuring_2 = get_post_meta( $post_id, '_field_measuring-2', true); // 装置2測定実施/未実施取得
$hour_1 = get_post_meta( $post_id, '_field_hour-1', true ); // 装置1測定時刻(時)取得
$min_1 = get_post_meta( $post_id, '_field_min-1', true ); // 装置1測定時刻(分)取得
$hour_2 = get_post_meta( $post_id, '_field_hour-2', true ); // 装置2測定時刻(時)取得
$min_2 = get_post_meta( $post_id, '_field_min-2', true ); // 装置2測定時刻(分)取得
$value_1 = get_post_meta( $post_id, '_field_value-1', true ); // 装置1測定値取得
$value_2 = get_post_meta( $post_id, '_field_value-2', true ); // 装置2測定値取得
$cleaning = get_post_meta( $post_id, '_field_cleaning', true ); // 清掃実施/未実施
// 取得したカスタムフィールドの値を空の配列に入れていく
$report_date_arr[] = $report_date;
$report_time_arr[] = $report_time;
$your_name_arr[] = $your_name;
$measuring_1_arr[] = $measuring_1;
$measuring_2_arr[] = $measuring_2;
$hour_1_arr[] = $hour_1;
$min_1_arr[] = $min_1;
$hour_2_arr[] = $hour_2;
$min_2_arr[] = $min_2;
$value_1_arr[] = (int)$value_1;
$value_2_arr[] = (float)$value_2;
$cleaning_arr[] = $cleaning;
}
// グラフのX軸は右方向に最新となるので配列を逆順にする
$report_date_arr_r = array_reverse($report_date_arr);
$report_time_arr_r = array_reverse($report_time_arr);
$your_name_arr_r = array_reverse($your_name_arr);
$measuring_1_arr_r = array_reverse($measuring_1_arr);
$measuring_2_arr_r = array_reverse($measuring_2_arr);
$hour_1_arr_r = array_reverse($hour_1_arr);
$min_1_arr_r = array_reverse($min_1_arr);
$hour_2_arr_r = array_reverse($hour_2_arr);
$min_2_arr_r = array_reverse($min_2_arr);
$value_1_arr_r = array_reverse($value_1_arr);
$value_2_arr_r = array_reverse($value_2_arr);
$cleaning_arr_r = array_reverse($cleaning_arr);
// JavaScriptにデータを渡すためにJSONエンコード
$report_date_j = json_encode($report_date_arr_r);
$report_time_j = json_encode($report_time_arr_r);
$your_name_j = json_encode($your_name_arr_r);
$measuring_1_j = json_encode($measuring_1_arr_r);
$measuring_2_j = json_encode($measuring_2_arr_r);
$hour_1_j = json_encode($hour_1_arr_r);
$min_1_j = json_encode($min_1_arr_r);
$hour_2_j = json_encode($hour_2_arr_r);
$min_2_j = json_encode($min_2_arr_r);
$value_1_j = json_encode($value_1_arr_r);
$value_2_j = json_encode($value_2_arr_r);
$cleaning_j = json_encode($cleaning_arr_r);
Highcharts.js のグラフ設定
テンプレートファイル page-graph.php の body要素最下部(



コメント