カスタム投稿タイプ web_lecture の編集画面。register_post_type() で 'show_ui' => true にしつつ、デフォルトのエディタを無効化('supports' => ['title'])し、全フィールドをカスタムメタボックスで構成。メタボックスは add_meta_box() で登録し、'normal'(メインカラム)と 'side'(サイドカラム)に配置。保存処理は save_post_web_lecture フックで実装。Vimeo動画IDはURLから正規表現で自動抽出: /vimeo\.com\/(\d+)/。ファイルアップロードはWPメディアライブラリ連携(wp_enqueue_media())。
編集画面アクセス: manage_lms_content 権限チェック。新規作成・編集・削除それぞれで current_user_can() を検証。ゴミ箱移動は manage_lms_content 必須、完全削除は管理者(manage_options)のみ。受講統計メタボックスは読み取り専用で全権限者に表示。メディアライブラリへのアクセスは upload_files 権限を付与済みの前提。
投稿テーブル: wp_posts(post_type = 'web_lecture')。メタデータ: wp_postmeta に各カスタムフィールドを保存。キー名は _lms_ プレフィックス(例: _lms_vimeo_video_id、_lms_lecture_duration、_lms_instructor_id、_lms_subtitle_file、_lms_material_files(シリアライズ配列)、_lms_target_level、_lms_target_service、_lms_sort_order)。受講統計はリアルタイム集計ではなくキャッシュテーブル lms_lecture_stats から読み込み(TTL: 1時間)。講師リレーションは _lms_instructor_id でカスタム投稿タイプ instructor のIDを参照。
編集画面では行アクション不要(一覧画面で定義済み)。「← 一覧に戻る」リンクで一覧画面へ遷移。「新規追加」で新規編集画面を開く。保存後のリダイレクト先は wp_redirect(admin_url('admin.php?page=lms-web-lectures&action=edit&id=' . $post_id . '&message=1'))。メッセージパラメータで成功通知を表示。「ゴミ箱へ移動」は確認ダイアログ表示後に実行(WP標準のJS確認)。
編集画面のメタボックス表示/非表示はWP標準の Screen Options で制御。add_meta_box() で登録した各メタボックスが Screen Options パネルに自動反映。メタボックスの折りたたみ状態はユーザーメタ closedpostboxes_web_lecture に保存。メタボックスのドラッグ&ドロップ並べ替えはWP標準機能を利用(postbox.js)。
全フォーム送信時に wp_nonce_field('lms_save_web_lecture', 'lms_web_lecture_nonce') でNonce検証。Vimeo URLは esc_url() でサニタイズ、動画IDは absint() で数値のみ許可。テキストフィールドは sanitize_text_field()、テキストエリアは wp_kses_post() でサニタイズ。ファイルアップロードはMIMEタイプチェック(PDF/PPTX/DOCX/VTT)。字幕ファイルは .vtt 拡張子のみ許可(upload_mimes フィルタで追加)。シリアライズ配列(資料ファイル)は maybe_serialize() / maybe_unserialize() で安全に処理。受講統計のキャッシュは wp_cache_set() / wp_cache_get() またはトランジェントAPI(set_transient())で管理。大量メタデータの読み込みはオートロード無効('autoload' => 'no')で対応。