Appearance
SC-006 誕生日一覧ショートコード
概要
- スロット機種キャラクター・声優の誕生日一覧を月別に折り畳み表示するショートコード。
- 全データを DB から取得し、キャラ誕生日と声優誕生日に分類してキャラ名昇順(機種名昇順)でソート後、Twig テンプレートで HTML を生成する。
- 属性(
month/year/display_type)は公開契約として受け付け、バリデーションする。表示は全件一覧を正とする。 - 管理画面(
is_admin() === true)では出力しない(空文字を返す)。
ワイヤーフレーム
ワイヤーフレームでは構成把握のため 4 月のみ開いた状態 のサンプルデータを表示する(本番は全月初期閉じ。他月はサンプル省略のため閉じ見た目のみ)。
ブロック一覧
| ブロックID | ブロック名 | 表示内容 | 初期値 | ユーザー操作 | アクション |
|---|---|---|---|---|---|
B-0 | 一覧コンテナ | section.birth-day-index(灰背景カード) | 常時表示 | なし | - |
B-1 | 月アコーディオン | details.month × 12(summary: N月) | すべて閉じ | 月の開閉(ネイティブ <details>) | - |
B-2 | 日付見出し | .date(N月D日)+アンカー id="birth-day-index_{month}_{day}" | データがある日のみ | なし(深リンク先) | - |
B-3 | キャラ誕生日テーブル | .character-header「キャラ誕生日」+行(機種/タイトル | キャラ名) | その日にキャラデータがあるときのみ | なし | - |
B-4 | 声優誕生日テーブル | .actor-header「声優誕生日」+ cv.{actor} グループ+行(タイトル | キャラ名) | その日に声優データがあるときのみ | なし | - |
表示条件・注記
- 管理画面:
is_admin() === trueのときはショートコード全体を出力しない(空文字)。 - 月の折り畳み: 各月は
<details>で初期閉じ。日付単位のアコーディオンは無い(月を開くと、データのある日がすべて見える)。 - 空の日:
character_birth_days/voice_actor_birth_daysのいずれも無い日は、日付見出し・テーブルごと非表示。 - 分類: キャラ誕生日と声優誕生日は別テーブル。声優側は
cv.{actor}で声優ごとにグループ化する。 - 属性フィルター:
month/year/display_typeはバリデーションのみ。表示は全件一覧。 - アンカー:
birth-day-index_{month}_{day}を深リンク用に維持する(変更しない)。
外部インターフェース
ショートコードタグ
- タグ名:
[BirthDayIndex] - 入力例:
[BirthDayIndex]
属性一覧
| 属性 | 役割 | 必須 | 許容値 |
|---|---|---|---|
month | 月指定値のバリデーション | — | 整数 1〜12 |
year | 年指定値のバリデーション | — | 整数 1900〜currentYear+10 |
display_type | 表示種別値のバリデーション | — | all / character / voice_actor |
属性を省略した場合、または空文字を渡した場合は null として扱い、全件表示となる。
エラー
| 条件 | ユーザー向け挙動 | メッセージ / ログ |
|---|---|---|
month が非数値または範囲外(1〜12 以外) | バリデーションメッセージをインライン表示 | Messages::VALIDATION_MONTH_INVALID_TYPE / Messages::VALIDATION_DATE_INVALID_MONTH |
year が非数値または範囲外(1900〜currentYear+10) | バリデーションメッセージをインライン表示 | Messages::VALIDATION_YEAR_INVALID_TYPE / Messages::VALIDATION_YEAR_INVALID_RANGE_FORMAT |
display_type が非文字列または許容値以外 | バリデーションメッセージをインライン表示 | Messages::VALIDATION_DISPLAY_TYPE_INVALID_TYPE / Messages::VALIDATION_DISPLAY_TYPE_INVALID_VALUE_FORMAT |
DB 取得やレンダリングの Throwable | エラーが発生しました:execute_if_not_admin を表示 | error_log(先頭 [ShortCodeHelper]、クラス名・メッセージ・ファイル・行番号) |
管理画面(is_admin() === true) | 出力なし(空文字) | — |
バリデーション例外(ValidationException)は esc_html() でサニタイズしてインライン表示する(ShortCodeHelper::execute_if_not_admin() 参照)。
今後の更新で崩してはいけないところ(互換性契約)
公開契約(Breaking change 扱い)
- ショートコード名
BirthDayIndexを変更しない- 理由: 過去投稿の本文に文字列が直書きされているため、変更するとショートコードが機能しなくなる
- 属性名
month/year/display_typeを変更しない- 理由: フィルター機能が実装された際にそのまま使われる公開 API であり、ショートコードを記述したコンテンツの互換性を維持するため