Appearance
有料記事 画像スナップショット方針
概要
- 有料記事(CPT
paid_article)のショートコード/データ表示を、公開時点の見た目として画像保全する方針を定める(デグレ対策)。 - 管理画面メタボックスを正本とし、全セクション順次生成 UI で号全体のスナップショットを保全する。
- 記事全体を 1 枚の長尺スクショにはしない。セクション単位で保存・表示切替する。号全体の保全は、表示中セクションを一括(順次)生成することで行う。
関連 Issue
| Issue | 内容 |
|---|---|
| #2381 | 親 Issue(有料記事の体制を整える) |
| #2385 | 固定セクション ↔ ショートコード対応(優先度の前提) |
| #2386 | 本書(スナップショット方針) |
| #2391 | 画像スナップショット機能 |
対象 / 非対象
正本の優先度は 固定セクション-ショートコード対応表 の「スナップショット優先度」節。note エクスポート時の必須判定は PaidArticleNoteExportSectionPolicy と揃える。
| 区分 | セクション | スナップショット | 備考 |
|---|---|---|---|
| 対象外 | 固定 #1 冒頭挨拶、固定 #3 来月の導入台 | 原則不要 | 手動 HTML が正本 |
| 高 | 固定 #5 機種差枚ランキング、固定 #7 新台出玉推移 | 推奨・初号必須想定 | Chart.js / REST 依存 |
| 中 | 固定 #4 月差枚数、#6 増減台、#8 ホール差枚ランキング | 推奨 | 表・数値の仕様変更影響。#8 は note 必須(hall_samai_ranking) |
| 低〜中 | 固定 #2 初週比較、オプション特定機種結果 | 推奨(エクスポート時は必須) | 日次カード中心だが note 転記では画像必須 |
| オプション | 可変セクション | Policy 上は必須外 | UI 上 visible なら一括生成の対象になり得る |
一括生成の対象
管理画面の「すべて生成」は、メタボックスに載るセクションのうち visible === true のものだけを直列処理する。非表示セクションはスキップする(個別ボタンと同じ)。
ライブ表示 / スナップショット切替
| 状態 | フロント表示 |
|---|---|
| 当該セクションに attachment あり | PaidArticleTemplateService::apply_snapshot_content が content を <img class="PaidArticle__snapshot" …> に置換(ライブ SC は出さない) |
| attachment なし | ショートコード等のライブ HTML |
プレビュー用にスナップショットを無視する経路(build_presentation_without_snapshots)は、キャプチャ元 HTML と note 未生成チェックで使用する。
生成方式
| 方式 | 理由 |
|---|---|
| 管理画面ボタン(クライアント html2canvas → AJAX 保存) | 共有ホスティングで headless 不要 |
| 個別「スナップショット生成」 | 1 セクションの再生成用 |
| 「すべて生成」(順次) | 号全体の保全をワン操作で行う |
未採用案・拡張案は 画像スナップショット-検討.md に分離する。
キャプチャ技術(as-built)
- 管理画面が公開/プレビュー URL を隠し iframe で開く。
#paid-article-section-{section_key}(本体は.PaidArticle__section-body)をhtml2canvasで JPEG data URL 化。POST admin-ajax.php(action=paid_article_save_snapshot)で base64 を送り、メディアライブラリへ保存。- post_meta
paid_article_snapshot_{section_key}に attachment ID を保持。旧 attachment は置換時に削除。
一括生成は上記 2〜4 を visible セクションに対して 直列 に繰り返す。1 件失敗しても残りは続行し、最後に失敗一覧を表示する。
保存形式
| 項目 | 方針 |
|---|---|
| 保存先 | WordPress メディアライブラリ |
| 紐付け | paid_article_snapshot_{section_key}(post_meta) |
| 形式 | JPEG(管理 UI 既定品質 90)。サーバは jpeg / webp / png を受理 |
| サイズ上限 | 10MB(PaidArticleSnapshotService::MAX_BYTES)と wp_max_upload_size の小さい方 |
| alt | セクション label(なければ section_title) |
| アクセシビリティ | 画像置換時も alt を付与。長文データは画像化によりスクリーンリーダーでは詳細を読めない点を許容(デグレ耐性優先) |
生成タイミングと運用
| タイミング | 操作 |
|---|---|
| 新号作成中 | ライブで編集・プレビュー確認 |
| 公開確定前 | 「すべて生成」で visible セクションを一括生成(最低でも優先度「高」は必須) |
| 公開後にデータ修正 | 変更したセクションのみ個別再生成 |
| note エクスポート前 | get_missing_snapshot_sections の警告を解消(Policy 必須セクションを埋める) |
公開フックによる自動スナップショットは行わない。
初号リリース時の最小運用
- データセクションをライブで確認する。
- 「すべて生成」を実行する(または #5・#7 を個別生成)。
- 公開/note 転記前に未生成警告がないことを確認する。
ストレージ見積もり(目安)
- 号あたりキャプチャ対象 6〜10 セクション想定。
- 1 枚あたり数百 KB〜数 MB(チャート込み JPEG)。
- 月 1 号なら年間数十枚規模。メディアフォルダ整理は既存 MediaFolder 連携に委ねる。
AJAX 契約(要約)
| action | 権限 | 主なパラメータ | 成功時 |
|---|---|---|---|
paid_article_save_snapshot | edit_posts + upload_files、かつ対象投稿の edit_post | post_id, section_key, image_data, format, quality | attachment_id, url, section_key |
paid_article_delete_snapshot | edit_posts、かつ対象投稿の edit_post | post_id, section_key | section_key |
詳細は EP 個別設計書で扱う。
as-built 参照
| 役割 | パス |
|---|---|
| メタボックス | core_src/PostType/PaidArticle/Admin/EditScreen/Snapshot/PaidArticleSnapshotMetaBox.php |
| アセット / localize | .../PaidArticleSnapshotAssets.php |
| AJAX | .../PaidArticleSnapshotAjaxHandler.php |
| 保存 Service | core_src/Service/paid_article_snapshot_service/PaidArticleSnapshotService.php |
| 管理 UI (TS) | core_src/PostType/paid_article/Admin/EditScreen/Snapshot/assets/src/paid-article-snapshot.tsx |
| フロント切替 | core_src/Service/paid_article_template_service/PaidArticleTemplateService.php |
| note 必須判定 | core_src/Util/paid_article_note_export_section_policy/PaidArticleNoteExportSectionPolicy.php |
| 文言 | core_src/Constants/PaidArticleSnapshotCopy.php |