ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(12)空室管理画面 C
空室情報のデータベース処理を一気に終えました。ごちゃごちゃしてきたので、もっとスッキリ書く方法が無いか模索したのですが、私の知識ではこれが精一杯。
こまかい調整は完了後に改めて試してみるということで、今回は先に進みます。
プラグインファイルのメイン部分
大きく3つの処理にわかれました。ひとつは日付や部屋タイプを変更した場合、そして空室を更新する場合と何も処理しない最初の表示となります。form の action に update と change を持たせて if で分岐。値がない場合は最初の表示となります。
wp-contents/plugins/drtehotel/drtehotel.php
//空室管理画面に表示する内容 include_once "class/rooms.php"; $rm = new ROOM(); //日付・部屋タイプ変更 if ($_POST['action']=='change') { $rm->rtype = $_POST['rtype']; $rm->rdate = $_POST['rdate']; $rm->stdRooms = $_POST['stdRooms']; $rm->refresh_table($this->table_name, $rm->rdate); } else if ($_POST['action']=='update') { check_admin_referer('example'); $rm->rtype = $_POST['rtype']; $rm->rdate = $_POST['rdate']; $rm->stdRooms = $_POST['stdRooms']; $rm->comments = '<div id="message" class="updated"><p>更新しました。</p></div>'; $rm->update_rooms($this->table_name); $rm->delete_old($this->table_name); // 古いデータの削除 } else { $rm->check_rdata(); $rm->refresh_table($this->table_name, $rm->rdate); } //画面表示 $rm->load_data($this->table_name); $rm->show_screen();
rtype プロパティへの割り当てが一回で済むような気もしますが、とりあえず後の課題としておきます。change(部屋タイプや日付の更新処理)の場合に、新しい空室情報のレコードが存在するかどうかをrefresh_table 関数で該当する月のレコードが存在するかどうかの確認処理します。内容は後ほど。
update(空室情報更新処理)の場合は delete_old 関数で古いレコードを削除しています。stdRooms で初期設定の部屋数を持ち歩いているのが気持ち悪いので、これも今後の課題としておきます。
ROOMクラスのデータベース処理
空室更新処理です。テーブル名を引数で渡しているのは、wp_rooms のように頭に自動で追加される接頭辞(プレフィックス)に対応するためにプラグインファイル側で処理しているからです。
wp-contents/plugins/drtehotel/class/rooms.php
function update_rooms($table_name) { global $wpdb; if ( is_admin() ) { $last = intval($_POST['lastday']); $month = $_POST['month']; for ($i=0; $i<$last; $i++) { if( $i<9 ) $dd = "0" . strval($i+1); else $dd = $i + 1; $sd = $month . "-" . $dd; $rc = 'r_count' . $i; $rc = intval(mb_convert_kana($_POST[$rc], "a")); $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET r_count = %d WHERE r_season = %s AND s_date = %s" , $rc, $this->rtype, $sd )); } } }
データベース処理の時は必ず is_admin で権限の確認をするようにしてみました。$_POST[‘lastday’]で最終日、$_POST[‘month’]で 2013-06 という形式の対象となる日付を取得しています。$this->rtype は部屋の種類です。
function delete_old($table_name) { global $wpdb; if ( is_admin() ) { $startday = date("Y-m") . "-01"; $sql = 'DELETE FROM ' . $table_name . ' s_date<"' . $startday . '"'; $results = $wpdb->query($sql); } }
削除処理は今月の1日以前(つまりもう使用しなデータ)を削除しています。
function refresh_table($table_name, $month) { global $wpdb; if ( is_admin() ) { $yy = mb_substr($month,0,4); // 年の取り出し $mm = mb_substr($month,5,2); // 月の取り出し $startday = $yy . "-" . $mm . "-01"; $last = date('t', mktime(0,0,0, $mm, 1, $yy)); $lastday= date('Y-m-t', mktime(0,0,0, $mm, 1, $yy)); $sql = 'SELECT COUNT(*) FROM ' . $table_name . ' WHERE r_season= "' . $this->rtype . '" AND (s_date>="' . $startday . '" AND s_date<= "' . $lastday . '" )'; $results = $wpdb->get_var($sql); if ($results<20) { $sql = 'DELETE FROM ' . $table_name . ' WHERE r_season="' . $this->rtype . '" AND (s_date>="' . $startday . '" AND s_date<= "' . $lastday . '" )'; $results = $wpdb->query($sql); for ($i=0; $i<$last; $i++) { if( $i<9 ) $dd = "0" . strval($i+1); else $dd = $i + 1; $dd = $yy . "-" . $mm . "-" . $dd; $wpdb->query( $wpdb->prepare( "INSERT INTO $table_name ( plan_id, s_date, r_count, r_season ) VALUES ( %s, %s, %d, %s )", strval($i+1), $dd, $this->stdRooms, $this->rtype ) ); } } } }
SELECT COUNT(*)を$wpdb->get_varすることでレコード数を取得しています。レコード数が少ない時はデータが無いと判断して新しいデータを追加します。20件以下の場合はデータレコードが異常と判定し、一度レコードを削除してから新規に追加しています。$this->stdRoomsは初期設定された空き部屋数。
function load_data($table_name) { global $wpdb; if ( is_admin() ) { $yy = mb_substr($this->rdate,0,4); // 年の取り出し $mm = mb_substr($this->rdate,5,2); // 月の取り出し $startday = $yy . "-" . $mm . "-01"; $lastday= date('Y-m-t', mktime(0,0,0, $mm, 1, $yy)); $results = $wpdb->get_results($wpdb->prepare( "SELECT * FROM $table_name WHERE r_season=%s AND (s_date>=%s AND s_date<=%s) ORDER BY s_date", $this->rtype, $startday, $lastday )); //var_dump($results); foreach ($results as $row) { $this->aki[] = $row->r_count; } } }
レコードの読み込み処理です。日付順にORDERして配列に読み込んで置きます。のちほどのHTML生成過程で配列を読み込みながらフォームを表示します。
function create_calendar() { $yy = mb_substr($this->rdate,0,4); // 年の取り出し $mm = mb_substr($this->rdate,5,2); // 月の取り出し $last = date('t', mktime(0,0,0, $mm, 1, $yy)); // 末日 $week = array( '日', '月', '火', '水', '木', '金', '土' ); $tmp = ""; for ($i=0; $i<$last; $i++) { if( $i<9 ) $dd = "0" . strval($i+1); else $dd = $i + 1; $youbi = date('w', mktime(0,0,0, $mm, $dd, $yy)); $tmp .= '<tr>'; $tmp .= '<td>' . $yy . "年" . $mm . "月" . $dd . "日</td>"; if( $youbi==0 ) $tmp .= '<td class="sun">' . $week[$youbi] . "曜日</td>"; else if( $youbi==6 ) $tmp .= '<td class="sat">' . $week[$youbi] . "曜日</td>"; else $tmp .= '<td class="week">' . $week[$youbi] . "曜日</td>"; $tmp .= '<td>'. $this->rtype . '</td>'; $tmp .= '<td>'; $tmp .= '<input type="text" name="r_count' . $i . '" value="' . $this->aki[$i] . '">'; $tmp .= '<input type="hidden" name="s_date' . $i . '" value="' . $yy . '-' . $mm . '-' . $dd . '" />'; $tmp .= '</td>'; $tmp .= '</tr>'; } $tmp .= '<input type="hidden" name="lastday" value="' . $last . '" />'; $tmp .= '<input type="hidden" name="month" value="' . $yy . '-' . $mm . '" />'; return $tmp; }
HTML 生成部分。特に難しいところは無いような気がします。
今回はちょと長かったなぁ
Sponsored Link
関連記事
-
ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(4)データベース基礎
今回はWordPressのプラグイン開発で必要になるデータベースに関する知識ついて調べました。この辺
-
ワードプレス用宿泊予約プラグイン開発「空室情報の表示」とか
久しぶりのワードプレスネタ。全然完成しませんわ。今回は最初にブラウザのキャッシュを切る作業をしました
-
ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(1)
初心者が、あらためて WordPress のプラグインを一から作る経過報告。たぶん連載記事ですね。途
-
ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(8)セキュリティ対策
前回紹介したホームページを参考にソースを書き換えてみました。特に標準の option テーブルにレコ
-
ワードプレス用宿泊予約プラグイン開発「空室情報読み込み」
前回までに作ったカレンダーに空室状況を表示させます。最初に表示欄を作って確認してからデータベースの読
ご質問は掲示板へお願いいたします。