Appearance
ADM-013 誕生日シード管理画面
概要
- スロカレから誕生日データを取得して
db_birthdayへ投入する実行と、投入結果の確認を行う管理画面。 - WordPress 設定サブメニュー(
add_options_page)として登録。CRUD 操作はフォーム POST、シード実行は admin-ajax 経由で処理する。 - 全件シード(
birthday_seed_run)の再実行防止は Transient で TTL=1時間のクールダウン。URL 指定取得にはクールダウンを掛けない(Issue #3892)。実行中の二重起動防止はwp_optionsロック(BirthdaySeedRunLock。CLI・RESTbirthday/v1と共有)で制御する。 - 一覧はキャラ名・作品名・区分・月・日でフィルタリング可能で、ページネーション(デフォルト 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_id | add/update | 正整数(db_title_master.id) | 作品名(マスタ選択。省略時は空文字マスタ) |
birthday_seed_actor | add/update | 文字列(max 255文字) | 声優名(声優誕 選択時のみ有効) |
備考: 声優誕 かつ声優名あり → DB 保存値は (声誕)声優名 の形式に変換して保存。
リダイレクト後クエリ(通知)
| クエリ | 内容 |
|---|---|
bs_success | 1 成功、0 失敗 |
bs_msg | 表示文言(URL エンコード) |
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_id | bigint unsigned | 作品名マスタ(db_title_master.id) |
作品名の表示・検索は db_title_master.name を JOIN して行う。作品名の追加・改名・統合は ADM-030 作品名マスタ で行う。
一覧フィルタ・ソート
| 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 |
一覧 URL のエンコード
ページネーション・ソート・編集リンクとリダイレクト先はいずれも build_list_page_url() が組み立てる。add_query_arg() は値をエンコードしないため、AdminQueryUrl が渡された生値を 1 回だけ URL エンコードする(通知の bs_msg も同じ扱い)。生値のままだと & や # を含むキャラ名・作品名で検索したときに条件や文言が途中で切れる。
既知の制約: 受け取り側の sanitize_text_field() は % + 16 進 2 桁を削除するため、A%2Bb のような検索語は往復で値が変わる。
クールダウン・ロック制御
| 仕組み | キー | TTL / 閾値 | 用途 |
|---|---|---|---|
| Transient クールダウン | birthday_seed_cooldown | 3600秒(1時間) | 全件シード実行後の再実行防止(時刻を value に保存) |
wp_options 実行中ロック | birthday_seed_cooldown_running | — | 同時二重起動防止(管理画面・CLI・REST 共通) |
| 最終 URL 取込日時 | birthday_sulocale_last_import_at | — | URL 指定取込の成功日時(ops-status/v1/birthday) |
| 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 |
| 作品名マスタが未選択・不正 | リダイレクト+エラーメッセージ表示 | BirthdaySeedMessages::TITLE_REQUIRED 等 |
| 声優名が 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 は例外クラス名とコードのみ |
| URL が空(by_url) | JSON エラー返却 | Messages::BIRTHDAY_SEED_URL_REQUIRED |
| 月・日両方指定で不正日付(例: 2/31) | 日パラメータをクリアしてリダイレクト | Messages::BIRTHDAY_SEED_DATE_INVALID |