本文へスキップ
開発風景

静的サイトに予約投稿を後付けする。DBを足さずに

静的サイトに予約投稿を後付けする。DBを足さずに

予約投稿の正体は、時限公開の仕組みではなく「まだ時間が来ていないものを隠す」フィルタだった。

「記事を書き溜めておいて、毎朝9時に1本ずつ公開したい」。

自分たちで運用している修理店のサイトでは、それがもう動いています。同じことをこのポートフォリオでもやりたくなりました。

作りはじめる前に、動いているほうの中身を読みました。予約投稿の実装がどこにあるのかを探すためです。

1探しても、予約投稿の処理が見つからない

cronを疑いました。定時に「公開する」処理が走っているはずだ、と。

ありませんでした。

代わりに見つかったのは、記事一覧を取り出すクエリの1行です。

ここがポイント

'Entry.published <=' => date('Y-m-d H:i:s')

記事一覧の抽出条件(CakePHP製のCMS)

これだけでした。未来の日時でデータを入れておくと、その時刻が来るまで一覧の条件に引っかからない。 時刻を過ぎた瞬間から、何もしなくても出る。

公開処理は存在しないのではなく、必要なかったわけです。予約投稿だと思っていたものは、時限で表に出す仕組みではなく、時間が来ていないものを隠すフィルタでした。

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

この記事が役に立ったらシェアしてください