Appearance
ADM-013 誕生日シード管理画面
概要
- スロカレから誕生日データを取得して
db_birthdayへ投入する実行と、投入結果の確認を行う管理画面。 - WordPress 設定サブメニュー(
add_options_page)として登録。CRUD 操作はフォーム POST、シード実行は admin-ajax 経由で処理する。 - 再実行防止は Transient で TTL=1時間のクールダウン。実行中の二重起動防止は
wp_optionsロックで制御する。 - 一覧はキャラ名・作品名・区分・月・日でフィルタリング可能で、ページネーション(デフォルト 50 件)とソートに対応する。
外部インターフェース
管理画面 URL
| 項目 | 値 |
|---|---|
| URL | /wp-admin/options-general.php?page=birthday-seed-admin |
| メニュー名 | 誕生日シード |
| 権限 | manage_options |
フォーム POST(同期 CRUD)
すべて POST options-general.php?page=birthday-seed-admin へ送信し、処理後にリダイレクトする。
birthday_seed_action 値 | 処理 |
|---|---|
add | 新規エントリ追加 |
update | 既存エントリ更新 |
delete | 指定 ID のエントリ削除 |
Nonce フィールド: birthday_seed_nonce(検証アクション: birthday_seed_admin)
主な POST パラメータ
| フィールド | 操作 | 型・制約 | 説明 |
|---|---|---|---|
birthday_seed_id | update/delete | 正整数 | 操作対象エントリ ID |
birthday_seed_month | add/update | 整数 1〜12 | 月(必須) |
birthday_seed_day | add/update | 整数 1〜31 | 日(必須) |
birthday_seed_divi | add/update | "キャラ誕" または "声優誕" | 区分(必須) |
birthday_seed_chara | add/update | 文字列(max 255文字) | キャラ名(必須) |
birthday_seed_title | add/update | 文字列(max 255文字) | 作品名(省略可) |
birthday_seed_actor | add/update | 文字列(max 255文字) | 声優名(声優誕 選択時のみ有効) |
備考: 声優誕 かつ声優名あり → DB 保存値は (声誕)声優名 の形式に変換して保存。
admin-ajax(HTTP 契約)
すべて POST /wp-admin/admin-ajax.php、manage_options 権限+nonce 必須。
action 値 | 説明 |
|---|---|
birthday_seed_run | スロカレ標準 URL でシードを実行 |
birthday_seed_run_by_url | 指定 URL からシードを実行 |
POST パラメータ・レスポンス data の契約は ADM-013-1 birthday_seed_run および ADM-013-2 birthday_seed_run_by_url(EP-015 / EP-016)を参照。
データ
テーブル: db_birthday
| カラム | 型 | 説明 |
|---|---|---|
id | int PK | 自動採番 |
month | int | 月(1〜12) |
day | int | 日(1〜31) |
divi | varchar | 区分。キャラ誕 / (声誕)声優名 形式 |
chara | varchar(255) | キャラ名 |
title | varchar(255) | 作品名 |
一覧フィルタ・ソート
| GET パラメータ | 説明 | デフォルト |
|---|---|---|
bs_search_chara | キャラ名部分一致 | 空(全件) |
bs_search_title | 作品名部分一致 | 空(全件) |
bs_search_divi | 区分フィルタ(空/キャラ誕/声優誕) | 空(全件) |
bs_month | 月フィルタ(1〜12、0=指定なし) | 0 |
bs_day | 日フィルタ(1〜31、0=指定なし) | 0 |
bs_orderby | ソートキー(id/month/day/divi/chara/title) | id |
bs_order | ソート方向(asc/desc) | asc |
bs_paged | ページ番号(1以上) | 1 |
bs_per_page | 表示件数(20/50/100/200) | 50 |
クールダウン・ロック制御
| 仕組み | キー | TTL / 閾値 | 用途 |
|---|---|---|---|
| Transient クールダウン | birthday_seed_cooldown | 3600秒(1時間) | シード実行後の再実行防止(時刻を value に保存) |
wp_options 実行中ロック | birthday_seed_cooldown_running | — | 同時二重起動防止 |
| stale ロック回収閾値 | LOCK_STALE_SECONDS = 600 | 600秒 | ロックが 600秒以上経過したら古いロックとみなし回収 |
エラー
| 条件 | ユーザー向け挙動 | メッセージ / ログ |
|---|---|---|
| nonce 不正 | リダイレクト+エラーメッセージ表示 | Messages::AUTH_FAILED |
manage_options 権限なし | wp_die() または JSON エラー | Messages::PERMISSION_DENIED |
| 月が範囲外(1〜12以外) | リダイレクト+エラーメッセージ表示 | Messages::BIRTHDAY_SEED_MONTH_INVALID |
| 日が範囲外(1〜31以外) | リダイレクト+エラーメッセージ表示 | Messages::BIRTHDAY_SEED_DAY_INVALID |
| 月日の組み合わせが不正(例: 2/31) | リダイレクト+エラーメッセージ表示 | Messages::BIRTHDAY_SEED_DATE_INVALID |
| 区分が空 | リダイレクト+エラーメッセージ表示 | Messages::BIRTHDAY_SEED_DIVI_REQUIRED |
| 区分が不正値 | リダイレクト+エラーメッセージ表示 | Messages::BIRTHDAY_SEED_DIVI_INVALID |
| キャラ名が空 | リダイレクト+エラーメッセージ表示 | Messages::BIRTHDAY_SEED_CHARA_REQUIRED |
| キャラ名が 255 文字超 | リダイレクト+エラーメッセージ表示 | Messages::BIRTHDAY_SEED_CHARA_MAX |
| 作品名が 255 文字超 | リダイレクト+エラーメッセージ表示 | Messages::BIRTHDAY_SEED_TITLE_MAX |
| 声優名が 255 文字超(声優誕のみ) | リダイレクト+エラーメッセージ表示 | Messages::BIRTHDAY_SEED_ACTOR_MAX |
| ID が 0 以下(update/delete) | リダイレクト+エラーメッセージ表示 | Messages::REST_INVALID_ID_MESSAGE |
| 追加時に重複エントリ | リダイレクト+エラーメッセージ表示 | Messages::BIRTHDAY_SEED_ADD_DUPLICATE |
| クールダウン中にシード実行 | JSON エラー返却 | Messages::BIRTHDAY_SEED_COOLDOWN_ACTIVE(残時間付き) |
| 実行中ロック取得失敗 | JSON エラー返却 | Messages::BIRTHDAY_SEED_RUN_IN_PROGRESS |
シードサービスで \Throwable | JSON エラー返却 | error_log([BirthdaySeedAdminPage] 先頭) |
| URL が空(by_url) | JSON エラー返却 | Messages::BIRTHDAY_SEED_URL_REQUIRED |
| 月・日両方指定で不正日付(例: 2/31) | 日パラメータをクリアしてリダイレクト | Messages::BIRTHDAY_SEED_DATE_INVALID |