MTS Simple Bookingビジネス版のユーザ情報の生年月日と性別を予約情報に反映する方法

Facebooktwitter

前回、MTS Simple Bookingビジネス版のユーザ登録に生年月日と性別を追加しました。予約フォームでも生年月日と性別を登録できますが、予約フォームのほうは毎回選択しなければいけません。
そこで、今回はユーザ情報から予約フォームに自動で反映させる方法を紹介します。
「ユーザ情報に生年月日と性別が入っていたら、予約フォームで選択させる必要ないのでは?」って考えもありますが、クライアントの船宿ではログインしていなくても予約はできるようにしているので、予約フォームからは外せません。
さらに今回は、予約情報の生年月日と性別をユーザ情報ほうにも反映する機能も追加します。その理由は後述します。

修正するファイルは2つです。

フォームの修正

mtssb-booking-form.phpの839行目あたりに以下の「ここから」「ここまで」のコードを挿入します。
ここでは、user_metaテーブルからmtssb_entryというキーで保存されている情報を取り出して、生年月日と性別を$client配列にセットしています。
生年月日は日付を’yyyy-mm-dd’の形式にして、MTS_WPDateクラスのインスタンスである$client[‘birthday’]のset_date関数に引数として渡しておくだけで、あとは勝手にプルダウンができるようです。(すごいですね)
そこから先のフォームの表示は既存の機能で処理されます。

// ログイン中であればログインユーザー情報をセットする
} elseif (is_user_logged_in() && empty($client['name']) && empty($client['email'])) {
	get_currentuserinfo();
	$client['company'] = get_the_author_meta('mtscu_company', $current_user->ID);
	$client['name'] = $current_user->last_name . ' ' . $current_user->first_name;
	$client['furigana'] = get_the_author_meta('mtscu_furigana', $current_user->ID);
	$client['email'] = $current_user->user_email;
	$client['postcode'] = get_the_author_meta('mtscu_postcode', $current_user->ID);
	$client['address1'] = get_the_author_meta('mtscu_address1', $current_user->ID);
	$client['address2'] = get_the_author_meta('mtscu_address2', $current_user->ID);
	$client['tel'] = get_the_author_meta('mtscu_tel', $current_user->ID);
/** ここから **/
// ユーザデータから生年月日、性別を取得 フォームの初期値にする
	$client['mtssb_entry'] = get_the_author_meta('mtssb_entry', $current_user->ID);
	if (isset($client['mtssb_entry']['custom'])) {
	    $client['gender'] = $client['mtssb_entry']['custom']['gender'];
	    $client['birthday'] = new MTS_WPDate;
	    $birthday = $client['mtssb_entry']['custom']['birthday']['year']."-".$client['mtssb_entry']['custom']['birthday']['month']."-".$client['mtssb_entry']['custom']['birthday']['day'];
	   $client['birthday']->set_date($birthday );
	}
/** ここまで **/
	$this->booking['user_id'] = $current_user->ID;
}

// フォーム並び順配列
$column_order = explode(',', $this->reserve['column_order']);

以上これだけで、登録ユーザ情報から予約フォームの生年月日と性別にデフォルト値をセットできます。

ユーザ情報への反映

ここで、予約フォームから得た生年月日と性別を登録ユーザ情報にも反映させる処理を加えようと思います。
理由は、運用途中から生年月日と性別を登録してもらうようにしたため、既存のユーザにはそれらの情報が登録されていません。
今のところプロフィール修正にもそれらを登録する部分はありませんし、間違って登録してしまっても、修正する方法がありません。
そこで、予約フォームの情報を常に登録ユーザ情報にも反映させれば、少なくともアクティブユーザの情報は予約するたびに自然に最新のものになります。

修正するファイルはmtssb-booking.phpです。
先ずはデータをユーザ情報に登録する新しい関数をMTSSB_Booking クラス内に作ります。

        /**
         * 予約データから生年月日と性別をユーザデータに保存
         * 
         */
        protected function _set_gender_birthday_to_userinfo() {
	    global $wpdb;

	    //ユーザ情報の取り出し
	    $meta_key = 'mtssb_entry';

	    $uinfo= $wpdb->get_var( $wpdb->prepare( 
	    "SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = %s AND user_id = %d", 
	    $meta_key, $this->record['user_id']
	    ) );

	    $client = unserialize($this->record['client']); //予約フォームから来たデータ

	    if (!empty($uinfo)) {
	    $user = unserialize($uinfo); //wp_usermetaに入っている情報
	    $user['custom']['gender'] = $client['gender'];
	    $birthday = explode('-', $client['birthday']);
	    $user['custom']['birthday']['year'] = $birthday[0];
	    $user['custom']['birthday']['month'] = $birthday[1];
	    $user['custom']['birthday']['day'] = $birthday[2];
	    }
	    $uinfo = serialize($user);

	    $str = "update " . $wpdb->usermeta . " set meta_value = '" . $uinfo . "'" .
	    " where meta_key = 'mtssb_entry' and user_id = " . $this->record['user_id'];

	    $wpdb->query($str);
	    return;
        }

ユーザ情報をusermetaテーブルから取り出し、その生年月日と性別部分をフォームから来たそれらに置き換えて、再びusermetaテーブルに戻しています。

次に、この関数を呼び出すコードを予約情報を保存した後の656行目あたり、「return $insert_id;」の前に追記します。

	if ($this->record['user_id']) {
		$this->_set_gender_birthday_to_userinfo();
	}

これで、予約フォームから得た生年月日と性別がユーザ情報に反映されます。
これは、MTS Simple Bookingビジネス版のユーザ登録機能で登録されたユーザにしか使えません。usermetaテーブルに’mtssb_entry’というメタキーで、他の情報がすでに入っていることが前提だからです。
‘mtssb_entry’がない場合は新規に予約情報からユーザ名や住所など、全てを新たに登録するように書き加えることも可能ですが、自分の場合、顧客ユーザで、’mtssb_entry’を持っていないユーザは一人もいなかったため、その機能は省きました。

いづれにしろ、予約部分をいじるため、バグがあると、予約が取れなくなる恐れもありますので、試験は何度も丁寧に行ってください。