*

ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(12)空室管理画面 C

公開日: : 最終更新日:2013/07/06 WordPress ,

空室情報のデータベース処理を一気に終えました。ごちゃごちゃしてきたので、もっとスッキリ書く方法が無いか模索したのですが、私の知識ではこれが精一杯。

こまかい調整は完了後に改めて試してみるということで、今回は先に進みます。

プラグインファイルのメイン部分

大きく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 で初期設定の部屋数を持ち歩いているのが気持ち悪いので、これも今後の課題としておきます。

スクリーンショット 2013-07-01 3.51.13

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のプラグインで独自のページを作る方法がわからない

Wordpressのプラグインを開発していて疑問がでてきました。プラグイン独自のページはどうすればい

記事を読む

ワードプレス用宿泊予約プラグイン開発「空室カレンダー表示」

前回ネットで検索して見つけた calendar($year = "", $month = "") 関

記事を読む

WordPress用プラグインで使う宿泊予約用カレンダーをPHPで書くぜ

ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作るシリーズで使う、空き部

記事を読む

ワードプレス用宿泊予約プラグイン開発「空室情報読み込み」

前回までに作ったカレンダーに空室状況を表示させます。最初に表示欄を作って確認してからデータベースの読

記事を読む

ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(5)メニュー階層化

今回はオリジナルプラグインの管理画面でのメニュー作成について。かなりすんなりと出来てしまったので短め

記事を読む

ご質問は掲示板へお願いいたします。

Message

メールアドレスが公開されることはありません。

CAPTCHA


Optionally add an image (JPEG only)

Sponsored Link

気になる情報・新製品発見メモ

日頃ネットをウロウロしていて記事にするほどでもない情報、記事にするほど

録音ミニスタジオ完成の図と12色のリモコンLED電球

構想10年・制作3日の自宅音声収録スタジオの完成です。 ご覧の通

録音(撮影)ミニスタジオの制作DIY

そんな訳で吸音スポンジを壁に取り付けてみた続きです。 調子に乗っ

YAMAHA MG10UXミキサー到着

2018年 物置(事務所or作業場or遊び部屋)の一角を音声収録&撮影

そしてzbrush coreをインストールしてみる話

Blenderに挫折してから一気に3Dにのめり込んでいます。 ま

録音環境を改善する!吸音パネルをDIYとか

久々に更新! すっかり更新グセが抜けてしまい、イマイチやる気が出

→もっと見る




  •  

PAGE TOP ↑