Skip to content

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日付見出し.dateN月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 であり、ショートコードを記述したコンテンツの互換性を維持するため