Skip to content

有料記事 画像スナップショット方針

概要

  • 有料記事(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_contentcontent<img class="PaidArticle__snapshot" …> に置換(ライブ SC は出さない)
attachment なしショートコード等のライブ HTML

プレビュー用にスナップショットを無視する経路(build_presentation_without_snapshots)は、キャプチャ元 HTML と note 未生成チェックで使用する。

生成方式

方式理由
管理画面ボタン(クライアント html2canvas → AJAX 保存)共有ホスティングで headless 不要
個別「スナップショット生成」1 セクションの再生成用
「すべて生成」(順次)号全体の保全をワン操作で行う

未採用案・拡張案は 画像スナップショット-検討.md に分離する。

キャプチャ技術(as-built)

  1. 管理画面が公開/プレビュー URL を隠し iframe で開く。
  2. #paid-article-section-{section_key}(本体は .PaidArticle__section-body)を html2canvas で JPEG data URL 化。
  3. POST admin-ajax.phpaction=paid_article_save_snapshot)で base64 を送り、メディアライブラリへ保存。
  4. 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 必須セクションを埋める)

公開フックによる自動スナップショットは行わない。

初号リリース時の最小運用

  1. データセクションをライブで確認する。
  2. 「すべて生成」を実行する(または #5・#7 を個別生成)。
  3. 公開/note 転記前に未生成警告がないことを確認する。

ストレージ見積もり(目安)

  • 号あたりキャプチャ対象 6〜10 セクション想定。
  • 1 枚あたり数百 KB〜数 MB(チャート込み JPEG)。
  • 月 1 号なら年間数十枚規模。メディアフォルダ整理は既存 MediaFolder 連携に委ねる。

AJAX 契約(要約)

action権限主なパラメータ成功時
paid_article_save_snapshotedit_posts + upload_files、かつ対象投稿の edit_postpost_id, section_key, image_data, format, qualityattachment_id, url, section_key
paid_article_delete_snapshotedit_posts、かつ対象投稿の edit_postpost_id, section_keysection_key

詳細は EP 個別設計書で扱う。

as-built 参照

役割パス
メタボックスcore_src/PostType/PaidArticle/Admin/EditScreen/Snapshot/PaidArticleSnapshotMetaBox.php
アセット / localize.../PaidArticleSnapshotAssets.php
AJAX.../PaidArticleSnapshotAjaxHandler.php
保存 Servicecore_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