台風に負けて予約システムを自作

どうも、中木で渡船をやっている殿羽根丸の船長です。

今日は海の話ではなく、予約システムを作り直した話をします。
きっかけは台風でした。だいたいいつも、台風です。

予約は、昔書いたCGIが守っていた

夏の営業が終わると、10月は土日を中心に「殿羽根丸ボートシュノーケリング」をやっています。
その予約を受けていたのは、ずいぶん前に自分で書いたCGIでした。WordPressの記事にiframeで埋め込んで、何年も働いてもらっていたものです。

ちゃんと動きます。動くんですが、弱点が二つありました。

  • 中止を決めたとき、予定表と記事と予約ページを、それぞれ手で書き換えないといけない
  • 「その日に誰が来るのか」を、すぐに一覧で見られない

晴れの日なら困りません。困るのは、海が荒れたときです。

予定を出すと、台風が来る

今年の10月もそうでした。予定を出して、予約が入り始めたところで台風が本州方向へ進路を変え、10月24日・25日は2日続けて欠航。31日も怪しい。

こういうときの船長の仕事は、波を見ることと、書き換え忘れを防ぐことです。
海況記事の日程は「開催予定」のまま、予約フォームでは中止の日がまだ選べる。これをやると、来なくていいお客さんが朝の中木に来てしまいます。それだけは避けたい。

そこで決めました。開催日の情報を一か所で管理して、どこに出しても同じ内容になるようにしようと。

エンジンには手を入れず、計器を外付けする

WordPressをいじったことがある人なら、functions.phpに書き足すのが手っ取り早いのはご存じだと思います。でも、今回はそれをやらないと最初に決めました。

テーマを更新すれば消えるし、一文字間違えればサイトごと止まる。船でいえば、走っている最中のエンジンに直接手を突っ込むようなものです。
なので、独立したプラグインとして作り、ZIPで上書き更新する方式にしました。外付けの計器を一つ足す感覚です。不具合が出たら、前のZIPに戻せば元どおりになります。

コードを書いたのは相棒のAIです。何を作るか、何を作らないかを決めて、本番で試すのは船長の役目。この分担がうまくはまりました。

できあがった仕組みは単純です。管理画面で日付と状態(受付中・海況確認中・中止など)を選ぶと、記事の予定表と予約フォームの選択肢が同時に切り替わります。
記事に予定表を出すときは、この1行を貼るだけです。

[donbane_schedule link="booking"]

申込ボタンを押すと、その日付を選んだ状態で予約フォームが開きます。

小さな事件簿

もちろん、すんなりとは進みません。航海に小さなトラブルはつきものです。

事件その1 自分宛てのメールに「なりすまし注意」

予約の通知メールが届くたびに、Yahooメールが「なりすましの可能性があります」と警告を出すようになりました。自分のサイトから自分に送っているメールなのに、です。
原因は送信元の認証でした。XserverでDKIMをONにしたら、警告はあっさり消えました。

事件その2 8が一つ多い

設定を入れたのに、なぜか申込ボタンが出ない。しばらく悩んで設定欄をよく見たら、ページIDが「18272」のところ「182728」になっていました。8が一つ多い。
海図の数字を一桁読み違えれば座礁します。ウェブでも同じでした。

事件その3 中止にしたのに、古い表示が残ったら

一番怖かったのはキャッシュです。中止に切り替えたのに、古い「受付中」の表示が残ってしまったら、作った意味がありません。
サーバー側のキャッシュ設定を一つずつ確認し、中止に切り替えると即座に表示が変わることを確かめました。

ついでに、古い画面を開いたまま中止の日を選んで送信されるケースにも備えて、サーバー側でも弾くようにしています。判定の中身はこれだけです。

return $row
    && !in_array($row->event_status, array('中止','終了'), true)
    && $row->crowd_status !== '受付終了'
    && $row->event_date >= wp_date('Y-m-d');

中止・終了・受付終了、それに過去の日付は申し込めない。船の出航判断に比べたら、ずいぶん素直なルールです。

有料版の誘惑

予約が入り始めると、次の欲が出てきます。「この日は誰が来るんだっけ?」

フォームにはFluent Formsの無料版を使っています。ところが、無料版の検索は希望日の欄を対象にしておらず、日付で絞り込めません。実際に試して確認しました。
絞り込みはPro版の機能で、1サイト年額$79から、買い切りなら$349からです。

買う前に調べてみると、Pro版でも「日付ごとの人数集計」や「中止時の一括連絡」は標準機能にありません。お金を払っても、本当に欲しいものは付いてこない。
それなら、読むだけの小さな画面を自分で足せば済みます。

船長の一言で、仕様が決まる

構想は、放っておくとどんどん膨らみます。日別のCSV出力、初参加者の人数、中止連絡用の電話番号一覧……。案を並べられて、聞かれました。「どこまで作りますか?」

正直、どんな物ができるのかよく分からなかったので、こう答えました。

「未実施の日付順に、名前と連絡先が出るくらいで十分」

これで仕様が決まりました。結果、一回の更新で完成です。

  • 今日以降の開催日が、日付順に並ぶ
  • 日ごとに「2件/合計5名」と件数・人数が出る
  • 代表者、人数、電話、メールが一覧で見られる
  • スマホで電話番号をタップすれば、そのまま発信
  • 「全員にメール(BCC)」ボタンで、中止の連絡が一度に送れる

フォームのデータは読むだけで、一切書き換えません。個人情報をもう一か所にコピーして持つこともしません。中身はこの読み取りだけです。

SELECT id, response, status, created_at
FROM wp_fluentform_submissions
WHERE form_id = %d
  AND status NOT IN ('trashed','spam')

キャンセルの申込はゴミ箱へ移せば、一覧からも消えます。運用のルールまで、これで足りました。

現場の道具は、機能が多いほどいいわけではありません。波を見ながらでも片手で使えることのほうが大事です。

そして今日も、台風

この記事を書いている今も、10月24日・25日は欠航、31日も厳しい見込みです。
でも、もう慌てません。管理画面で「中止」を一つ選べば、記事の予定表も予約フォームも同時に切り替わります。

下の表も、このシステムで動いています。
11月7日(土)・8日(日)は、希望者がいらっしゃれば追加で開催します。
台風のあとの澄んだ海を見に来ませんか。

日付開催状況予約状況申込
10/24(土)中止――
10/25(日)中止――
10/31(土)海況確認中余裕あり申込
11/7(土)希望者募集中余裕あり申込
11/8(日)希望者募集中余裕あり申込

海が荒れた日は、船長はパソコンの前にいます。

ABOUT US
「かっちゃん|ヒリゾ浜渡し船長」
中木・ヒリゾ浜の現地から、運航情報や海況、観光情報などを発信しています。 ヒリゾ浜渡しの船長として、実際の海を見ながら、現地ならではの情報をお伝えしています。