PaylaodCMSのdraft=falseは下書きを除外する訳ではない
罠すぎる。ちなみに初期値はfalse。
罠
特に何も考えず最新のレコードを取得するとしよう。こうだと思うじゃん?
| 現在のレコードの状態 | draft=true | draft=false |
|---|---|---|
| 公開 | 普通に取得 | 普通に取得 |
| 非公開 | 普通に取得 | 取得できない |
違う。正解はこう。
| 現在のレコードの状態 | draft=true | draft=false (初期値) |
|---|---|---|
| 公開 | 普通に取得 | 普通に取得 |
| 非公開 | 普通に取得 | 過去に公開されていた瞬間があればそれを取得 |
もう明らかにやばい。
- draftをfalseにしているのにデータが取れてしまう
- さらにその取れてしまうデータは(最新を指定していても)最新じゃない
- これらを引き起こすdraft=falseは初期設定
激しくやばい。
公式にもこの挙動は書いてない。おそらくどっかにはあるんだろうがぱっと見には無い。
困るケース
直で非公開にしたデータはちゃんと隠れるのに、 一度公開したデータは非公開にしても見え続ける。やばい。
対策
draftの存在は全て忘れて{_status}のキーで絞り込むしかない。なおこのキーはdraft, publishedの2値かと思いきやversions: { drafts: true }を指定していないコレクションについてはundefinedになる。ちなみにdraft, publishでもなくdrafted, publishedでもない。罠に罠を重ねないで。
結論
公開したいものが公開されていなかった、も良くないが逆はもっとやばい。どうかお願いだからやばい方に設計を寄せないでほしい。以上。
PREV
2026-04-23
Cloudflare Tunnelは絶対もっと注目されていい