コンテンツ管理
luno のコンテンツ管理は エントリ(Entry) と リビジョン(Revision) を中心に設計されています。このページでは、コンテンツの作成から公開まで、承認ワークフローの全体像と各操作の詳細を説明します。
今すぐやる(3 行)
- Headless CMS 概要 の完成形を確認する
- Console で下書き →(必要ならレビュー)→ 公開 まで進める
- 公開 API で
include_snapshot=trueの一覧が返ることを確認する
エントリとリビジョンの概念
luno のコンテンツは以下の階層で管理されます:
フォームセット(コンテンツ型)
└── エントリ(コンテンツの単位、slug でアクセス)
└── リビジョン(エントリの版、承認ワークフローを持つ)
└── スナップショット(フィールド値の記録)- エントリは記事・ページ・商品などコンテンツの「個体」です。slug(URL 識別子)で一意に識別されます。
- リビジョンはエントリの特定バージョンです。編集するたびに新しいリビジョンが作られます。
- 公開 API はエントリの
published状態のリビジョンのみを返します。
リビジョンのステータス
| ステータス | 説明 | 公開 API から見える |
|---|---|---|
draft | 下書き。編集者が作業中の状態 | — |
pending_review | レビュー申請中。承認待ち | — |
scheduled | 承認済みで、指定日時に自動公開待ち | — |
published | 公開中。公開 API から取得できる | ✓ |
rejected | 差し戻し。再編集が必要 | — |
superseded | 後続のリビジョンに置き換えられた | — |
承認ワークフロー
draft
│
├─[submit_for_review]──→ pending_review
│ │
│ ┌─────────┴──────────┐
│ [approve, 即時] [approve, 日時指定]
│ │ │
│ published scheduled
│ │
│ [Cron 約 5 分間隔]
│ │
│ published
│
└─[reject]──→ rejected ──[reopen]──→ draft差し戻しフロー
pending_review または scheduled のリビジョンを差し戻す場合:
- 差し戻し(reject)→ ステータスが
rejectedになる - 編集者が「再編集」(reopen)→
draftに戻る - 再度レビュー申請
取り下げフロー
申請をキャンセルしたい場合は「取り下げ」(withdraw_review)操作で pending_review → draft に戻せます。
ロールと操作権限
| ロール | 説明 | できる操作 |
|---|---|---|
tenant_admin | プロジェクト管理者 | 全操作(承認・公開・設定変更を含む) |
tenant_user | 一般ユーザー | 作成・編集・レビュー申請まで |
editor / reviewer について
旧バージョンとの互換性のため editor と reviewer というエイリアスが存在しますが、実際の権限は tenant_user と同等です。承認・公開操作は tenant_admin のみが実行できます。
エントリの操作
新規作成
- サイドバーからフォームセットを選択
- 「新規エントリ」ボタンをクリック
- slug を設定する(自動生成されますが変更可能)
- 各フィールドに値を入力して「保存」
slug について
slug は URL の一部になります(例: /public/v1/form-sets/blog/entries/my-slug)。英数字とハイフンのみ使用可能です。一度公開後に変更すると旧 slug への 301 リダイレクトが自動作成されますが、SEO 観点から変更は最小限にしてください。
編集と自動保存
エントリ編集画面では変更が自動的に保存されます。保存のたびに draft リビジョンが更新されます。公開済みのエントリを編集する場合は、既存の公開リビジョンに影響せず、新しい draft リビジョンが作られます。
複製
既存エントリを元に新しいエントリを作成します。全フィールドの値をコピーした draft が作成されます。slug は {元の slug}-copy として生成されます。
削除
エントリを削除すると、すべてのリビジョンとそれに紐付くスナップショットが削除されます。公開中のエントリを削除した場合、公開 API はその slug に対して 404 を返すようになります。
スケジュール公開
承認時に 「公開日時」 を指定すると、ステータスが scheduled になります。
承認 → scheduled(publish_at = 2025-02-01T00:00:00Z)
↓ Cron チェック(約 5 分間隔)
published(2025-02-01T00:00:00Z 以降)タイムゾーンの扱い
管理画面ではブラウザのローカルタイムゾーンで日時を表示・入力できます。内部的には UTC で保存されます。
Cron の精度
スケジュール Cron は約 5 分間隔で実行されるため、指定時刻から最大約 5 分の遅延が発生する場合があります。秒単位の精度が必要な場合はスケジュール公開には向きません。
スケジュールのキャンセル
scheduled 状態のリビジョンは:
- 差し戻し(reject):
rejectedに変更 - 取り下げ(withdraw_review):
draftに戻す
どちらの操作でも自動公開はキャンセルされます。
一括スケジュール
エントリ一覧画面でエントリを複数選択し、「一括操作」→「スケジュール公開」から複数エントリを同時にスケジュールできます。
プレビュー
公開前のコンテンツをプレビューするには、エントリ編集画面の「プレビューリンクを生成」から署名付きリンクを取得します。
GET /public/v1/preview/revisions?token=<JWT>| 仕様 | 詳細 |
|---|---|
| 有効期限 | 15 分(JWT 署名付きトークン) |
| 対象 | すべてのステータスのリビジョン(draft 含む) |
| 認証 | トークンのみ(別途ログイン不要) |
| 期限切れ | 401 エラーを返す |
プレビュー URL を関係者に共有することで、本番公開前にコンテンツの確認を依頼できます。
# プレビュー取得例(管理画面から発行したトークンを使用)
curl "https://your-domain.com/public/v1/preview/revisions?token=eyJhbGciOiJIUzI1NiJ9..."slug と自動リダイレクト
エントリの slug を変更すると、旧 slug への GET リクエストに対して 301 リダイレクト が自動的に作成されます。
旧: GET /public/v1/form-sets/blog/entries/old-slug
→ HTTP 301
Location: /public/v1/form-sets/blog/entries/new-slugこれにより検索エンジンの評価が引き継がれ、SEO への影響が最小限になります。ただし、フロントエンドで URL を直接ハードコードしている場合はリダイレクトに追従する必要があります。
多言語対応(ロケール)
概要・プラン上限・AI 翻訳は 多言語 を参照してください。
text、textarea、tiptap タイプのフィールドはサイト多言語 ON 時に言語別になります(共通にしたい場合は locale_shared)。
ロケールの指定
公開 API リクエスト時に ?locale= クエリパラメータを指定します:
# 日本語で取得
curl "https://your-domain.com/public/v1/form-sets/blog/entries/my-post?locale=ja"
# 英語で取得
curl "https://your-domain.com/public/v1/form-sets/blog/entries/my-post?locale=en"指定したロケールのデータが存在しない場合は、デフォルトロケールの値が返されます。
管理画面での入力
ローカライズ可能なフィールドでは、言語切り替えタブが表示されます。各言語ごとに別の値を入力できます。
担当者アサイン(Business プラン以上)
Business プラン以上では、エントリに担当者(assignee)を設定できます。アサインされたユーザーにはエントリのステータス変更時に通知が送られます。
CSV エクスポート
エントリ一覧画面から CSV 形式でデータをエクスポートできます。エクスポートには現在表示中の全エントリ(フィールド値含む)が含まれます。
次のステップ
- フォームビルダー — フィールドタイプとコンテンツモデルの設計
- スケジュール公開 — スケジュール機能の詳細設定
- 公開 API リファレンス — API の全エンドポイント仕様