# 設計書 — Five United コーポレートサイトを Movable Type 9.3 で運用する

| | |
| --- | --- |
| 対象 | ファイブユナイテッド株式会社（架空）のコーポレートサイト |
| 入力 | `requirements.md`（要件）／ `mockup/`（見た目と URL）／ `content/`（中身） |
| 構築 | `mtb`（Movable Type Builder CLI）。mtb でできないことは §13 に「人が管理画面でする作業」として分けた |
| 状態 | **設計のみ。MT にはまだ何も作っていない**（読み取りだけ行った。§1） |
| 改訂（第4版） | 運用マニュアル（`manual/`）の作成で、管理画面を実際に操作して確かめたことを反映（2026-11-06）。**【運用で確認】** と付けた |
| 改訂（第3版） | 構築して分かったことを反映（2026-11-06）。変えたところは本文中に「**【構築で変更】**」または「**【構築で確認】**」と付けた。経過は `build-log.md` |
| 改訂（第2版） | §17 の質問への回答を反映（手元の MT で構築、アカウントの確定、カテゴリ管理を許可、フィード・サイトマップの URL は提案どおり、設定はモジュール）。**マガジンのカスタムブロックは作らない**ことにし、§10・§13 を標準ブロックと HTML ブロックの形に書き直した |

---

## 1. 前提と、MT の現状

読み取りで確かめたこと（書き込みはしていない）。

| 項目 | 現状 |
| --- | --- |
| 接続先 | プロファイル `five-united` → `http://localhost:8090/mt/mt-data-api.cgi`（v7）、ユーザー `admin` |
| サイト | **0 件**（`mtb sites list` の結果が空） |
| mtb 拡張 | **なし**（`mtb extensions list`）。→ `mtb-pro` の `api-password issue` / `sites data-api update` は使えない |
| テーマ | Data API にはテーマの install/upload が無い。サーバのファイルシステムに置く手段もこちらには無い → **テーマ方式（`mtb-theme`）は採らない**（§9.1） |

**前提として決めたこと**

- 公開はスタティックパブリッシング（要件どおり）。動的な機能（検索・コメント・トラックバック）は使わない。
- 追加プラグインなし。使うのは標準のブロックエディタ・リッチテキストエディタ・Commercial.pack のカスタムフィールドだけ。
- 言語は日本語、`serverOffset` は 9（日本時間）。
- **構築先は手元の MT。** サイトの URL は `http://localhost:8090/`、公開パスは MT の既定の置き場 `/data/file/static`（§17）。公開用のドメインへは、あとで URL を変えて再構築する（§14.1）。以降の設計は「ウェブサイトの URL がサイトのルート `/` になる」前提で書く。
- 手元で `http://localhost:8090/` が `/data/file/static` を配信しているか、MT がそこへ書き込めるかは**構築の最初に確かめる**（§14 の 0、§13 の H6）。**【構築で確認】** MT と Web サーバ（nginx）は、作業をしている環境とは別のホストにあり、`/data/file/static` は作業環境のファイルシステムには存在しない。ファイルの有無は HTTP で確かめる。構築前はルートが 403 だったが、書き出した後は `/` ほか全ページが 200 で配信されたので、配信と書き込みは通っている（H6 は済み）。

---

## 2. 設計の要点（先に結論）

1. **サイトは「ウェブサイト 1 つ + ブログ 3 つ」。** ウェブサイト（`/`）に固定的なもの、ブログに更新の多いもの（`/news/` `/press/` `/magazine/`）を置く。
   担当ごとにブログ単位で権限を渡せるので、「広報はお知らせとプレスだけ、編集部はマガジンだけ」が組み込みのロールだけで実現できる。
2. **入れ物の割り当て**

   | 要件 | 入れ物 | 根拠（「項目が 3 つ以上あり、毎回同じ形で入れたいか」） |
   | --- | --- | --- |
   | お知らせ | **記事**（news ブログ） | 時系列に増える。項目はタイトル・日付・種類・本文だけで、カスタムフィールドは要らない |
   | プレスリリース | **記事** + カスタムフィールド（press ブログ） | 時系列。足す項目はサブタイトル・要点・写真の 3 系統で、記事の標準欄に足すだけで済む |
   | マガジン | **記事** + カスタムフィールド + ブロックエディタ（magazine ブログ） | 時系列。本文に引用・数字・Q&A などの見せ場があるが、カスタムブロックは作らず、標準のブロックと HTML ブロックに mockup と同じ HTML を入れる（§10） |
   | サービス（4） | **コンテンツタイプ「サービス」** | 項目が 15 近くあり、4 件とも同じ形。一覧の並びも項目（順序）で決めたい |
   | 物件（5） | **コンテンツタイプ「物件」** | 項目が 14 あり同じ形。個別ページは持たず、トップとサービスに部品として出す |
   | メンバー（5） | **コンテンツタイプ「メンバー」** | 項目 6 で同じ形。個別ページは持たない |
   | 会社概要・お問い合わせ・プライバシー | **ウェブページ** | 増えない。URL を固定したい |
   | サイトの設定（社名・統計・注意書き・プレスの会社概要…） | **テンプレートモジュール** | 値は少なく、情報システムしか触らない。§7 |
3. **見た目は mockup の HTML をそのままテンプレートにする。** `mockup/css/site.css`（Tailwind 製）はそのまま使い、クラス名は変えない。
4. **URL は mockup のとおり。** 最後の段は原稿の `slug`。ディレクトリ形（末尾 `/`）。
5. **プレスリリースの会社概要と問い合わせ先は、テンプレートが毎回自動で付ける。** 広報は入力しない（付け忘れない／書き換えられない）。
6. **デモの注意書きは、テンプレートの共通部品から出す。** 場所は mockup と同じ。

---

## 3. サイト構成

```
システム
└── ウェブサイト「Five United」   http://localhost:8090/       ← 情報システム（admin）が管理
    ├── ブログ「お知らせ」   /news/       ← 広報
    ├── ブログ「プレスリリース」 /press/     ← 広報
    └── ブログ「FIVE マガジン」 /magazine/  ← 編集部
```

| サイト | 種別 | URL | 公開パス | 作り方の注意 |
| --- | --- | --- | --- | --- |
| Five United | ウェブサイト | `http://localhost:8090/` | `/data/file/static` | `mtb sites create`。language=ja、serverOffset=9 |
| お知らせ | ブログ | `/news/` | `/data/file/static/news` | **子サイトの `url` と `sitePath` は親からの相対**（`news/`）で渡す。絶対 URL を渡すと連結されて壊れる |
| プレスリリース | ブログ | `/press/` | `/data/file/static/press` | 同上 |
| FIVE マガジン | ブログ | `/magazine/` | `/data/file/static/magazine` | 同上 |

### ブログを分ける理由と、その代償

- **理由：** 権限が自然に切れる（§11）。カテゴリ（種類）がブログごとに独立し、`/news/category/info/` `/press/category/funding/` の形がそのまま作れる。フィードもブログ単位。
- **代償：** トップページ・サイトマップ・「ほかの○○」のようにブログをまたぐ部分は、`include_blogs` を指定したテンプレートで組む（§9）。サイトを足すたびにトップが自動で拾うわけではない。
- 「記事 1 ブログ + カテゴリで news/press/magazine を分ける」案は採らない。URL の接頭辞がカテゴリに依存し、権限もカテゴリ単位では切れないため。

---

## 4. URL 設計（mockup のとおり）

| URL | 中身 | 出力元 | 種別 |
| --- | --- | --- | --- |
| `/` | トップ | ウェブサイトのインデックス | index |
| `/services/` | サービス一覧 | ウェブサイトのインデックス | index |
| `/services/{own,stay,atlas,ledger}/` | サービスの詳細 | コンテンツタイプ「サービス」 | ct |
| `/company/` `/contact/` `/privacy/` | 固定ページ | ウェブページ | page |
| `/news/` | お知らせ一覧（全件） | news ブログのインデックス | index |
| `/news/category/{info,service,media,recruit}/` | 種類別の一覧 | news のカテゴリ | archive |
| `/news/{slug}/` | お知らせ詳細 | news の記事 | individual |
| `/press/` `/press/category/{funding,partnership,research,event,product,award}/` `/press/{slug}/` | プレス | press ブログ | 同上 |
| `/magazine/` `/magazine/category/{feature,interview,life,tech,data}/` `/magazine/{slug}/` | マガジン | magazine ブログ | 同上 |
| `/press/feed.xml` `/magazine/feed.xml` | フィード（Atom） | 各ブログのインデックス | index（mockup に無いので新設。URL は提案） |
| `/sitemap.xml` | サイトマップ（XML） | ウェブサイトのインデックス | index（同上） |
| `/css/site.css` `/images/…` `/brand/…` | 静的ファイル | §8 | — |

**アーカイブマッピングのパス**（優先指定を付ける。同じ種類にマッピングを増やさない）

| テンプレート | アーカイブ種別 | パス |
| --- | --- | --- |
| 各ブログの記事 | Individual | `<$mt:EntryBasename$>/index.html` |
| 各ブログのカテゴリ | Category | `category/<$mt:CategoryBasename$>/index.html` |
| ウェブページ | Page | `<$mt:PageBasename$>/index.html`（フォルダは使わない） |
| サービス詳細 | ContentType | `services/<$mt:ContentIdentifier$>/index.html` |

- 記事のベースネーム（`basename`）に原稿の `slug` を入れる。日本語タイトルからは自動生成されないので、**必ず明示する**。
- コンテンツデータのベースネームに原稿の `slug` を入れる。**【構築で確認】API の項目名は `identifier` ではなく `basename`**（`identifier` を送ると無視されて、40桁の英数字が自動で付く）。マッピングのパスはテンプレートタグ `<$mt:ContentIdentifier$>` で読める。スラッグ用のフィールドは要らなかった（R1 は解決）。
- **【構築で確認】** テンプレートタグの `EntryPermalink` `ContentPermalink` `PagePermalink` は、末尾の `index.html` を取って `/news/office-move/` の形で返す（Data API が返す `permalink` は `…/index.html` のまま）。テンプレートの中ではこの差を気にしなくてよい。
- 月別・日別・著者別アーカイブは**作らない**（mockup に無い）。

---

## 5. 分類

### 5.1 カテゴリ（記事用・ブログごと）

`basename` が URL。`label` が表示名。原稿の値と mockup の表示から決めた。

**お知らせ（news）** — 原稿の `category` は日本語の表示名で、URL 用の basename は mockup から補う。

| label | basename | 原稿の件数 |
| --- | --- | --- |
| お知らせ | `info` | 3 |
| サービス | `service` | 2 |
| メディア掲載 | `media` | 2 |
| 採用 | `recruit` | 1 |

**プレスリリース（press）** — 原稿の `category` が basename そのもの。

| label | basename | 件数 |
| --- | --- | --- |
| 資金調達 | `funding` | 1 |
| 提携 | `partnership` | 1 |
| 研究・学会 | `research` | 1 |
| イベント・展示会 | `event` | 2 |
| プロダクト | `product` | 1 |
| 受賞 | `award` | 1 |

`mockup/css/site.css` に `fu-cat-<basename>` のバッジ色が入っているので、**basename を変えない**。

**マガジン（magazine）** — 原稿の `category` が basename そのもの。表示は英語名と日本語名の 2 段。

| label（日本語） | basename | 英語名（カスタムフィールド） | 件数 |
| --- | --- | --- | --- |
| 特集 | `feature` | Feature | 1 |
| インタビュー | `interview` | Interview | 1 |
| 暮らし | `life` | Life | 1 |
| テクノロジー | `tech` | Technology | 1 |
| データ | `data` | Data | 1 |

- 並びは上の順（mockup のカテゴリナビの順）。作成後に `categories permutate` で整える（`list` の出力を並べ替えて渡す）。
- 1 記事 = 1 カテゴリ（主カテゴリのみ）。

### 5.2 フォルダ・カテゴリセット

**使わない。** ウェブページは 3 枚で、URL は `/company/` のように 1 段。コンテンツタイプにもカテゴリ分類は無い。

### 5.3 タグ

マガジンだけ使う（原稿の `tags`）。記事の「#建築」表示用。タグ別のページは作らない（mockup に無い）。

---

## 6. 入れ物の定義

### 6.1 記事：お知らせ（news ブログ）

| 項目 | 入れ方 | 原稿との対応 |
| --- | --- | --- |
| タイトル | 標準 | `title` |
| 日付 | 標準（公開日。`2026-06-01T12:00:00+09:00` のように時刻と時差を付けて送る） | `date` |
| 種類 | カテゴリ（1 つ） | `category`（§5.1 で basename に変換） |
| 本文 | 標準・**リッチテキスト** | 本文（Markdown → HTML に変換して入れる） |
| URL の最後の段 | ベースネーム | `slug` |

**カスタムフィールドは無し。** 画像・サブタイトルも無い（mockup のお知らせ詳細に出ていない）。

### 6.2 記事：プレスリリース（press ブログ）

| 項目 | 入れ方 | 必須 | 原稿との対応 |
| --- | --- | --- | --- |
| タイトル | 標準 | ○ | `title` |
| 日付 | 標準 | ○ | `date` |
| 種類 | カテゴリ（1 つ） | ○ | `category` |
| 本文 | 標準・**リッチテキスト**（本文中の見出しは h2） | ○ | 本文 |
| URL の最後の段 | ベースネーム | ○ | `slug` |
| **サブタイトル** | CF `subtitle`・テキスト | ○ | `subtitle` |
| **要点 1〜3** | CF `highlight1` `highlight2` `highlight3`・テキスト（1 は必須、2・3 は任意） | ○ | `highlights` |
| **写真** | CF `image`・画像 | ○ | `image`（§8） |

- 要点を「1 行 1 項目のテキストエリア」にしないのは、MT の標準モディファイアに**行を分割するもの（split）が無い**ため。現在の原稿は全件が 3 項目で、mockup のレイアウトも 3 項目前提。
- **会社概要・問い合わせ先は記事の項目にしない。** §7 のモジュールから、記事テンプレートが毎回出す。
- メタの description はサブタイトル（mockup どおり）。

### 6.3 記事：マガジン（magazine ブログ）

| 項目 | 入れ方 | 必須 | 原稿との対応 |
| --- | --- | --- | --- |
| タイトル | 標準 | ○ | `title` |
| 日付 | 標準 | ○ | `date` |
| カテゴリ | カテゴリ（1 つ） | ○ | `category` |
| 本文 | 標準・**ブロックエディタ**（標準のブロックと HTML ブロック。§10） | ○ | 本文 |
| URL の最後の段 | ベースネーム | ○ | `slug` |
| タグ | 標準のタグ | — | `tags` |
| **サブタイトル** | CF `subtitle`・テキスト | ○ | `subtitle` |
| **写真（見出し）** | CF `image`・画像 | ○ | `image` |
| **クレジット** | CF `credit`・テキスト | ○ | `credit`（「文・…　写真・…」） |

- 「読了 約 N 分」は入力させず、**テンプレートで本文の文字数から出す**。`max(3, ceil(文字数 / 500))`。現在の原稿 5 本（593〜1,216 字）は全部 3 分になり、mockup の「約3分」と一致する。
- メタの description はサブタイトル。

### 6.4 カテゴリのカスタムフィールド（magazine のみ）

| 項目 | 種類 | 内容 |
| --- | --- | --- |
| `name_en` | テキスト | 英語名（§5.1） |

### 6.5 コンテンツタイプ「サービス」（ウェブサイトに作る）

| フィールド | 種類 | 必須 | 原稿 | 備考 |
| --- | --- | --- | --- | --- |
| （データ名 `label`） | — | ○ | `name` | 「FIVE OWN」 |
| 順序 | 数値 | ○ | `order` | 一覧の並び（1〜4） |
| よみ | テキスト | ○ | `kana` | 「ファイブ・オウン」 |
| 英語のひとこと | テキスト | ○ | `tagline` | |
| キャッチ | テキスト | ○ | `catch` | |
| 概要 | テキスト（複数行） | ○ | `summary` | |
| 写真 | 画像 | ○ | `image` | |
| 対象 | テキスト | ○ | `audience` | |
| 特長 1〜3 の見出し | テキスト ×3 | ○ | `features[].title` | |
| 特長 1〜3 の説明 | テキスト（複数行）×3 | ○ | `features[].text` | |
| ボタンの文言 | テキスト | ○ | `cta` | |
| 本文 | テキスト（複数行）・リッチテキスト | ○ | `body` | |
| 物件を見せる | チェックボックス（1 個） | — | `show_properties` | FIVE OWN と FIVE STAY がオン |
| ベースネーム（identifier） | — | ○ | `slug` | URL |

- 「特長」を繰り返し構造にせず 3 組のフィールドにしたのは、原稿が全件 3 つ固定で mockup も 3 列固定のため。MT のコンテンツタイプには「小さな繰り返し」の部品が無く、別のコンテンツタイプにすると過剰になる。
- ボタンの文言（`cta`）は原稿にあるが、**【構築で確認】mockup のどのページにも出ていない**。フィールドは作り、値も入れたが、テンプレートでは出さない（R5 は解決）。
- **【構築で確認】** コンテンツフィールドの `options` に JSON の真偽値（`"multiple": false` など）を入れると、サーバが壊れた形で保存し、そのコンテンツタイプの取得・一覧・削除がすべて 500 になる。`options` には数値と文字列だけを入れる（`required` はフィールド直下なので真偽値でよい）。
- **【構築で確認】** 画像フィールドは `asset_image`（`options` は `min` `max`）、「物件を見せる」は `checkboxes`、状態は `radio_button`、数値は `number`。画像のデータはアセット ID の配列。
- **【構築で変更】** 「ほかのサービス」「物件の見出し」: FIVE STAY だけ物件の節の見出しが「泊まれる家」（ほかは「持てる家」）。フィールドを足さず、テンプレートでスラッグが `stay` のときだけ出し分けている。

### 6.6 コンテンツタイプ「物件」

| フィールド | 種類 | 原稿 |
| --- | --- | --- |
| （データ名） | — | `name` |
| 順序 | 数値 | `order` |
| 種類 | テキスト | `type`（「戸建て（別荘）」） |
| 所在地 | テキスト | `location` |
| 建築家 | テキスト | `architect` |
| 竣工年 | 数値 | `completed` |
| 戸数 | テキスト | `units` |
| 状態 | ラジオ（運用中／募集中） | `status` |
| 単位 | テキスト | `unit_price`（「1口 10万円」） |
| 想定分配率 | テキスト | `yield`（「想定分配率 年3.8%」） |
| 写真 | 画像 | `image` |
| 紹介文 | テキスト（複数行） | `text` |
| ベースネーム | — | `slug`（個別ページが無いので URL には出ない。識別用） |

- **個別ページは作らない**（原稿の注記どおり）。ct アーカイブテンプレートもマッピングも作らない。
- カードは「単位」「分配」の 2 つだけを出す（mockup）。分配は `想定分配率 年3.8%` から接頭辞を除いて `年3.8%（想定）` と出す。→ **原稿を割らず、テンプレートで `replace` する**。うまくいかなければ、分配率を数値フィールドにして `年{n}%（想定）` をテンプレートで組む（構築時に決める）。
- 建築家・竣工年・戸数は現行 mockup のどこにも出ていない。フィールドは原稿どおり作る（将来の個別ページ用）。

### 6.7 コンテンツタイプ「メンバー」

| フィールド | 種類 | 原稿 |
| --- | --- | --- |
| （データ名） | — | `name`（「早瀬 湊」） |
| 順序 | 数値 | `order` |
| 英語名 | テキスト | `name_en` |
| 役職 | テキスト | `role` |
| 写真 | 画像 | `image`（`team-ceo` など） |
| 経歴 | テキスト（複数行） | `bio` |
| ベースネーム | — | `slug` |

### 6.8 ウェブページ（3 枚）

| 項目 | 入れ方 | 原稿 |
| --- | --- | --- |
| タイトル | 標準 | `title` |
| ベースネーム | 標準 | `slug`（`company` `contact` `privacy`） |
| 本文 | 標準・**リッチテキスト**（表を含む） | 本文（Markdown の表は HTML の表に変換して入れる） |
| **導入文** | CF `lead`・テキスト（複数行） | `lead` |
| **英語見出し** | CF `eyebrow`・テキスト | `eyebrow`（Company / Contact / Privacy Policy） |
| **写真** | CF `image`・画像（会社概要だけ） | `image`（`office`） |

- 本文の表は、MT 標準の Markdown 変換では表にならない。**書式は「リッチテキスト」にして HTML の表を入れる。**
- **【構築で確認】** ページの本文の API 項目名は `body`（記事と同じ。`text` を送ると無視されて本文が空になる）。ページは 1 枚のテンプレート「ウェブページ」で出し、スラッグが `company` のときだけ会社概要の構成（写真・ミッション・メンバー・表・CTA）にする。お問い合わせでは注意書きの囲みを出す。
- 会社概要のページ内の「経営陣」はメンバー（§6.7）、ミッションとステートメントはサイトの設定（§7）から出す。ページ本文に重複して入れない。

### 6.9 カスタムフィールドを作るための権限

カスタムフィールドの管理には「テンプレートの管理」権限が要る。構築は `admin`（システム管理者）で行うので問題ない。

---

## 7. サイトの設定値（`content/site.yaml`）の持ち方

**テンプレートモジュールで持つ。** ウェブサイトに「設定」で始まる名前のモジュールを作り、各ブログのテンプレートから `mt:Include`（`blog_id` 指定）で読む。

| モジュール | 入るもの（`site.yaml` のキー） | 出す場所 |
| --- | --- | --- |
| 設定：サイト | `name` `name_ja` `description` `tagline` `copyright` `social` | `<title>` `meta` フッタ |
| 設定：トップ | `mission` `statement` `stats`（4 つ） | トップ・会社概要 |
| 設定：プレス | `boilerplate` `press_contact` | **プレスリリース詳細の末尾（毎回）** |
| 設定：注意書き | `demo_notice.band` `company` `contact` `press` `homes` | 帯（全ページ最上部）、会社概要・お問い合わせ・プレス詳細・物件の囲み |

**この形にした理由**

- 設定は「情報システムがときどき触る」もの。広報・編集部の権限にテンプレートの管理は含めないので、**触れない**。
- 「整形済みテキスト」も検討したが、MT 9.3 の標準タグ一覧に取り出すタグが見当たらず、ブログをまたいで読めるかも不確かなので避けた。
- 構造のある値（統計の 4 つ・SNS）はモジュールの中の MTML で素直に書ける。

**注意書きの出す場所（mockup から）**

| 種類 | 出すページ |
| --- | --- |
| 帯 `band` | 全ページの最上部（`<p class="fu-demo-band" role="note">`） |
| `company` | 会社概要 |
| `contact` | お問い合わせ |
| `press` | プレスリリース詳細 |
| `homes` | 物件のカードを出す 3 か所（トップ、FIVE OWN、FIVE STAY） |

プレス詳細の「このリリースについてのお問い合わせ」は `press_contact`、「ファイブユナイテッド株式会社について」は `boilerplate`。

---

## 8. 画像と静的ファイル

| 置くもの | 元 | 置き場所（URL） | 方法 |
| --- | --- | --- | --- |
| CSS | `mockup/css/site.css` | `/css/site.css` | インデックステンプレート「スタイルシート」（出力ファイル `css/site.css`）にそのまま入れる |
| ロゴ・アイコン（SVG） | `mockup/brand/*` | `/brand/…` | `mtb assets upload --path /brand`（画像扱いにならず、バイトのまま入る） |
| 写真 | `mockup/images/*` | `/images/…` | `mtb assets upload --path /images`（800・1600・2400 幅をすべて） |
| OGP 画像 | `mockup/images/ogp-default.jpg` | `/images/ogp-default.jpg` | 同上 |

**画像の持ち方**

- 画像フィールド（`image`）には **1600 幅**のアセットを紐づける（`content/images/*-1600.webp`、原稿の `image: press-funding` → `press-funding-1600.webp`）。
- 一覧のカードで使う **800 幅**、トップのヒーローで使う **2400 幅**は、`mockup/images/` に既にあるものを同じフォルダに上げ、テンプレートで URL の `-1600` を `-800` に置換して出す（`replace` モディファイア）。
- MT のサムネイル生成（`AssetThumbnailURL`）は使わない。**WebP を生成できるかがサーバの画像ライブラリ次第**で、確かめようがないため。
- `content/images/*.webp` と `mockup/images/*-1600.webp` が同一かは、構築時に確認する。違えば `content/` を正とする（中身が正）。
- **MT は画像を再保存する。** WebP が劣化しないか（サイズ・見た目）を最初の 1 枚で確かめる。劣化するなら、画像だけ人が FTP などで `/images/` に置き、アセットは登録のみにする（§13）。**【構築で確認】WebP は再保存されず、バイト単位で元と同一だった**（`cmp` で確認。R3 は問題なし）。`content/images/*-1600.webp` と `mockup/images/*-1600.webp` も全 45 枚が同一。JPEG（`ogp-default.jpg`）は MT の仕様で再保存される。
- **【構築で確認】** アセットの URL・画像のカスタムフィールドの値は、**ドメイン込みの絶対 URL**（`http://localhost:8090/images/…`）で保存・出力される。テンプレートでは `regex_replace="/^https?:\/\/[^\/]+/",""` を付けて、ルートからの形（`/images/…`）にして出す。ドメインを変えたときに画像の参照が壊れない。
- **【構築で確認】** 画像のカスタムフィールドは `<$mt:PressImage$>` のように**タグをそのまま**使うと URL が出る（`…ImageAsset` ブロックは空になった）。コンテンツデータの画像フィールドは `<mt:ContentField content_field="写真"><$mt:AssetURL$></mt:ContentField>`。
- `alt` はアセットの説明に入れる（原稿の画像には `alt` が無いため、人物は氏名・物件は物件名、マガジンの図は本文中の説明文を使う。装飾の写真は空）。

---

## 9. テンプレート

### 9.1 作り方：テーマではなく、テンプレートを直接作る

- 理由：テーマの配布には**サーバへのファイル配置**が要る（Data API からは入れられない）。今は配置手段が無い。
- テンプレートは `mtb sites templates create/update` で作り、**`mtb sites templates pull/push` で手元のファイルと往復**させる。ファイルは `templates/` に置いて Git で持つ。
- **テーマの適用はしない**。適用するとテンプレートが全部 backup 型になり、マッピングも出力ファイル名も消えるため。
- 後から別環境に移したくなったら、`mtb-migrate` か `export-theme` で吸い出す。
- **【構築で変更】** 新しいサイト（ウェブサイト・ブログ）には、`eigerwand` テーマの既定テンプレート（各 33 個）・サンプルのページ（「ウェブページの例」「このページについて」）・フォルダ `about` が自動で入り、`styles.css` `atom.xml` `archives.html` `mt.js` などを書き出す。**テンプレートを作る前に、システム用のものを残して全部削除した**（出力済みのファイルは MT が消さないので、先に本文を空にして公開してから削除。ファイルそのものの削除は人の作業。§13 H10）。
- **【構築で変更】** テンプレートは `templates/`（日本語名の `.mtml`）に置き、`build/` のスクリプト（`gen_*.py` が mockup の HTML から生成、`deploy.py` が MT に作成・更新）で入れる。**mockup と公開側を `build/compare.py` で突き合わせる**と、47 ページとも一致する（§15）。生成スクリプトを正とするので、テンプレートを直すときは `gen_*.py` を直して `deploy.py` を流す。

### 9.2 テンプレートモジュール（ウェブサイトに作り、ブログから読む）

| モジュール | 内容 |
| --- | --- |
| 共通：ヘッド | `<head>`、`<title>`、OGP、フォント、CSS |
| 共通：ヘッダー | デモの帯、ロゴ、グローバルナビ（サービス・会社概要・お知らせ・プレスリリース・マガジン）、モバイルメニュー |
| 共通：フッター | ロゴ、サービス／About／Contact の列、SNS、コピーライト、注意書き |
| 共通：パンくず | ホーム › … |
| 部品：記事カード（press／magazine／news 行） | 一覧とトップで使い回す |
| 部品：物件カード | トップ・FIVE OWN・FIVE STAY で使い回す |
| 設定：サイト／トップ／プレス／注意書き | §7 |

- **ブログから読むときは、ウェブサイトのモジュールを `blog_id` 付きで読む**（子サイトからは親のモジュールが自動では見えない）。
- ナビの「現在地」（`aria-current` と下線）は、各テンプレートが変数（`nav_current`）を立ててからヘッダーを読んで切り替える。

### 9.3 ウェブサイト（`/`）

| テンプレート | 種別 | 出力 | 補足 |
| --- | --- | --- | --- |
| メインページ（トップ） | index | `index.html` | ヒーロー／統計 4／ビジョン／サービス 4／物件 3／マガジン（最新 3：大 1 + 小 2）／プレス（最新 2）／お知らせ（最新 4）。物件は順序の先頭 3 件 |
| サービス一覧 | index | `services/index.html` | サービス 4 件を順序順に、写真を左右交互に |
| サービス詳細 | ct | §4 のパス | 特長 3 つ、本文、`show_properties` がオンなら物件 5 件（順序順・全件）、ほかのサービス 3 つ |
| ウェブページ | page | §4 のパス | 3 枚共通。会社概要だけ追加でメンバー 5 人・ミッション。写真は `image` があるときだけ |
| スタイルシート | index | `css/site.css` | |
| サイトマップ | index | `sitemap.xml` | §9.6 |

- ブログをまたいで最新を拾う部分（トップのプレス・お知らせ・マガジン）は、各ブログの ID を `include_blogs` に並べる。
- **すべての一覧は件数を明示して全件にする**（`lastn` を既定に頼らない。ブログの既定は 10 件で、すぐ欠ける）。ページ送りは作らない。

### 9.4 ブログ共通（news／press／magazine）

| テンプレート | 種別 | 出力・マッピング |
| --- | --- | --- |
| メインページ（一覧） | index | `index.html`。全件を日付の新しい順。上に種類の絞り込みボタン（すべて／各カテゴリ）、現在地のボタンは反転 |
| 記事 | individual | `<$mt:EntryBasename$>/index.html`（優先） |
| カテゴリ一覧 | archive | `category/<$mt:CategoryBasename$>/index.html`（優先）。件数は全件 |

見た目の違い（mockup どおり）：

| ブログ | 一覧の形 | 詳細の形 |
| --- | --- | --- |
| news | 日付・種類（枠だけのバッジ）・タイトルの行。画像なし | 本文のみ。写真なし |
| press | 写真つきカード（種類バッジ・日付・タイトル）。種類ごとの色 | ヒーロー写真、要点（Highlights）、本文、会社概要、問い合わせ先、デモの注意書き、「ほかのプレスリリース」（同じカテゴリ以外から新しい 3 件を目安） |
| magazine | 先頭 1 件を大きく、続く 2 件を縦に並べる雑誌風。カテゴリナビは英語名 | 全幅の見出し写真、種類・タイトル・サブタイトル、日付・クレジット・読了時間、本文（専用の見せ場）、タグ、「次に読む」3 件 |

- 「ほかの○○」「次に読む」の選び方（同じ記事を除く新しい 3 件にするか、関連を見るか）は、mockup の並びから**現在の記事を除いた新しい順の 3 件**を既定にする。**【構築で確認】** mockup の 5 ページ（プレス 2・マガジン 3）で確かめて、この規則で一致した。
- **【構築で確認】記事アーカイブの中で `mt:Entries` を使うと、既定では「その記事より古いもの」に絞られる。** 関連一覧には `ignore_archive_context="1"` を付ける。
- **【構築で変更】** 種類の絞り込みは、各ブログの**テンプレートモジュール「部品：種類の絞り込み」**に、カテゴリを**並べた順で固定の HTML として**書いた。`<mt:Categories>` の `sort_by="user_custom"`（管理画面の並び順）が効かず、ラベル順になってしまうため。**カテゴリを足した・並べ替えたときは、`build/gen_tpl4.py` の `CATS` を直して `deploy.py` を流す**（情報システムの作業。広報・編集部がカテゴリを足してもボタンには出ない。記事は種類のページに載る）。
- **【構築で変更】** マガジンの記事のタグ（`#建築` など）は、MT が名前順に並べて出す（`mt:EntryTags` に並び順の指定が無い）。mockup は原稿の順なので、**タグの並びだけが mockup と異なる**（意図した差分。比較ツールは並びを無視する）。
- **【構築で確認】** ブログのテンプレートからウェブサイトのモジュールを `<mt:Include module="…" blog_id="1">` で読め、モジュールの中で `mt:SetVarBlock` した変数は読み込み側で使える（設定のモジュールが成り立つ）。インクルードしたモジュール名が MT に存在しないと、公開が「403 Do not have permission to publish a template」で失敗する（権限の問題ではない）。

### 9.5 フィード

| テンプレート | 出力 | 内容 |
| --- | --- | --- |
| プレスのフィード | `press/feed.xml`（Atom） | 新しい 20 件。title・サブタイトル（summary）・本文・日付・URL |
| マガジンのフィード | `magazine/feed.xml`（Atom） | 同上 |

- フィードの記事は**全件ではなく新しい 20 件**とする（購読の用途のため。要件の「全件」は一覧ページの話）。
- 各一覧／詳細のヘッドに `<link rel="alternate" type="application/atom+xml">` を付ける。

### 9.6 サイトマップ

`/sitemap.xml`（ウェブサイトの index）に、次のすべてを `<url>` で並べる。

- トップ、サービス一覧、サービス詳細 4、固定ページ 3
- お知らせ一覧・カテゴリ 4・記事 8
- プレス一覧・カテゴリ 6・記事 7
- マガジン一覧・カテゴリ 5・記事 5

ブログ側は `include_blogs` で束ねる。`lastmod` は記事の更新日。

### 9.7 `<head>` の中身

| | 値 |
| --- | --- |
| `<title>` | トップ：`Five United — 住まいをひらかれた資産に`<br>固定ページ・一覧：`<ページ名> \| Five United`<br>お知らせ詳細：`<題> \| Five United`／お知らせのカテゴリ：`<種類> \| お知らせ \| Five United`<br>プレスのカテゴリ：`<種類> \| プレスリリース \| Five United`／マガジンのカテゴリ：`<種類> \| FIVE マガジン \| Five United`<br>マガジン詳細：`<題> \| FIVE マガジン \| Five United` |
| `description` | プレス・マガジンの詳細：サブタイトル／サービス詳細・固定ページ：概要・導入文／それ以外：サイトの `description` |
| `og:image` | 詳細は記事の写真（1600 幅）、それ以外は `/images/ogp-default.jpg` |

mockup の各ページと 1 件ずつ突き合わせて確定する。

### 9.8 日付

`2026.10.14` の形：`format="%Y.%m.%d"`。`<time datetime="2026-10-14">` の属性は `%Y-%m-%d`。

---

## 10. マガジンの本文（ブロックエディタ）

**カスタムブロックは作らない。** 見せ場は、ブロックエディタの**標準のブロック**と **HTML ブロック**に、mockup の本文と同じ HTML を入れて出す。
（理由：カスタムブロックは Data API で作れず、管理画面で 6 つ作る手間が大きい。HTML ブロックなら管理画面の作業が増えない。）

### 10.1 原稿の記法と、使うブロック

| 原稿の記法 | 使うブロック | 本文に入る HTML（mockup と同じ） |
| --- | --- | --- |
| 地の文 | 標準の**段落** | `<p>…</p>` |
| `## 見出し` | 標準の**見出し**（レベル 2） | `<h2>…</h2>` |
| `![説明](画像)`（普通の写真） | 標準の**画像** | `<figure><img src="…" alt="説明"><figcaption>説明</figcaption></figure>` |
| `::: qa` | **HTML** | `<div class="fu-mag-qa"><p>質問</p></div>` |
| `::: pullquote` | **HTML** | `<blockquote class="fu-mag-pullquote"><p>本文</p><p>発言者</p></blockquote>` |
| `::: wide <画像>` | **HTML** | `<figure class="fu-mag-wide"><img src="…-1600.webp" alt="説明"><figcaption>説明</figcaption></figure>` |
| `::: number` | **HTML** | `<div class="fu-mag-number"><p>数字</p><p>説明</p></div>` |
| `::: note` | **HTML** | `<div class="fu-mag-note"><p>本文</p></div>` |
| `::: profile <画像>` | **HTML** | `<div class="fu-mag-profile"><img src="…-800.webp" alt="氏名"><div><p>氏名</p><p>紹介</p></div></div>` |

- 本文全体は `<div class="fu-mag">` の中に出す（テンプレート側。編集部は書かない）。
- 画像の `alt` は説明と同じ文を入れる（mockup どおり）。人物紹介の写真は `alt` を氏名にし、**800 幅**を使う。
- 普通の写真の `<figure>` は、標準の画像ブロックが出す HTML が上と同じかを**構築時に確かめる**（違えば HTML ブロックで入れる。R2）。

### 10.2 取り込み（私が行う）

- 原稿の本文を、上の表の HTML に変換した文字列を記事の本文として入れる。`::: …` の囲みは HTML ブロックの 1 つに対応させ、**ブロックエディタが読み戻せる形**（ブロックを区切るコメントなど、MT の保存形式）で入れる。保存形式は、構築時に管理画面で 1 本作って書き出された本文を見て合わせる（R2）。
- 本文中の画像の URL は、**サイトのルートからの形**（`/images/mag-materials-1600.webp`）で書く。ドメインを変えても壊れない（§14.1）。
- 取り込んだあと、管理画面で開いて**ブロックが崩れていない**ことを確かめる（§15）。
- **【構築で確認】** 5 本とも、書式 `block_editor` のまま、本文は**ブロックの区切りコメントなしの素の HTML**で保存した（API で保存・取得できる）。公開側は mockup と同じ HTML になった。**管理画面のブロックエディタがこの本文をどう開くかは、こちらからは確かめられなかった**（ブラウザが無い）。→ §13 H11 で人が確認する。崩れる場合は §16 R2 の代案（書式をリッチテキストにする）に切り替える。

### 10.3 編集部が新しく書くとき（手順）

道具は 3 つ。①標準のブロック（段落・見出し・画像）、②HTML ブロック、③下の**見せ場の雛形**（コピーして貼る）。**クラス名（`fu-mag-…`）は変えない**。変えると見た目が崩れる。

**手順**

1. 管理画面で FIVE マガジンを開き、[記事を作成] を押す。書式が **ブロックエディタ**になっていることを確かめる。
2. タイトル・カテゴリ・タグ・**サブタイトル**・**見出し写真**・**クレジット**を埋める。URL の最後の段（ベースネーム）は、英小文字とハイフンで決める（例：`new-house`）。
3. 本文を書く。
   - 地の文は**段落**ブロック、小見出しは**見出し**ブロック（レベル 2）。
   - 普通の写真は**画像**ブロックで、画像を選び、キャプションを入れる。
   - 見せ場は**HTML**ブロックを足し、雛形を貼って、**かぎ括弧の中の文字だけ**書き換える。
4. [プレビュー] で見た目を確かめる。
5. 状態を [公開] にして保存する。

**見せ場の雛形**（太字の部分だけ書き換える）

```html
<!-- 質問（インタビューの聞き手） -->
<div class="fu-mag-qa"><p>【質問の文】</p></div>

<!-- 引用（大きく見せる一言） -->
<blockquote class="fu-mag-pullquote"><p>【引用の文】</p><p>【発言した人】</p></blockquote>

<!-- 数字（大きな数字と、その説明） -->
<div class="fu-mag-number"><p>【23,000人】</p><p>【数字の説明】</p></div>

<!-- 注記（記事の最後などの断り書き） -->
<div class="fu-mag-note"><p>【注記の文】</p></div>

<!-- ワイド画像（横いっぱいの写真） -->
<figure class="fu-mag-wide"><img src="【画像の URL】" alt="【説明】"><figcaption>【説明】</figcaption></figure>

<!-- 人物紹介（記事の最後） -->
<div class="fu-mag-profile"><img src="【顔写真の URL】" alt="【氏名】"><div><p>【氏名（よみ）】</p><p>【肩書きと経歴】</p></div></div>
```

**画像の URL の取り方**（ワイド画像・人物紹介）

1. 画像ブロックの画像選択と同じ操作で、画像を**アップロード**する（アセットとして登録される）。
2. アセットの一覧で画像を選び、[URL] をコピーする。
3. 雛形の【画像の URL】に貼る。**`http://` から `/` までのドメインの部分を消し、`/` から始まる形にする**（例：`http://localhost:8090/magazine/assets/a.webp` → `/magazine/assets/a.webp`）。ドメインを変えたときに壊れないため。

**気をつけること**

- HTML ブロックの中の文字は、`<` `>` `&` をそのまま書かない（`&lt;` `&gt;` `&amp;` にする）。
- 見せ場の雛形は 1 ブロックに 1 つ。複数を 1 つの HTML ブロックにまとめない（並べ替えが難しくなる）。
- HTML ブロックを使うと、ブロックエディタ上では**見た目ではなく HTML の文字**が見える。見た目は [プレビュー] で確かめる。
- 雛形は、構築後に `design-doc.md` と別の「編集部向けの手順書」（§13 の H8）にも載せる。

---

### 10.4 【運用で確認】管理画面で確かめた結果（R2 の答え）

佐伯のアカウントで、実際の画面（Playwright）で確かめた。

| 確かめたこと | 結果 |
| --- | --- |
| (a) HTML ブロックが選べる | **○**。［＋ ブロックを追加］の一覧に「HTML」がある（ほかに oEmbed・罫線・テーブル・マルチカラム）。［T］（テキスト）・［画像］・［ファイル］は一覧の左に出ている |
| 取り込んだ記事が崩れずに開く | **○**。本文全体が**1つの HTML ブロック**として開く（ブロックごとには分かれない）。画像・引用も表示される |
| 取り込んだ記事を保存し直す | **○**。複製の記事で、サブタイトルだけ変えて［更新］。公開本文が元の記事と**完全に同じ**。保存後の本文は `<!-- mt-beb t="core-html" -->…<!-- /mt-beb -->` で包まれる（公開側では出ない） |
| (b) HTML ブロックの `class` が保たれる | **○**。新しく入れた雛形（質問・数字）が、`class` のまま保存・公開された |
| (c) 標準の「画像」ブロックの出力 | **mockup の `<figure>` とは違う**。`<p><img src="http://…/magazine/….webp" alt="" width height class="asset asset-image" style="max-width:100%;height:auto;display:block"/></p>`（キャプションなし・ドメイン込みの URL・`alt` 空）。見た目は本文の幅いっぱい・角丸で崩れない。キャプションつきの写真は HTML ブロックの雛形（`manual/04-magazine.md`）で入れる |
| 見出し | **○**。テキストブロックの「段落」プルダウンから「見出し 2」（Windows は `Ctrl+Alt+2`）。`<h2>` で保存され、公開側のスタイルで表示される |
| プレビュー | **○**。［プレビュー］で別の画面に、公開と同じ見た目が開く（一時ファイルは公開パスに書かれる。H10） |
| 担当以外が見えない | **○**。佐伯・相沢とも、ダッシュボードには自分の担当のサイトだけ。他のブログの記事一覧は「権限がありません」。ウェブサイトのページ・テンプレート・ユーザー・システムは「アクセス権がありません」 |

**【運用で確認】見つけて直した不具合：画像のカスタムフィールド（写真・見出し写真）の保存形式は2通りある。** API で入れた値（原稿の取り込み）は URL の文字列だが、**管理画面で［画像を選択］から入れた値は `<form mt:asset-id="…" class="mt-enclosure mt-enclosure-image">…</form>` の HTML**。構築時のテンプレートは前者だけを想定していて、管理画面から写真を入れた記事で、画像が壊れて HTML が漏れた。**直し方**：テンプレートモジュール「部品：画像URL（マガジン）／（プレス）／（ページ）」を作り、アセットのブロック（`…ImageAsset`）で取れればその URL、取れなければ生の値を、ドメインを除いて出す。マガジン・プレス・固定ページのテンプレートはこのモジュールを `mt:Include` で使う（`replace` でサイズも変えられる）。

## 11. ユーザーと権限

### 11.1 ユーザー

| ユーザー | 担当 | 管理画面 | 備考 |
| --- | --- | --- | --- |
| `admin`（既存） | 情報システム（1人）。それ以外すべて | ○ | システム管理者。構築もこのアカウントで行う。**情報システム用の別アカウントは作らない** |
| `aizawa`（相沢・広報） | news・press | ○ | メール `aizawa@five-united.example` |
| `saeki`（佐伯・編集部） | magazine | ○ | メール `saeki@five-united.example` |

- 表示名は「相沢」「佐伯」。
- **初期パスワード**は構築のときに私が決め、**最後にあなたにだけ伝える**（会話で渡す）。ファイル（設計書・スクリプト・メモ・Git）には残さない。コマンドには環境変数経由で渡し、シェルの履歴に残らない形にする。
- 初回ログイン後にパスワードを変えてもらう（H1）。

### 11.2 ロール（組み込みの範囲で足りる）

| ユーザー | サイト | ロール | できること |
| --- | --- | --- | --- |
| `admin` | すべて | システム管理者 | ロールの付与は要らない（システム管理者はすべてのサイトを扱える） |
| `aizawa` | お知らせ、プレスリリース | **Editor** | 全記事の編集・カテゴリ・アップロード・公開 |
| `saeki` | FIVE マガジン | **Editor** | 同上（マガジンのみ） |

- **広報と編集部は、担当以外のブログには何も与えない**（ウェブサイト・他のブログにはロールを付けない）。サービス・物件・メンバー・固定ページ・テンプレート・サイト設定は触れない。
- Editor は「カテゴリの管理」を含み、カテゴリの追加・並び替え・削除ができる。**これは許す**（決定）。ただし URL に出るカテゴリの basename（`info` `funding` `tech` など）は、変えると URL とバッジの色が変わるので、**変えない**ことを手順書に書く（H8）。独自ロールは作らない。
- 2 人にシステム権限 `sign_in_cms` を付ける（付けないと管理画面に入れない）。`admin` は不要。

### 11.3 Data API の関門について

Data API を使うのは構築する側（`admin`）だけ。広報・編集部は管理画面だけで使うので、**Webサービスパスワードや Data API の許可は編集者のために用意しなくてよい**。
ただし一般ユーザーの Data API を後で使う予定があれば、`sign_in_data_api`・Web サービスパスワード・サイトの Data API 許可が要る（新しいサイトは Data API が無効で始まる）。mtb-pro 拡張が無いのでこの 2 つは管理画面の作業（§13）。

---

## 12. 原稿の取り込み

### 12.1 件数と対応

| 原稿 | 件数 | 入れ先 | 変換 |
| --- | --- | --- | --- |
| `content/news/*.md` | 8 | news の記事 | 本文 Markdown → HTML。`category`（日本語）→ カテゴリ |
| `content/press/*.md` | 7 | press の記事 | 本文 → HTML、`highlights` → CF 3 つ、`image` → CF の画像 |
| `content/magazine/*.md` | 5 | magazine の記事 | 本文 → §10.1 の HTML（標準ブロック＋HTML ブロック）、`tags`、`image`／`credit`／`subtitle` → CF |
| `content/pages/*.md` | 3 | ウェブページ | 本文 → HTML（表あり） |
| `content/services.yaml` | 4 | コンテンツタイプ「サービス」 | §6.5 |
| `content/properties.yaml` | 5 | コンテンツタイプ「物件」 | §6.6 |
| `content/members.yaml` | 5 | コンテンツタイプ「メンバー」 | §6.7 |
| `content/site.yaml` | 1 | モジュール | §7 |
| `content/images/` | 45 | アセット | §8 |

### 12.2 注意

- **ファイル名の日付（`2026-10-14-series-b.md`）は URL に使わない**。URL は front matter の `slug`（`series-b`）。ファイル名の `slug` 部分と食い違う原稿があるので（例：`2026-04-08-atlas-2.md` の slug は `atlas-2`、`2026-08-05-academic.md` は `isbc-2026`）、**必ず front matter を読む**。
- 記事の `status` は `Publish` を明示する（省くと下書きになる）。
- 日付は時刻と時差（`+09:00`）まで付けて送る。日付だけだと日がずれることがある。
- `FIVE マガジン` の本文の画像参照（`mag-materials` など）は、アセット（`mag-materials-1600.webp`）の**ルートからの URL**（`/images/mag-materials-1600.webp`）に置き換える。ドメインを入れない（§14.1）。
- 本文中のメールアドレス（`.example`）はそのまま出す。

---

## 13. 人が管理画面でする作業（mtb でできないこと）

| # | 作業 | いつ | 理由 |
| --- | --- | --- | --- |
（第2版で「ブロックエディタのカスタムブロック 6 種を作る」作業をなくした。§10。）

| # | 作業 | いつ | 理由 |
| --- | --- | --- | --- |
| H1 | 相沢・佐伯の**初回ログインとパスワード変更**（本人が行う。`sign_in_cms` の付与とアカウントの作成は mtb でできる） | 引き渡し | 本人にしかできない |
| H2 | **MT の再起動**（担当のコンテンツタイプや新しいメニューが出ない場合のみ） | 権限を渡した後 | メニューは起動時に作られる |
| H3 | 編集画面の**表示オプション**：相沢の画面でサブタイトル・要点・写真のカスタムフィールドを表示する／佐伯の画面でサブタイトル・写真・クレジットを表示する。**【運用で確認】済み**：マニュアル撮影のときに、相沢（プレス：要点1〜3・写真）・佐伯（マガジン：クレジット・見出し写真）の画面で表示した。設定は2人の画面に残っている（再ログイン後も確認） | 済み | 利用者ごとの設定で、API からは変えられない |
| H4 | 記事の**書式の既定**（news・press はリッチテキスト、magazine はブロックエディタ）が、サイト設定の `convertParas` どおりになっているかの確認。違えば設定する | 記事を入れる前 | API の応答からは見えない |
| H5 | 画像が MT の再保存で劣化する場合のみ：`/images/` に**ファイルを直接置く**（`/data/file/static/images/` へコピー） | §8 の検証後 | MT が画像を再保存するため |
| H6 | `http://localhost:8090/` が `/data/file/static` を配信していること、MT のプロセスがそこへ書き込めることの確認（権限・所有者の調整が要れば Web サーバ側で行う） | 構築の最初 | MT の外の作業。mtb からは見えない |
| H7 | （将来、Data API を一般ユーザーに使わせるなら）Web サービスパスワードの発行、サイトごとの Data API 許可 | 必要になったとき | mtb-pro 拡張が無い |
| H8 | 引き渡しの**操作説明**（広報・編集部向けの入力手順）。**【運用で確認】作成済み：`manual/`**（画面写真つき。操作は実際の管理画面で確かめて書いた） | 済み | 設計の範囲外。構築後に別途 |
| H9 | 公開用ドメインへの**切り替え時の Web サーバ側の設定**（ドメイン・配信先・証明書） | 公開のとき | MT の外の作業。MT 側の手順は §14.1 |
| H10 | **不要な出力ファイルの削除**（`/data/file/static` の中）。既定テーマや構築の途中で書き出された、中身が空のファイル：`styles.css` `atom.xml` `archives.html` `mt.js` `mt-theme-eigerwand.js` `company.html` `contact.html` `privacy.html`、および `news/` `press/` `magazine/` の下の `styles.css` `atom.xml` `archives.html` `mt.js` `mt-theme-eigerwand.js`。**【構築で変更】追加** | 公開前 | mtb（Data API）ではファイルを消せない。MT はテンプレートを消しても出力済みのファイルを消さない。今は中身を空にしてあり、害は無いが、URL としては 200 で応答する。**【運用で確認】追加**：確認用の記事を公開して削除した跡の**空のフォルダ**が残っている（`news/post/` `news/manual-check-news/` `press/manual-check-press/` `press/manual-check-feed/` `magazine/manual-check-mag/` `magazine/manual-check-edit/` `magazine/manual-check-img/`。URL は 403）。プレビューの一時ファイル（`mt-preview-….html`）が残っていないかも見てもらう |
| H11 | 佐伯のアカウントで、取り込んだマガジンの記事 5 本を管理画面で開く。ブロックが崩れず、HTML ブロックが選べるか確かめる。続けて §10.3 の手順で新しい記事を 1 本作って公開する。**【運用で確認】済み**（結果は §10.4 と `build-log.md`）。残り：2 人の**実際の初回ログインとパスワード変更**（H1） | 済み | ブロックエディタの読み込みは画面でしか確かめられない（R2） |
| H12 | カテゴリを足した・並べ替えたときの**絞り込みボタンの作り直し**（情報システム。`gen_tpl4.py` の `CATS` ＋ `deploy.py`） | カテゴリを変えたとき | `<mt:Categories>` の管理画面の並び順が効かない（§9.4） |
| H13 | **トップページとサイトマップの再構築**。【運用で確認】ブログの記事を公開・取り下げても、ウェブサイト側のトップ（`index.html`）とサイトマップ（`sitemap.xml`）は**自動では再構築されない**（記事ページ・一覧・種類別の一覧・フィードは自動）。情報システムが `sh build/rebuild-index.sh` を実行する（cron で数分おきに回すのが現実的）。MT の「再構築トリガー」で連動できるかは未確認（Data API には無く、システム管理者の管理画面の作業） | 公開のたび／定期 | MT の仕様。トップのお知らせ・プレス・マガジンは `include_blogs` で他のブログを読むため、親側の再構築が別に要る |
| H14 | **取り下げ・カテゴリの付け替えのあとの［再構築］**（広報・編集部が自分の画面でする）。【運用で確認】記事を「未公開(原稿)」にしても、種類ごとの一覧（`…/category/…/`）には記事が残る。ブログの左上の［再構築］→「すべてのファイル」で消える（広報のアカウントで確認）。記事の削除でも同じ（種類ごとの一覧と「ほかの○○」欄に残る） | 取り下げのたび | MT の再構築の範囲の仕様。手順は `manual/01-start.md` の 1-6 |

---

## 14. 構築の順序（mtb）

テーマを使わないので順序は次のとおり。**接続先を毎回口に出して確かめる**（`mtb profile show` → `mtb sites list`）。

```
0.  確認      プロファイル、MT の状態、`http://localhost:8090/` の配信と
              `/data/file/static` への書き込み（H6）、画像の同一性、WebP の再保存
1.  サイト    ウェブサイト（url=http://localhost:8090/、sitePath=/data/file/static）
              → 3 ブログ（url/sitePath は親からの相対）
2.  分類      カテゴリ（news 4・press 6・magazine 5）と並び替え
3.  構造      カスタムフィールド（プレス・マガジン・カテゴリ・ページ）、
              コンテンツタイプ 3 つとそのフィールド
4.  人        ユーザー作成（aizawa・saeki。パスワードは §11.1）→ sign_in_cms
              → ロールの付与（コンテンツより先に）
5.  素材      アセット（画像・SVG）のアップロード
6.  コンテンツ サービス・物件・メンバー → ページ 3 → 記事（news 8 → press 7 → magazine 5）
7.  見た目    モジュール → テンプレート（ブログ共通・ウェブサイト）→ マッピング
8.  公開      index を publish、記事は変更を伴う更新で再構築、--verify-publish
9.  確認      §15
10. 引き渡し   初期パスワードを会話で伝える（ファイルに残さない）
```

- 分類より先にコンテンツを作らない（URL が変わる）。ユーザー・権限もコンテンツより先（所有者がずれるため）。
- ウェブページは作成時にフォルダを指定できないが、今回はフォルダを使わないので影響なし。
- 再公開に `--entry '{}'` は使わない（関連が外れて URL が変わることがある）。

### 14.1 公開用ドメインへの切り替え（あとで行う）

手元（`http://localhost:8090/`）で組んで確かめたあと、公開用のドメインに変える。**変える前提で、次のように作っておく。**

| 作っておくこと | 理由 |
| --- | --- |
| テンプレートのリンク・CSS・画像は**ルートからの形**（`/css/site.css` `/news/`）で書く（mockup のとおり） | ドメインに依存しない |
| 記事・ページの本文に入れる画像も `/images/…` の形（§10.2、§12.2） | 同上 |
| 絶対 URL が要る所（フィード、サイトマップ、`og:image`、canonical）は、`mt:BlogURL` などの MT のタグで出し、固定の文字列を書かない | サイトの URL を変えれば追随する |

**切り替えの手順**

1. 4 つのサイト（ウェブサイトと 3 ブログ）の `url` を新しいドメインに更新する。ブログの `url` と `sitePath` は親からの相対なので、親だけ変えれば済むかを確かめる。公開パスを変えるなら、ウェブサイトの `sitePath` も更新する。
2. 本文に旧ドメイン（`http://localhost:8090`）が入っている記事・ページを探して置き換える。**管理画面の画像ブロックで入れた画像は絶対 URL で保存されることがある**ので、必ず探す。`mtb sites entries list` で本文を取り、置換して `update` する（本文が変わるので、その記事は再構築される）。
3. 全サイトを再構築する（`mtb publish entries --wait` ＋ index テンプレートの publish）。
4. 公開側に旧ドメインが残っていないか確かめる（`curl` した HTML に `localhost:8090` が無いこと）。
5. Web サーバ側の設定（H9）は MT の外で行う。

---

## 15. 確認の項目（構築後）

| 確認 | 方法 |
| --- | --- |
| すべての URL が mockup と一致 | `mockup/` の html の一覧（47 ページ。`design-system/` は部品の見本なので除く）と、公開側の出力ファイルを突き合わせる。404・余計な URL が無いこと |
| 内容 | ページごとに `curl` して、`</mt:` が本文に残っていないこと、タイトル・description・日付形式を mockup と比べる |
| 見た目 | 公開側と `mockup/` を並べて見る（ヘッダ、一覧、詳細、スマホ幅） |
| 一覧が全件 | news 8／press 7／magazine 5／各カテゴリの件数が §5.1 と一致 |
| 注意書き | 帯が全ページに、囲みが §7 の 5 か所に出ている |
| プレス末尾 | 全 7 件に会社概要と問い合わせ先が付く |
| 画像 | カードは 800 幅、ヒーローは 2400 幅の URL が 404 にならない。WebP が劣化していない |
| フィード・サイトマップ | `feed.xml` が正しい XML、`sitemap.xml` の件数が §9.6 と一致 |
| 権限 | 広報／編集部のアカウントで管理画面に入り、**担当以外が見えない・触れない**。記事を 1 本作って公開し、サイトに出る（確認後に削除） |
| 編集画面 | 必要な欄が出ているか（H3）、書式が想定どおりか（H4） |
| マガジンの本文 | 取り込んだ 5 本を管理画面で開き、ブロックが崩れていない（HTML ブロックが HTML のまま残っている）。公開側の見せ場（質問・引用・数字・注記・ワイド画像・人物紹介）が mockup と同じ HTML で出ている |
| 編集部の手順 | 佐伯のアカウントで §10.3 の手順どおりに 1 本作り（雛形の貼り付け、画像の URL の取り方を含む）、プレビューと公開を確かめる（確認後に削除） |
| ドメインの残り | 公開側の HTML に絶対 URL の `localhost:8090` が、サイトの URL として出る所（フィード・サイトマップ・og:image）以外に無い（§14.1） |

---

## 16. 未確認・リスク

**【構築で確認】結果（2026-11-06）** — 下の表は設計時の内容。構築での結果は次のとおり。

| # | 結果 |
| --- | --- |
| R1 | **解決**。コンテンツデータの URL の最後の段は API の `basename` で指定できる（`identifier` ではない）。スラッグ用フィールドは不要（§4） |
| R2 | **解決**（§10.4）。HTML ブロックは選べ、`class` も保たれ、取り込んだ記事も崩れずに開いて保存し直せる。代案（リッチテキストへの切り替え）は不要 |
| R3 | **問題なし**。WebP は再保存されず元と同一（§8） |
| R4 | **解決**。変換スクリプト（`build/lib.py`）の出力が、20 本の本文（お知らせ 8・プレス 7・マガジン 5）とも mockup の HTML と一致した。固定ページ 3 枚も公開側で一致 |
| R5 | **解決**。`cta` は mockup のどこにも出ていない（§6.5） |
| R6 | **解決**。`replace="想定分配率 ",""` で `年3.8%` と出せる。数値フィールドへの分割は不要（§6.6） |
| R7 | **確認済み**。管理画面で入れた画像の URL はドメイン込み（画像ブロックの本文・画像カスタムフィールドとも）。雛形の写真は `/` から始まる形にする手順にした（マニュアル）。切り替え時の置換は §14.1 の 2 のとおり |

| # | 内容 | 確かめ方と、だめだったときの代案 |
| --- | --- | --- |
| R1 | コンテンツデータの `identifier`（URL の最後の段）を API で指定できるか | 構築時に 1 件作って確かめる。だめなら「スラッグ」のテキストフィールドを足し、マッピングのパスで読む |
| R2 | ブロックエディタで、(a) **HTML ブロックが使える**こと、(b) HTML ブロックの中身が**そのまま保存・公開**されること（`class` が落ちない）、(c) 標準の画像ブロックが §10.1 の `<figure>` と同じ HTML を出すこと、(d) API で本文を入れるときの**保存形式**（ブロックの区切り方） | 管理画面で記事を 1 本作り、HTML ブロックと画像ブロックを置いて保存し、書き出された本文を `mtb sites entries get` で見て確かめる。(a) が使えなければ、書式を「リッチテキスト」に変えて HTML を直接入れる形に切り替える（見せ場は HTML タブから貼る）。この場合は手順が変わるので、先に相談する。(c) が違えば、画像も HTML ブロックで入れる |
| R3 | WebP が MT の再保存で劣化しないか | 最初の 1 枚でサイズと見た目を比べる。だめなら H5 |
| R4 | Markdown → HTML の変換（特に表・ブロック記法）を、mtb の取り込み前に私が別に行う。変換後の HTML を `mockup/` の同じ箇所と比べる | 差があれば変換側を直す |
| R5 | 「サービス詳細」の `cta`（ボタン文言）が mockup のどこに出るか | 未確認。mockup を詳しく読んで、出ないならフィールドだけ作る |
| R6 | 物件の「分配」表示（`想定分配率 年3.8%` → `年3.8%（想定）`）をテンプレートの置換で出せるか | 構築時に試す。だめなら数値フィールドに分ける（§6.6） |
| R7 | 管理画面の画像選択が入れる画像の URL は、**ドメイン込みの絶対 URL**になりうる（編集部が書く記事、§10.3） | 手順書で「ドメインを消す」と書く。残ったものは切り替え時に置換する（§14.1 の 2） |

---

## 17. 決まったこと（第1版の質問への回答）

| # | 質問 | 決定 | 反映先 |
| --- | --- | --- | --- |
| 1 | 公開先 | 手元の MT（`http://localhost:8090/`）で組んで確かめる。サイトの URL は `http://localhost:8090/`、公開パスは `/data/file/static`。公開用ドメインへは、あとで URL を変えて再構築 | §1、§3、§14.1 |
| 2 | アカウント | 情報システム＝`admin` の 1 人。広報＝`aizawa`（`aizawa@five-united.example`）、編集部＝`saeki`（`saeki@five-united.example`）。初期パスワードは構築のときに決め、最後に会話で伝える（ファイルには残さない） | §11.1 |
| 3 | カテゴリの管理 | 許す（組み込みの Editor ロールのまま） | §11.2 |
| 4 | フィード・サイトマップの URL | 提案どおり（`/press/feed.xml` `/magazine/feed.xml` `/sitemap.xml`） | §4、§9.5、§9.6 |
| 5 | サイトの設定 | テンプレートモジュールで持つ | §7 |
| 6 | マガジンのカスタムブロック | **作らない**。標準のブロックと HTML ブロックに mockup と同じ HTML を入れる。編集部の手順は設計書に書く | §10、§13 |

**まだ残っていること**

- 「サービス詳細」のボタン文言（`cta`）が mockup のどこに出るか（R5）。構築前に mockup を読んで確かめるだけで、決めてもらうことはない。
- R2 の確認（HTML ブロックが使えるか）の結果次第で、§10 の方式を変える可能性がある。その場合は先に相談する。
