نقش‌های وردپرس در سایت‌های آموزش رقص به‌دلیل نیاز به مدیریت ویدئوی تمرین حرکتی، تایم‌لاین موسیقی، بازخورد حرکت‌محور، و کنترل تقویم تمرین گروهی، تنظیمات حرکتی اختصاصی می‌خواهند. یک هنرجوی رقص نباید فقط ویدئوی آموزشی ببیند؛ باید به ضبط تمرین شخصی، به بازخورد استاد روی زمان دقیق حرکت، و به تقویم تمرین گروهی دسترسی داشته باشد، بدون اینکه به ویدئوی سایر هنرجوها یا پروژه‌های دارای حق نشر نفوذ کند. این تعادل میان دسترسی حرکتی و حفاظت از دارایی تصویری، ریشه اصلی نیاز به معماری نقش مبتنی بر حرکت است.

نخستین سایت آموزش رقص که روی وردپرس راه‌اندازی کردم، بعد از یک هفته با شکایت هنرجوها روبه‌رو شد: ویدئوی تمرین یک هنرجو در گالری عمومی ظاهر شده بود. آن تجربه نشان داد که نقش‌های پیش‌فرض وردپرس، حتی برای تفکیک ویدئوی خصوصی از عمومی هم کافی نیستند.

چرا نقش‌های پیش‌فرض کافی نیستند؟

وردپرس شش نقش پیش‌فرض دارد که حول مدیریت محتوا ساخته شده‌اند. در سایت آموزش رقص، این نقش‌ها با شکاف‌های زیر روبه‌رو می‌شوند:

  • نبود تفکیک ویدئوی تمرین: هر هنرجو ویدئوی اختصاصی دارد که باید فقط در اختیار خودش و استاد باشد.
  • نبود بازخورد حرکت‌محور: استاد باید در ثانیه ۰:۳۵ یک حرکت، یادداشت فنی بگذارد.
  • نبود تقویم تمرین گروهی: هماهنگی تمرین گروهی نیازمند یک سیستم تقویم نقش‌محور است.
  • ریسک نقض لایسنس موسیقی: موسیقی تمرین ممکن است دارای حق نشر باشد.

در سایت آموزش رقص، یک ویدئوی تمرین یک دارایی حرکتی است، نه یک فایل ویدئویی ساده.

اگر با مفاهیم پایه نقش و دسترسی آشنا نیستید، مطلب مدیریت نقش‌ها و دسترسی‌ها در وردپرس را ببینید. برای انتخاب افزونه مناسب، مطلب انتخاب افزونه مدیریت کاربران وردپرس را مطالعه کنید.

نقش‌ها در سایت آموزش رقص

هنرجو (Dance Student)

دسترسی به ویدئوی تمرین شخصی، بارگذاری ضبط حرکت، دریافت بازخورد استاد، بدون دسترسی به ویدئوی سایرین.

استاد (Dance Instructor)

مشاهده همه ویدئوهای دوره، ثبت بازخورد حرکت‌محور، بدون دسترسی به موسیقی دارای حق نشر.

طراح حرکت (Choreographer)

مدیریت کریوگرافی، ساخت تمرین گروهی، بدون دسترسی به داده هویتی هنرجوها.

مدیر صحنه (Stage Manager)

مدیریت تقویم تمرین، هماهنگی زمان‌بندی، بدون دسترسی به ویدئوی خصوصی.

داور بیرونی (External Reviewer)

دسترسی محدود به اجرای نهایی، ثبت نظر، بدون دسترسی به فایل‌های تمرین.

چالش‌های دارایی حرکتی

۱. حجم بالای ویدئو

یک ویدئوی تمرین HD می‌تواند ۵۰۰ مگابایت برای هر ۱۰ دقیقه باشد. ذخیره در سرور اصلی اقتصادی نیست. باید از Object Storage و Lifecycle Policy استفاده شود.

۲. استریم ویدئو

پخش ویدئو از سرور اصلی، پهنای باند زیادی مصرف می‌کند. باید از یک CDN ویدئویی اختصاصی استفاده شود. برای مطالعه بیشتر درباره CDN، مطلب CDN و بهبود سرعت سایت را ببینید.

۳. بازخورد زمان‌محور

استاد باید در تایم‌کد مشخص یادداشت بگذارد. این نیازمند ساختار متادیتای دقیق است. برای مطالعه بیشتر، مطلب کار با User Meta در وردپرس را ببینید.

۴. تقویم تمرین گروهی

هماهنگی تمرین گروهی نیازمند یک تقویم مشترک است. برای مطالعه بیشتر، مطلب فیلدهای سفارشی ACF را ببینید.

۵. لایسنس موسیقی

موسیقی تمرین ممکن است دارای حق نشر باشد. باید یک لایه کنترل دسترسی داشته باشیم. برای مطالعه بیشتر، مطلب GitHub در پروژه‌های تیمی را ببینید.

تنظیمات حرکتی هر نقش

نقش دسترسی ویدئو دسترسی موسیقی بازخورد
هنرجو ویدئوی شخصی قطعه تمرین دریافت
استاد همه دوره همه دوره ارائه
طراح حرکت همه دوره مدیریت فنی
مدیر صحنه خیر خیر —
داور بیرونی اجرای نهایی خیر ثبت نظر

پیاده‌سازی با PHP

ابتدا CPT تمرین رقص را می‌سازیم. برای مطالعه بیشتر، مطلب پیاده‌سازی درست Custom Post Type را ببینید.

function wk_register_dance_practice_cpt() {
    register_post_type('wk_dance_practice', array(
        'label' => 'تمرین‌های رقص',
        'public' => false,
        'show_ui' => true,
        'capability_type' => 'wk_dance_practice',
        'capabilities' => array(
            'read_post' => 'read_wk_dance_practice',
            'edit_post' => 'edit_wk_dance_practice',
            'edit_posts' => 'edit_wk_dance_practices',
            'edit_others_posts' => 'edit_others_wk_dance_practices',
        ),
        'map_meta_cap' => true,
        'supports' => array('title', 'author', 'custom-fields'),
    ));
}
add_action('init', 'wk_register_dance_practice_cpt');

سپس نقش‌های سفارشی را می‌سازیم. برای درک هوک‌ها، مطلب هوک‌های وردپرس را ببینید.

function wk_register_dance_roles() {
    add_role('wk_dance_student', 'هنرجوی رقص', array(
        'read' => true,
        'edit_wk_dance_practices' => true,
        'publish_wk_dance_practices' => true,
        'upload_files' => true,
    ));

    add_role('wk_dance_instructor', 'استاد رقص', array(
        'read' => true,
        'edit_wk_dance_practices' => true,
        'edit_others_wk_dance_practices' => true,
        'read_wk_movement_feedback' => true,
        'edit_wk_movement_feedback' => true,
    ));

    add_role('wk_stage_manager', 'مدیر صحنه', array(
        'read' => true,
        'manage_wk_rehearsal_schedule' => true,
    ));
}
add_action('init', 'wk_register_dance_roles');

برای اعتبارسنجی و پاک‌سازی داده‌ها، مطلب اعتبارسنجی داده‌ها و پاک‌سازی داده‌ها را ببینید.

خط لوله ویدئوی حرکت

مدیریت ویدئو نیازمند یک لایه میانی است. الگوی پیشنهادی:

function wk_upload_practice_video($user_id, $file, $practice_id) {
    if (!current_user_can('upload_files')) {
        return new WP_Error('forbidden', 'دسترسی غیرمجاز');
    }
    $allowed = array('video/mp4', 'video/quicktime', 'video/webm');
    if (!in_array($file['type'], $allowed, true)) {
        return new WP_Error('invalid_type', 'نوع فایل مجاز نیست');
    }
    $key = sprintf('dance/%d/%s', $practice_id, wp_generate_uuid4());
    $preview = wk_generate_video_preview($file['tmp_name']);
    update_post_meta($practice_id, 'wk_video_key_' . md5($key), $key);
    update_post_meta($practice_id, 'wk_video_preview_' . md5($key), $preview);
    return $key;
}

نکته کلیدی: ویدئوی خام هرگز در uploads نگهداری نمی‌شود. فقط پیش‌نمایش فشرده برای پخش در دسترس است. برای مطالعه بیشتر، مطلب توابع وردپرس برای کار با فایل‌ها را ببینید.

بازخورد حرکت‌محور

بازخورد باید امکان اشاره به تایم‌کد دقیق را داشته باشد:

function wk_save_movement_feedback($practice_id, $instructor_id, $time_sec, $comment) {
    $feedback = get_post_meta($practice_id, 'wk_movement_feedback', true);
    if (!is_array($feedback)) {
        $feedback = array();
    }
    $feedback[] = array(
        'instructor_id' => $instructor_id,
        'time_sec' => (int) $time_sec,
        'comment' => sanitize_textarea_field($comment),
        'created_at' => current_time('mysql'),
    );
    update_post_meta($practice_id, 'wk_movement_feedback', $feedback);
}

برای مطالعه بیشتر درباره Options API، مطلب کار با Options API در وردپرس را ببینید. همچنین مطلب آموزش انیمیشن در CSS برای طراحی رابط پخش مفید است.

امنیت و حریم خصوصی

سه لایه امنیتی ضروری است:

  1. اعتبارسنجی MIME Type فایل ویدئویی (نه فقط پسوند).
  2. ذخیره فایل خام در Object Storage با Token موقت و انقضا.
  3. ثبت لاگ هر پخش و هر دانلود برای ممیزی.

برای مطالعه بیشتر درباره امنیت فایل، مطلب توابع وردپرس برای امنیت و پاک‌سازی داده‌ها را ببینید. استاندارد OWASP مرجع اصلی امنیت آپلود فایل است. برای Nonce، مطلب نانس وردپرس و امنیت فرم را ببینید.

پرسش‌های پرتکرار

آیا می‌توانم از نقش Author برای هنرجو استفاده کنم؟

خیر. Author به همه پست‌های خودش دسترسی دارد، اما هیچ مکانیزمی برای تفکیک ویدئوی خصوصی از عمومی وجود ندارد. باید نقش سفارشی بسازید.

بهترین روش برای ذخیره ویدئوی تمرین چیست؟

Object Storage (S3، Backblaze B2)، CDN ویدئویی برای توزیع، و لینک امضاشده با انقضا. برای فایل‌های قدیمی، Lifecycle Policy به Archive.

چگونه پیش‌نمایش ویدئو بسازم؟

با FFmpeg در یک Worker جدا. برای فایل‌های حجیم، بهتر است از Transcoding خوشه‌ای استفاده شود.

آیا استفاده از Prototyping برای آموزش رقص مفید است؟

بله، برای طراحی رابط پخش و تقویم. مطلب پروتوتایپ چیست و چرا مهم است را ببینید.

چگونه حرکت را با CSS شبیه‌سازی کنم؟

مطلب آموزش انیمیشن در CSS را ببینید.

اشتباهات رایج

اشتباه پیامد راه‌حل
آپلود ویدئو در uploads دانلود عمومی Object Storage + Token
نقش یکسان برای هنرجو و استاد نشت ویدئو بین هنرجوها نقش سفارشی مجزا
پخش مستقیم از سرور اصلی مصرف پهنای باند بالا CDN ویدئویی اختصاصی
نبود لاگ پخش عدم امکان ممیزی ثبت در Options API
تولید پیش‌نمایش در HTTP کندی سایت Worker جدا با FFmpeg

نگاه مهندسی سطح‌بالا

در معماری یک پلتفرم آموزش رقص، چالش اصلی «هماهنگی بین حرکت، موسیقی، و زمان» است. هر تمرین یک خط زمانی دارد که حرکت و موسیقی باید در آن همگام شوند. سیستم پیش‌فرض وردپرس، این هماهنگی را نمی‌شناسد.

رویکرد پیشنهادی، معماری «Timeline-Based Access» است. هر ویدئوی تمرین به یک خط زمانی متصل است که شامل تایم‌کدهای حرکت، موسیقی، و بازخورد است. دسترسی هنرجو به بخشی از ویدئو، فقط در بازه دوره فعال است.

نکته دوم، بحث «Adaptive Bitrate Streaming» است. برای اینکه ویدئو در همه شرایط شبکه پخش شود، باید از HLS یا DASH استفاده شود. این نیازمند یک لایه Transcoding با تنظیمات ثابت است.

نکته سوم، بحث «Cost Attribution» است. هر دقیقه پخش ویدئو باید به یک کاربر، یک تمرین، و یک دوره نسبت داده شود. این برای تحلیل هزینه و تصمیم‌گیری قیمت‌گذاری ضروری است.

اگر این چالش‌ها را در پروژه واقعی تجربه کرده‌اید، برای من جالب است بدانم کدام بخش بیشترین زمان را گرفت: مدیریت ویدئو، بازخورد حرکت‌محور، یا تقویم تمرین. تجربه خود را در دیدگاه‌ها بنویسید.