静的サイトに予約投稿を後付けする。DBを足さずに
“予約投稿の正体は、時限公開の仕組みではなく「まだ時間が来ていないものを隠す」フィルタだった。”
「記事を書き溜めておいて、毎朝9時に1本ずつ公開したい」。
自分たちで運用している修理店のサイトでは、それがもう動いています。同じことをこのポートフォリオでもやりたくなりました。
作りはじめる前に、動いているほうの中身を読みました。予約投稿の実装がどこにあるのかを探すためです。
1探しても、予約投稿の処理が見つからない
cronを疑いました。定時に「公開する」処理が走っているはずだ、と。
ありませんでした。
代わりに見つかったのは、記事一覧を取り出すクエリの1行です。
ここがポイント
'Entry.published <=' => date('Y-m-d H:i:s')
これだけでした。未来の日時でデータを入れておくと、その時刻が来るまで一覧の条件に引っかからない。 時刻を過ぎた瞬間から、何もしなくても出る。
公開処理は存在しないのではなく、必要なかったわけです。予約投稿だと思っていたものは、時限で表に出す仕組みではなく、時間が来ていないものを隠すフィルタでした。
2だったらDBは要らない
うちのポートフォリオは記事をファイルで持っています。データベースにブログのテーブルはありません。
最初は「予約投稿するならDBに移すしかない」と思っていました。でも、さっきの1行の意味が分かったあとだと、要らないと分かります。必要なのは次の2つだけです。
1つ目。記事に公開日時を持たせて、描画するときに「今より未来のものを外す」。
2つ目。ページを一定間隔で作り直す設定を入れる。これが無いと、ビルドした瞬間の状態で固まってしまい、9時になっても何も起きません。
同じ「予約投稿」を、2つのサイトでどう実現しているか
| CMS側(修理店サイト) | こちら(静的サイト) | |
|---|---|---|
| 記事の置き場所 | データベース | TypeScriptのファイル |
| 予約の入れ方 | 未来日でINSERT | 未来日時を書いてコミット |
| 公開の判定 | SELECT時に published <= 現在 | ◎描画時に publishedAt <= 現在 |
| 公開処理 | 無し | ◎無し |
| 定時実行 | 不要 | ◎不要(ページ再生成の間隔だけ設定) |
追加したファイルは1つ。公開判定をまとめた小さなモジュールだけです。一覧・記事ページ・RSS・サイトマップ・作品ページの関連記事、記事を読んでいる場所を全部そこ経由に変えました。
3引っかかったところ
時刻の書き方でひとつ。日時に +09:00 を付け忘れると世界標準時として扱われ、9時間ずれて公開されます。参考にした側のCMSでも同じ事故が起きていて、修正の記録が残っていました。同じ穴に落ちるところでした。
もうひとつ、記事ページのURLです。未来の記事は一覧から消えても、URLを直接叩けば読めてしまうのでは意味がない。参考にしたCMSは未来日の記事を404にしていたので、こちらも同じにしました。予約中はページを作らず、時刻が来てから作られるようにしています。
4書くのは人間(というか私)
記事そのものを自動生成する仕組みは作りませんでした。文章まで機械に任せると、読めばすぐ分かるものが出てくるからです。
代わりに、採点だけ機械にやらせています。AIっぽい言い回しが混ざっていないか、文末が単調でないか、具体的な数字が3つ以上あるか、失敗や迷いが書かれているか。100点満点で採点して、90点未満は公開しない。この記事も通してから出しています。
採点はローカルで動くので無料です。お金がかかるのはサムネイル画像の生成だけ。1本あたり十数円という規模です。
5正直に言うと
この仕組みで一番怖いのは、技術ではなくネタ切れです。1日1本の枠を作るということは、365日分の「書きたいこと」が要るということでもある。
なので、書けそうなことを台帳にして貯めるところから始めました。まだ記事にしていない作品が何十件も残っているので、しばらくは持ちます。しばらくは。
この記事自体、その仕組みで予約投稿されたものです。書いたのは前日で、あなたが読んでいるいま、私は別のことをしています。
この記事を書いた人
NextCode(沖縄県宜野湾市)は、iOSアプリ・ホームページ/LP・NFCデジタル名刺・AI業務自動化を作っている開発スタジオです。 ここで書いているのは、実際に作って公開したものと、その過程で詰まったことだけです。
お電話でも大丈夫です → 098-959-6119