カスタム投稿タイプ lecture_group の編集画面。register_post_type() で 'supports' => ['title'] のみ指定し、残フィールドはカスタムメタボックスで構成。メタボックス「基本情報」を 'normal'、「所属講義の管理」を 'normal'、カテゴリ・対象属性・グループ統計を 'side' に配置。所属講義の紐付けはピボットテーブル lms_group_lectures で管理(MtoM)。表示順は sort_order カラムで制御。講義追加の検索は REST API /wp-json/lms/v1/lectures?search= を利用(実装時)。ドラッグ&ドロップ並べ替えはワイヤー上では表示順入力欄で代替表現。
グループ編集画面アクセス: manage_lms_content 権限を持つユーザー(事務局)のみ。current_user_can('manage_lms_content') で保護。グループ削除(ゴミ箱移動)は manage_lms_content 必須、完全削除は管理者(manage_options)のみ。グループ統計メタボックスは読み取り専用で表示。一般会員・法人管理者・事業所管理者は WP管理画面にアクセス不可。
グループ本体: wp_posts(post_type = lecture_group)。グループメタ: wp_postmeta に _lms_group_description、_lms_group_thumbnail、_lms_sort_order、_lms_target_level、_lms_target_service を保存。所属講義の紐付けはカスタムテーブル lms_group_lectures(カラム: id、group_id、lecture_id、sort_order、created_at)で管理。グループと講義は多対多のリレーション(1つの講義が複数グループに所属可)。グループ統計は lms_lecture_stats の集計値をキャッシュ(TTL: 1時間)。
本編集画面では一括操作不要(一覧画面で定義)。「← 一覧に戻る」リンクでグループ一覧へ遷移。所属講義の「削除」ボタンはグループ内からの除籍のみ(講義データ本体は削除しない)。講義追加は検索フォームから候補を選んで「追加」ボタン。表示順は数値入力欄で変更後「更新」ボタンで一括保存。ゴミ箱移動後はグループ統計の研修計画利用数を参照し、利用中の場合は確認ダイアログを表示(実装時)。
WP標準の Screen Options パネルで各メタボックスの表示/非表示を制御。add_meta_box() 登録時のコンテキスト('normal'/'side')に応じて自動でパネルに列挙される。折りたたみ状態はユーザーメタ closedpostboxes_lecture_group に保存。グループ統計メタボックスはデフォルト表示、折りたたみのみ許可(削除不可の設定を推奨)。メタボックスのドラッグ&ドロップ並べ替えはWP標準の postbox.js が担う。
全フォーム送信時に wp_nonce_field('lms_save_lecture_group', 'lms_lecture_group_nonce') でNonce検証。保存ハンドラ内で wp_verify_nonce() を必ず実行し、失敗時は wp_die()。テキストフィールドは sanitize_text_field()、概要テキストエリアは sanitize_textarea_field() でサニタイズ。所属講義IDは absint() で数値のみ許可し、存在確認クエリを挟む。lms_group_lectures の更新は $wpdb->prepare() を使用してSQLインジェクション対策。表示順の一括更新はトランザクション($wpdb->query('START TRANSACTION'))でアトミックに処理。グループ統計の集計クエリは get_transient('lms_group_stats_{id}') でキャッシュ(TTL: 3600秒)、更新時に delete_transient()。大量講義を含むグループの一覧取得は LIMIT/OFFSET でページネーション対応。