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

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

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

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

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

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

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

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

هنرجو (Skill Learner)

دسترسی به پروژه‌های شخصی، ارسال تمرین، دریافت بازخورد، مشاهده گواهی‌نامه شخصی، بدون دسترسی به پروژه سایرین.

مربی (Skill Instructor)

مشاهده پروژه‌های هنرجوهای تخصیصی، ثبت بازخورد، ارزیابی فنی، بدون دسترسی به داده پرداخت.

ارزیاب (Skill Assessor)

ارزیابی نهایی، امضای دیجیتال گواهی‌نامه، بدون دسترسی به داده هویتی.

مدیر آموزش (Training Manager)

مدیریت دوره‌ها، تخصیص مربی، نظارت بر کیفیت، بدون دسترسی به نمره نهایی.

کارفرما / سازمان (Employer)

دسترسی محدود به پروفایل عمومی هنرجو و تأیید گواهی‌نامه، بدون دسترسی به داده هویتی.

چالش‌های ارزیابی مهارت

۱. ارزیابی چندمرحله‌ای

ارزیابی مهارت باید چند مرحله‌ای باشد: ارزیابی خود، ارزیابی همتا، ارزیابی مربی، ارزیابی نهایی. هر مرحله نقش متفاوتی دارد و دسترسی متفاوتی می‌خواهد. برای مطالعه بیشتر، مطلب پیاده‌سازی درست Custom Post Type را ببینید.

۲. تأیید گواهی‌نامه با امضای دیجیتال

گواهی‌نامه باید با امضای دیجیتال (Digital Signature) صادر شود تا قابل تأیید باشد. وردپرس به‌صورت پیش‌فرض این قابلیت را ندارد.

۳. اعتبارسنجی مهارت با آزمون عملی

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

۴. پروفایل عمومی مهارت

هر هنرجو باید یک پروفایل عمومی داشته باشد که مهارت‌های تأییدشده‌اش را نشان دهد. این پروفایل باید با گواهی‌نامه قابل بررسی مرتبط باشد. برای مطالعه بیشتر، مطلب کار با User Meta در وردپرس را ببینید.

۵. حریم خصوصی داده هویتی

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

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

نقش دسترسی پروژه ارزیابی گواهی‌نامه
هنرجو پروژه شخصی ارزیابی خود دریافت
مربی تخصیصی ارزیابی فنی تأیید اولیه
ارزیاب تخصیصی ارزیابی نهایی امضای دیجیتال
مدیر آموزش نظارت نظارت مدیریت قالب
کارفرما خیر خیر تأیید

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

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

function wk_register_skill_project_cpt() {
    register_post_type('wk_skill_project', array(
        'label' => 'پروژه‌های مهارتی',
        'public' => false,
        'show_ui' => true,
        'capability_type' => 'wk_skill_project',
        'capabilities' => array(
            'read_post' => 'read_wk_skill_project',
            'edit_post' => 'edit_wk_skill_project',
            'edit_posts' => 'edit_wk_skill_projects',
            'edit_others_posts' => 'edit_others_wk_skill_projects',
        ),
        'map_meta_cap' => true,
        'supports' => array('title', 'editor', 'author', 'custom-fields'),
    ));
}
add_action('init', 'wk_register_skill_project_cpt');

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

function wk_register_skill_roles() {
    add_role('wk_skill_learner', 'هنرجوی مهارت', array(
        'read' => true,
        'edit_wk_skill_projects' => true,
        'publish_wk_skill_projects' => true,
        'submit_wk_self_assessment' => true,
        'upload_files' => true,
    ));

    add_role('wk_skill_instructor', 'مربی مهارت', array(
        'read' => true,
        'edit_wk_skill_projects' => true,
        'edit_others_wk_skill_projects' => true,
        'assess_wk_skill_projects' => true,
        'read_wk_skill_feedback' => true,
    ));

    add_role('wk_skill_assessor', 'ارزیاب مهارت', array(
        'read' => true,
        'final_assess_wk_projects' => true,
        'sign_wk_certificate' => true,
    ));
}
add_action('init', 'wk_register_skill_roles');

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

خط لوله پروژه عملی

مدیریت پروژه نیازمند یک لایه میانی است:

function wk_submit_skill_project($user_id, $project_id, $artifacts) {
    if (!current_user_can('edit_wk_skill_projects')) {
        return new WP_Error('forbidden', 'دسترسی غیرمجاز');
    }
    $post = get_post($project_id);
    if ((int) $post->post_author !== (int) $user_id) {
        return new WP_Error('not_owner', 'شما مالک این پروژه نیستید');
    }
    update_post_meta($project_id, 'wk_project_status', 'submitted');
    update_post_meta($project_id, 'wk_submitted_at', current_time('mysql'));
    update_post_meta($project_id, 'wk_artifacts', array_map('sanitize_text_field', $artifacts));
    return true;
}

نکته کلیدی: وضعیت پروژه باید به‌صورت صریح مدیریت شود تا از تغییرات ناخواسته جلوگیری شود.

صدور و تأیید گواهی‌نامه

گواهی‌نامه باید با امضای دیجیتال و شناسه یکتا صادر شود:

function wk_issue_certificate($project_id, $assessor_id) {
    if (!current_user_can('sign_wk_certificate')) {
        return new WP_Error('forbidden', 'دسترسی غیرمجاز');
    }
    $serial = wp_generate_uuid4();
    $payload = array(
        'serial' => $serial,
        'project_id' => $project_id,
        'assessor_id' => $assessor_id,
        'issued_at' => current_time('mysql'),
    );
    $signature = wk_sign_payload($payload, wk_get_assessor_private_key($assessor_id));
    update_post_meta($project_id, 'wk_certificate', array(
        'payload' => $payload,
        'signature' => $signature,
    ));
    return $serial;
}

برای مطالعه بیشتر درباره Options API، مطلب کار با Options API در وردپرس را ببینید. برای Nonce، مطلب نانس وردپرس و امنیت فرم را ببینید.

امنیت و اعتبارسنجی

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

  1. اعتبارسنجی نوع فایل آپلودی و محدودسازی حجم.
  2. ذخیره فایل‌ها در Object Storage با Token موقت.
  3. امضای دیجیتال گواهی‌نامه با کلید اختصاصی ارزیاب.

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

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

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

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

چگونه گواهی‌نامه را قابل تأیید کنم؟

با امضای دیجیتال (RSA یا ECDSA) و شناسه یکتا. کارفرما می‌تواند با شناسه، اعتبار گواهی‌نامه را بررسی کند.

آیا ارزیاب باید به داده هویتی هنرجو دسترسی داشته باشد؟

خیر. ارزیاب فقط باید به داده مهارتی و پروژه دسترسی داشته باشد. داده هویتی در یک لایه جدا نگهداری شود.

چگونه از جعل گواهی‌نامه جلوگیری کنم؟

با امضای دیجیتال و یک Endpoint عمومی برای تأیید. این Endpoint باید Rate Limited باشد.

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

اشتباه پیامد راه‌حل
نقش یکسان برای مربی و ارزیاب تضاد منافع نقش سفارشی مجزا
گواهی‌نامه بدون امضا جعل آسان امضای دیجیتال
نبود لاگ ارزیابی عدم امکان ممیزی ثبت هر ارزیابی با زمان و ارزیاب
دسترسی آزاد به داده هویتی نقض حریم خصوصی لایه جدا + Capability محدود
نبود Endpoint تأیید عدم امکان بررسی API عمومی با Rate Limit

تحلیل معماری پیشرفته

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

رویکرد پیشنهادی، معماری «Verifiable Credentials» است. هر گواهی‌نامه یک JSON-LD است که با کلید خصوصی ارزیاب امضا می‌شود. کارفرما می‌تواند با کلید عمومی، اعتبار را بررسی کند. این استاندارد توسط W3C توصیه شده و در حال تبدیل به استاندارد جهانی است.

نکته دوم، بحث «Revocation» است. اگر گواهی‌نامه‌ای به‌دلیل تقلب باطل شود، باید قابل لغو باشد. این نیازمند یک لیست لغو (Revocation List) است که در یک Endpoint عمومی در دسترس باشد.

نکته سوم، بحث «Skill Graph» است. مهارت‌ها در یک گراف به هم متصل هستند. اگر هنرجو مهارت A و B را کسب کند، ممکن است مستحق مهارت C باشد. این نیازمند یک موتور استنتاج سبک است که بر پایه گراف کار کند.

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