どうも、中木で渡船をやっている殿羽根丸の船長です。
今日は海の話ではなく、予約システムを作り直した話をします。
きっかけは台風でした。だいたいいつも、台風です。
予約は、昔書いたCGIが守っていた
夏の営業が終わると、10月は土日を中心に「殿羽根丸ボートシュノーケリング」をやっています。
その予約を受けていたのは、ずいぶん前に自分で書いたCGIでした。WordPressの記事にiframeで埋め込んで、何年も働いてもらっていたものです。
ちゃんと動きます。動くんですが、弱点が二つありました。
- 中止を決めたとき、予定表と記事と予約ページを、それぞれ手で書き換えないといけない
- 「その日に誰が来るのか」を、すぐに一覧で見られない
晴れの日なら困りません。困るのは、海が荒れたときです。
予定を出すと、台風が来る
今年の10月もそうでした。予定を出して、予約が入り始めたところで台風が本州方向へ進路を変え、10月24日・25日は2日続けて欠航。31日も怪しい。
こういうときの船長の仕事は、波を見ることと、書き換え忘れを防ぐことです。
海況記事の日程は「開催予定」のまま、予約フォームでは中止の日がまだ選べる。これをやると、来なくていいお客さんが朝の中木に来てしまいます。それだけは避けたい。
そこで決めました。開催日の情報を一か所で管理して、どこに出しても同じ内容になるようにしようと。
エンジンには手を入れず、計器を外付けする
WordPressをいじったことがある人なら、functions.phpに書き足すのが手っ取り早いのはご存じだと思います。でも、今回はそれをやらないと最初に決めました。
テーマを更新すれば消えるし、一文字間違えればサイトごと止まる。船でいえば、走っている最中のエンジンに直接手を突っ込むようなものです。
なので、独立したプラグインとして作り、ZIPで上書き更新する方式にしました。外付けの計器を一つ足す感覚です。不具合が出たら、前のZIPに戻せば元どおりになります。
コードを書いたのは相棒のAIです。何を作るか、何を作らないかを決めて、本番で試すのは船長の役目。この分担がうまくはまりました。
できあがった仕組みは単純です。管理画面で日付と状態(受付中・海況確認中・中止など)を選ぶと、記事の予定表と予約フォームの選択肢が同時に切り替わります。
記事に予定表を出すときは、この1行を貼るだけです。
[donbane_schedule link="booking"]申込ボタンを押すと、その日付を選んだ状態で予約フォームが開きます。
小さな事件簿
もちろん、すんなりとは進みません。航海に小さなトラブルはつきものです。
設定を入れたのに、なぜか申込ボタンが出ない。しばらく悩んで設定欄をよく見たら、ページIDが「18272」のところ「182728」になっていました。8が一つ多い。
海図の数字を一桁読み違えれば座礁します。ウェブでも同じでした。
一番怖かったのはキャッシュです。中止に切り替えたのに、古い「受付中」の表示が残ってしまったら、作った意味がありません。
サーバー側のキャッシュ設定を一つずつ確認し、中止に切り替えると即座に表示が変わることを確かめました。
ついでに、古い画面を開いたまま中止の日を選んで送信されるケースにも備えて、サーバー側でも弾くようにしています。判定の中身はこれだけです。
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日(日)は、希望者がいらっしゃれば追加で開催します。
台風のあとの澄んだ海を見に来ませんか。
海が荒れた日は、船長はパソコンの前にいます。













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