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

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

چرا سایت نمایشگاه با سایت فروشگاهی متفاوت است

یک سایت فروشگاهی معمولاً یک مالک دارد، چند نقش محدود و یک فرآیند خطی. اما یک سایت نمایشگاه، مجموعه‌ای از غرفه‌های مستقل است که هر یک می‌تواند مالک، محصولات، کارکنان و مشتریان خود را داشته باشد. این ساختار چندمستأجری (Multi-Tenant) باعث می‌شود مدل دسترسی پیش‌فرض وردپرس نه‌تنها کافی نباشد، بلکه در بسیاری از موارد خطرناک هم باشد.

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

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

نقش‌های کلیدی در یک سایت نمایشگاه

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

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

هر یک از این نقش‌ها باید به قابلیت‌های دقیقی متصل شود. برای مثال، نقش مالک غرفه باید قابلیت manage_booth_products را داشته باشد، اما قابلیت edit_booth_settings را نداشته باشد. نقش مسئول غرفه باید قابلیت view_booth_orders را داشته باشد، اما قابلیت withdraw_funds را نداشته باشد. این جداسازی، هسته تنظیمات غرفه‌ای را تشکیل می‌دهد.

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

تنظیمات غرفه‌ای و اتصال آن به نقش‌ها

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

یک الگوی عملی، استفاده از جدول واسط (Junction Table) است که رابطه بین کاربر، غرفه و نقش را نگه می‌دارد. این جدول امکان می‌دهد که یک کاربر در یک غرفه نقش مالک داشته باشد و در غرفه دیگر نقش کارمند. در وردپرس، این کار معمولاً با یک نوع نوشته سفارشی یا یک جدول اختصاصی انجام می‌شود. استفاده از جدول اختصاصی، کارایی بالاتری دارد، اما نیازمند کوئری‌های سفارشی است.

function wk_user_booth_role( $user_id, $booth_id ) {
    global $wpdb;
    $table = $wpdb->prefix . 'wk_booth_roles';
    $role = $wpdb->get_var( $wpdb->prepare(
        "SELECT role FROM {$table} WHERE user_id = %d AND booth_id = %d AND expires_at > NOW()",
        $user_id, $booth_id
    ) );
    return $role ? $role : false;
}

این تابع، نقش کاربر در یک غرفه خاص را برمی‌گرداند. نکته مهم این است که بررسی انقضا در همان کوئری انجام می‌شود تا از دسترسی پس از انقضا جلوگیری شود. همچنین باید اطمینان حاصل شود که جدول با ایندکس مناسب (user_id, booth_id) ساخته شده است تا کوئری سریع اجرا شود.

نکته دوم، اتصال این نقش غرفه‌ای به قابلیت‌های وردپرس است. باید از فیلتر user_has_cap استفاده کرد تا دسترسی‌های وردپرس بر اساس نقش غرفه‌ای تنظیم شوند. برای مثال:

add_filter( 'user_has_cap', function( $allcaps, $caps, $args, $user ) {
    if ( ! isset( $args[0] ) || strpos( $args[0], 'booth_' ) !== 0 ) {
        return $allcaps;
    }
    $booth_id = isset( $args[2] ) ? absint( $args[2] ) : 0;
    $role = wk_user_booth_role( $user->ID, $booth_id );
    if ( $role === 'owner' ) {
        $allcaps[ 'manage_booth_products' ] = true;
    }
    return $allcaps;
}, 10, 4 );

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

فرآیند ثبت‌نام و رزرو غرفه

فرآیند ثبت‌نام و رزرو غرفه، حساس‌ترین بخش یک نمایشگاه است. در این فرآیند، چند نقش درگیر هستند: متقاضی غرفه، مسئول رزرو، مسئول مالی و مدیر نمایشگاه. هر یک از این نقش‌ها باید دسترسی دقیقی به داده غرفه داشته باشند. برای مثال، متقاضی فقط باید درخواست خودش را ببیند، مسئول رزرو باید همه درخواست‌ها را ببیند اما نباید بتواند پرداخت را تأیید کند، و مسئول مالی باید داده پرداخت را ببیند اما نباید بتواند رزرو را تغییر دهد.

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

نکته مهم، مدیریت ظرفیت و موقعیت مکانی است. هر نمایشگاه دارای تعداد محدودی غرفه است که هر یک موقعیت مکانی مشخصی دارد. رزرو باید به‌صورت اتمیک (Atomic) انجام شود تا از رزرو دوگانه جلوگیری شود. این کار معمولاً با ترکیب یک تراکنش دیتابیس و یک قفل انجام می‌شود. همچنین باید از یک الگوریتم تخصیص استفاده شود که بر اساس اولویت و نوع غرفه، بهترین موقعیت را انتخاب کند. برای آشنایی با ساخت نوع نوشته سفارشی غرفه، ساخت نوع نوشته سفارشی در وردپرس راهنمای عملی خوبی است.

مدیریت بازدیدکنندگان و بلیت

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

مدیریت این فرآیند در وردپرس، معمولاً با ترکیب یک نوع نوشته سفارشی برای بازدیدکننده و یک سیستم عضویت انجام می‌شود. برای درک بهتر نحوه ساخت سیستم عضویت، ساخت سیستم عضویت در وردپرس منبع مفیدی است. نکته مهم این است که داده بازدیدکننده باید از داده کاربر وردپرس جدا باشد. یعنی یک کاربر می‌تواند در چند نمایشگاه شرکت کند و برای هر نمایشگاه یک رکورد ثبت‌نام جداگانه داشته باشد.

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

مدیریت محصولات و خدمات غرفه

هر غرفه در نمایشگاه می‌تواند محصولات یا خدمات خود را ارائه کند. مدیریت این محصولات باید به نقش‌های مشخصی متصل باشد. مالک غرفه باید بتواند محصولات را اضافه و ویرایش کند، اما نباید بتواند قیمت‌ها را بدون تأیید تغییر دهد. مسئول غرفه باید بتواند موجودی را به‌روزرسانی کند، اما نباید بتواند محصول جدید اضافه کند. این جداسازی، از سوءاستفاده جلوگیری می‌کند.

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

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

پرداخت و مدیریت مالی نمایشگاه

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

پیاده‌سازی این لایه در وردپرس، معمولاً با ترکیب یک درگاه پرداخت و یک سیستم ثبت تراکنش انجام می‌شود. نکته مهم این است که داده مالی باید رمزنگاری شود و دسترسی به آن محدود باشد. همچنین باید لاگ حسابرسی برای هر تراکنش ثبت شود. برای آشنایی با نحوه پشتیبان‌گیری از داده مالی، راه‌اندازی پشتیبان‌گیری خودکار در وردپرس توصیه می‌شود.

نکته دیگر، مدیریت تسویه با غرفه‌داران است. در نمایشگاه، هر غرفه‌دار باید سهم خود را از فروش دریافت کند. این فرآیند باید دارای یک گردش کار مشخص باشد و هر مرحله آن ثبت شود. مسئول تسویه باید نقش مشخصی داشته باشد و نباید هم‌زمان بتواند رزرو را ویرایش کند. این جداسازی، از سوءاستفاده جلوگیری می‌کند.

پرسش‌های پرتکرار درباره نقش‌ها و تنظیمات نمایشگاه

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

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

آیا استفاده از افزونه‌های مدیریت نمایشگاه کافی است؟
افزونه‌ها می‌توانند بخشی از کار را ساده کنند، اما به‌تنهایی کافی نیستند. باید سیاست‌های دسترسی در سطح کد نیز پیاده‌سازی شوند، به‌ویژه در بخش رزرو و تسویه.

چگونه دسترسی غرفه‌داران را پس از پایان نمایشگاه لغو کنیم؟
با تعریف تاریخ انقضا برای نقش غرفه‌ای و استفاده از یک کرون برای لغو خودکار. همچنین می‌توان از یک لایه بررسی در هر درخواست استفاده کرد.

چه سطحی از دسترسی برای داور غرفه مناسب است؟
داور غرفه باید به داده ارزیابی دسترسی داشته باشد، اما نباید بتواند داده را تغییر دهد یا به داده مالی دسترسی داشته باشد.

تحلیل فنی در سطح معماری: مدل دسترسی غرفه‌محور

مدل دسترسی در سایت نمایشگاه، یک مدل غرفه‌محور (Booth-Driven) است. در این مدل، دسترسی نه‌تنها به نقش کاربر، بلکه به غرفه جاری و وضعیت آن وابسته است. این مدل، ترکیبی از RBAC و ABAC است و نیازمند یک لایه ارزیابی سیاست است که در هر درخواست، ترکیب نقش، غرفه و وضعیت را بررسی کند.

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

یک الگوی عملی، استفاده از یک لایه سرویس (Service Layer) است که مسئولیت ارزیابی دسترسی را بر عهده دارد. این لایه، به‌جای اینکه در هر نقطه از کد بررسی دسترسی انجام شود، به‌صورت متمرکز عمل می‌کند. مزیت این رویکرد، یکدستی و قابلیت تست‌پذیری بالاست. عیب آن، افزایش پیچیدگی اولیه است. برای آشنایی با نحوه پیاده‌سازی لایه‌های امنیتی پیشرفته، انتخاب افزونه مدیریت کاربران وردپرس می‌تواند نقطه شروع خوبی باشد.

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

مسیر پیشنهادی پیاده‌سازی

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

  1. تحلیل نقش‌ها و وظایف: فهرست کاملی از نقش‌ها و وظایف هر نقش تهیه کنید. این فهرست باید بر اساس فرآیند واقعی نمایشگاه باشد.
  2. تعریف قابلیت‌های سفارشی: هر وظیفه را به یک قابلیت مشخص نگاشت کنید.
  3. ساخت CPT و تاکسونومی: نوع نوشته سفارشی برای غرفه، محصول و بازدیدکننده تعریف کنید.
  4. پیاده‌سازی جدول واسط: جدول رابطه کاربر، غرفه و نقش را بسازید.
  5. پیاده‌سازی لایه دسترسی: فیلترهای user_has_cap و map_meta_cap را برای اعمال سیاست‌های غرفه‌محور پیاده‌سازی کنید.
  6. ساخت لایه حسابرسی: جدول لاگ اختصاصی بسازید و هر عمل حساس را ثبت کنید.
  7. پیاده‌سازی زمان‌بندی: کرون سرور برای لغو خودکار دسترسی‌ها و بررسی انقضا راه‌اندازی کنید.
  8. تست امنیتی: سناریوهای مختلف نقض دسترسی را تست کنید.

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

پیش از خروج از این صفحه

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

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

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