Skip to content

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・REST birthday/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_idupdate/delete正整数操作対象エントリ ID
birthday_seed_monthadd/update整数 1〜12月(必須)
birthday_seed_dayadd/update整数 1〜31日(必須)
birthday_seed_diviadd/update"キャラ誕" または "声優誕"区分(必須)
birthday_seed_charaadd/update文字列(max 255文字)キャラ名(必須)
birthday_seed_title_idadd/update正整数(db_title_master.id)作品名(マスタ選択。省略時は空文字マスタ)
birthday_seed_actoradd/update文字列(max 255文字)声優名(声優誕 選択時のみ有効)

備考: 声優誕 かつ声優名あり → DB 保存値は (声誕)声優名 の形式に変換して保存。

リダイレクト後クエリ(通知) ​

クエリ内容
bs_success1 成功、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 ​

カラム型説明
idint PK自動採番
monthint月(1〜12)
dayint日(1〜31)
divivarchar区分。キャラ誕 / (声誕)声優名 形式
charavarchar(255)キャラ名
title_idbigint 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_cooldown3600秒(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 = 600600秒ロックが 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
シードサービスで \ThrowableJSON エラー返却(固定文言)例外コードから固定文言を選ぶ。error_log は例外クラス名とコードのみ
URL が空(by_url)JSON エラー返却Messages::BIRTHDAY_SEED_URL_REQUIRED
月・日両方指定で不正日付(例: 2/31)日パラメータをクリアしてリダイレクトMessages::BIRTHDAY_SEED_DATE_INVALID