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

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

چرا سفارشی‌سازی پیشخوان برای مشتری حیاتی است؟

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

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

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

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

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

گام اول: ممیزی پیشخوان و شناسایی نویز

پیش از هر تغییری، باید پیشخوان را ممیزی کرد. این ممیزی به سه پرسش پاسخ می‌دهد: چه چیزهایی در پیشخوان هست؟ چه چیزهایی مزاحم است؟ مشتری واقعاً به چه چیزی نیاز دارد؟

فهرست‌برداری از منوها و زیرمنوها

اولین گام، فهرست کردن همه منوها و زیرمنوهای پیشخوان است. برای این کار، از WP-CLI یا کد PHP استفاده کنید:

// افزودن به functions.php به‌صورت موقت
add_action('admin_init', function() {
    global $menu, $submenu;
    error_log('Main menus: ' . print_r($menu, true));
    error_log('Submenus: ' . print_r($submenu, true));
});

خروجی این کد در wp-content/debug.log ثبت می‌شود و فهرست کامل منوها را نشان می‌دهد. برای هر منو، این اطلاعات را ثبت کنید:

  • نام منو
  • Slug منو
  • سطح دسترسی (Capability)
  • آیا توسط هسته، افزونه یا قالب ثبت شده است؟
  • آیا مشتری به آن نیاز دارد؟

شناسایی عناصر مزاحم

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

عنصرچرا مزاحم استتوصیه
منوی Commentsبرای سایت‌های بدون دیدگاه بی‌فایدهحذف
منوی Toolsمشتری از این منو استفاده نمی‌کندحذف یا محدودسازی
منوی Pluginsخطر حذف یا بروزرسانی ناخواستهمخفی‌سازی
منوی Appearance > Editorخطر ویرایش کد و شکستن سایتغیرفعال‌سازی
اعلان بروزرسانی هستهمشتری نمی‌داند چه کندمخفی‌سازی
پنل Welcomeبرای مشتری آشنا بی‌ربط استحذف یا سفارشی‌سازی
ویجت‌های QuickPressمشتری معمولاً از ویرایشگر کامل استفاده می‌کندحذف
ویجت Site Healthپیام‌های هشدار بدون راهکارمخفی‌سازی
Widget WordPress Eventsرویدادهای وردپرس جهانیحذف
منوی WooCommerce Reportsگزارش‌های پیچیده برای مشتری سادهساده‌سازی

نقشه‌برداری از جریان کاری مشتری

پس از شناسایی عناصر مزاحم، باید جریان کاری مشتری را نقشه‌برداری کنید. این پرسش‌ها را بپرسید:

  1. مشتری روزانه چه کارهایی انجام می‌دهد؟
  2. این کارها در کدام منوها انجام می‌شوند؟
  3. آیا ترتیب فعلی منوها با اولویت کارهای مشتری هماهنگ است؟
  4. آیا مشتری به تنظیمات پیشرفته نیاز دارد؟
  5. چه کسی محتوا را تولید می‌کند؟ خود مشتری یا تیم او؟
  6. آیا مشتری چند نقش کاربری دارد (نویسنده، ویرایشگر، مدیر)؟

برای مثال، در یک فروشگاه ووکامرس، جریان کاری مشتری معمولاً به این ترتیب است:

  1. بررسی سفارش‌های جدید
  2. افزودن محصول
  3. مدیریت موجودی
  4. بررسی گزارش فروش
  5. پاسخ به دیدگاه‌ها

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

سفارشی‌سازی منوها و ساختار پیشخوان

پس از ممیزی، باید منوها و ساختار پیشخوان را سفارشی کرد. این کار شامل حذف، بازچینش، تغییر نام و ساخت داشبورد سفارشی است.

حذف منوهای غیرضروری

حذف منوها با تابع remove_menu_page() و برای زیرمنوها با remove_submenu_page() انجام می‌شود:

add_action('admin_menu', function() {
    // حذف منوی Comments
    remove_menu_page('edit-comments.php');
    
    // حذف منوی Tools
    remove_menu_page('tools.php');
    
    // حذف منوی Plugins
    if (!current_user_can('manage_options')) {
        remove_menu_page('plugins.php');
    }
    
    // حذف زیرمنوهایی خاص
    remove_submenu_page('options-general.php', 'options-writing.php');
    remove_submenu_page('options-general.php', 'options-discussion.php');
    
    // حذف زیرمنوی ویرایشگر قالب
    remove_submenu_page('themes.php', 'theme-editor.php');
    remove_submenu_page('plugins.php', 'plugin-editor.php');
});

نکات مهم:

  • حذف منو در سطح کد، دسترسی مستقیم از URL را نیز می‌بندد (در صورتی که با manage_options یا مشابه هماهنگ شود).
  • منوهای هسته وردپرس را می‌توان حذف کرد، اما باید مطمئن شوید که قابلیت‌های وابسته از کار نمی‌افتند.
  • برای مشتری مبتدی، مخفی کردن منوی Plugins کافی نیست. باید دسترسی به افزونه‌ها را نیز محدود کرد.

برای محدودسازی مستقیم دسترسی از URL، از تابع زیر استفاده کنید:

add_action('admin_init', function() {
    $user = wp_get_current_user();
    if (!in_array('administrator', $user->roles, true)) {
        if (isset($_GET['page']) && $_GET['page'] === 'some-restricted-page') {
            wp_die('دسترسی غیرمجاز');
        }
    }
});

بازچینش منوها بر اساس اولویت

ترتیب پیش‌فرض منوها با اولویت مشتری هماهنگ نیست. با تغییر پارامتر $position در global $menu، می‌توان ترتیب را تغییر داد:

add_filter('custom_menu_order', '__return_true');
add_filter('menu_order', function($menu_order) {
    if (!$menu_order) {
        return true;
    }
    
    // ترتیب سفارشی برای مشتری فروشگاه
    return array(
        'index.php',           // Dashboard
        'edit.php?post_type=product',  // Products
        'woocommerce',          // WooCommerce (Orders)
        'edit.php',             // Posts
        'upload.php',           // Media
        'edit.php?post_type=page',     // Pages
        'users.php',            // Users
        'options-general.php',  // Settings
    );
});

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

تغییر نام منوها به زبان مشتری

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

add_action('admin_menu', function() {
    global $menu, $submenu;
    
    // تغییر نام منوی Posts
    foreach ($menu as $key => $item) {
        if ($item[2] === 'edit.php') {
            $menu[$key][0] = 'مقالات سایت';
        }
        if ($item[2] === 'upload.php') {
            $menu[$key][0] = 'تصاویر و رسانه';
        }
        if ($item[2] === 'edit-comments.php') {
            $menu[$key][0] = 'نظرات کاربران';
        }
    }
    
    // تغییر نام زیرمنوها
    if (isset($submenu['themes.php'])) {
        foreach ($submenu['themes.php'] as $key => $item) {
            if ($item[2] === 'themes.php') {
                $submenu['themes.php'][$key][0] = 'ظاهر سایت';
            }
        }
    }
});

توصیه: تغییر نام باید با دقت انجام شود تا با مستندات، آموزش‌ها و پشتیبانی هماهنگ باشد. اگر مشتری با نام «محصولات» آشناست، تغییر آن به «اجناس» می‌تواند سردرگمی ایجاد کند.

ساخت داشبورد سفارشی

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

add_action('wp_dashboard_setup', function() {
    global $wp_meta_boxes;
    
    // حذف ویجت‌های پیش‌فرض
    remove_meta_box('dashboard_activity', 'dashboard', 'normal');
    remove_meta_box('dashboard_right_now', 'dashboard', 'normal');
    remove_meta_box('dashboard_quick_press', 'dashboard', 'side');
    remove_meta_box('dashboard_primary', 'dashboard', 'side');
    remove_meta_box('dashboard_secondary', 'dashboard', 'side');
    remove_meta_box('dashboard_site_health', 'dashboard', 'normal');
    
    // افزودن ویجت سفارشی
    wp_add_dashboard_widget(
        'custom_welcome_widget',
        'به داشبورد سایت خوش آمدید',
        function() {
            echo '

برای مدیریت محصولات، از منوی «محصولات» استفاده کنید.

'; echo '

برای مشاهده سفارش‌های جدید، به «سفارش‌ها» بروید.

'; echo '

در صورت بروز مشکل، با شماره پشتیبانی تماس بگیرید: ۰۲۱-۱۲۳۴۵۶۷۸

'; } ); });

ویجت سفارشی می‌تواند شامل چند بخش باشد:

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

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

داشبورد باید به مشتری بگوید «امروز چه کاری باید انجام دهم؟»، نه اینکه او را با ده‌ها ویجت نامربوط رها کند.

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

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

سفارشی‌سازی صفحه ورود

صفحه ورود اولین چیزی است که مشتری می‌بیند. سفارشی‌سازی آن، تجربه حرفه‌ای‌تری ایجاد می‌کند:

add_action('login_enqueue_scripts', function() {
    ?>
    <style type="text/css">
        #login h1 a, .login h1 a {
            background-image: url(<?php echo get_stylesheet_directory_uri(); ?>/images/logo.png);
            background-size: contain;
            background-repeat: no-repeat;
            background-position: center;
            width: 100%;
            height: 80px;
        }
        .login form {
            background: #f9f9f9;
            border-radius: 8px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.1);
        }
        .wp-core-ui .button-primary {
            background-color: #2c3e50;
            border-color: #2c3e50;
        }
    </style>
    <?php
});

add_filter('login_headerurl', function() {
    return home_url();
});

add_filter('login_headertext', function() {
    return 'خوش آمدید به پنل مدیریت';
});

add_filter('login_title', function($title) {
    return 'ورود به پنل مدیریت سایت';
});

نکات مهم در سفارشی‌سازی صفحه ورود:

  • استفاده از لوگوی مشتری به‌جای لوگوی وردپرس.
  • رنگ‌بندی متناسب با هویت بصری برند.
  • متن‌های راهنما به زبان مشتری.
  • حذف لینک‌های اضافی (مانند «بازگشت به سایت» یا «فراموشی رمز»).
  • اختیاری: پیام‌های خطا با زبان محلی‌سازی شده.

رنگ‌بندی و لوگوی پیشخوان

وردپرس چند طرح رنگ پیش‌فرض دارد. می‌توان طرح‌های سفارشی اضافه کرد:

add_action('admin_head', function() {
    ?>
    <style>
        #adminmenu, #adminmenuback, #adminmenuwrap {
            background-color: #2c3e50;
        }
        #adminmenu .wp-has-current-submenu .wp-submenu,
        #adminmenu .wp-has-current-submenu.opensub .wp-submenu,
        #adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
            background-color: #1a252f;
        }
        #adminmenu li.current a.menu-top,
        #adminmenu li.wp-has-current-submenu a.wp-has-current-submenu {
            background-color: #3498db;
            color: #fff;
        }
        #wpadminbar {
            background-color: #2c3e50;
        }
    </style>
    <?php
});

// ثبت طرح رنگ سفارشی
add_action('admin_init', function() {
    wp_admin_css_color(
        'my-brand',
        'برند من',
        get_stylesheet_directory_uri() . '/css/admin-brand.css',
        array('#2c3e50', '#3498db', '#1a252f', '#ecf0f1')
    );
});

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

فوتر پیشخوان معمولاً شامل پیام «با تشکر از شما که با وردپرس می‌سازید» است. تغییر این پیام به اطلاعات مفید برای مشتری:

add_filter('admin_footer_text', function() {
    return 'این سایت توسط تیم فنی شما توسعه یافته است. پشتیبانی: ۰۲۱-۱۲۳۴۵۶۷۸';
});

add_filter('update_footer', function() {
    return 'نسخه فنی: ۱.۲.۳';
}, 11);

این تغییرات کوچک، حس حرفه‌ای بودن و پشتیبانی فعال را به مشتری منتقل می‌کند.

مدیریت نقش‌ها و سطح دسترسی

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

نقش‌های پیش‌فرض و محدودیت‌های آن‌ها

وردپرس شش نقش پیش‌فرض دارد:

نقشدسترسی اصلیمناسب برای
Administratorهمه چیزتیم فنی، نه مشتری
Editorمدیریت همه محتوامدیر محتوای مشتری
Authorمدیریت محتوای خودنویسندگان
Contributorنوشتن بدون انتشارنویسندگان تازه‌کار
Subscriberفقط مشاهدهکاربران عادی

هیچ‌کدام از این نقش‌ها برای مشتری صاحب سایت کاملاً مناسب نیست. Administrator دسترسی بیش از حد دارد، Editor به تنظیمات دسترسی ندارد. راه‌حل: ساخت نقش سفارشی.

ساخت نقش سفارشی برای مشتری

ساخت نقش سفارشی به مشتری امکان می‌دهد دقیقاً به آنچه نیاز دارد دسترسی داشته باشد:

add_action('init', function() {
    // نقش سفارشی برای صاحب فروشگاه
    add_role('shop_manager_custom', 'مدیر فروشگاه', array(
        'read' => true,
        'edit_posts' => true,
        'edit_published_posts' => true,
        'publish_posts' => true,
        'delete_posts' => false,
        'delete_published_posts' => false,
        'upload_files' => true,
        'manage_woocommerce' => true,
        'view_woocommerce_reports' => true,
        'edit_products' => true,
        'publish_products' => true,
        'edit_others_products' => true,
        'read_private_products' => true,
        'delete_products' => false,
        'manage_product_terms' => true,
        'edit_product_terms' => true,
        'assign_product_terms' => true,
    ));
});

// حذف نقش در زمان غیرفعال‌سازی (در افزونه)
register_deactivation_hook(__FILE__, function() {
    remove_role('shop_manager_custom');
});

برای مشتریان مختلف، نقش‌های متفاوتی تعریف کنید:

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

کنترل دقیق سطح دسترسی (Capabilities)

برای کنترل دقیق‌تر، می‌توان از map_meta_cap و user_has_cap استفاده کرد:

add_filter('map_meta_cap', function($caps, $cap, $user_id, $args) {
    // محدودسازی ویرایش برگه‌های خاص
    if ($cap === 'edit_post' && isset($args[0])) {
        $post_id = $args[0];
        $protected_pages = array(123, 456); // صفحات حیاتی
        
        if (in_array($post_id, $protected_pages, true)) {
            $caps[] = 'do_not_allow';
        }
    }
    return $caps;
}, 10, 4);

// محدودسازی منوی Settings برای مشتری
add_action('admin_init', function() {
    if (current_user_can('shop_manager_custom')) {
        remove_menu_page('options-general.php');
        remove_menu_page('tools.php');
        remove_menu_page('plugins.php');
    }
});

این رویکرد به‌ویژه برای محافظت از تنظیمات حیاتی (مانند URL سایت، پیکربندی ایمیل یا تنظیمات فروشگاه) مفید است.

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

ساده‌سازی ویرایشگر و تجربه محتوا

ویرایشگر محتوا، جایی است که مشتری بیشترین زمان را می‌گذراند. ساده‌سازی آن، تجربه کاری مشتری را به‌طور مستقیم بهبود می‌دهد.

سفارشی‌سازی نوار ابزار ویرایشگر

نوار ابزار ویرایشگر کلاسیک (TinyMCE) پر از دکمه‌هایی است که مشتری از آن‌ها استفاده نمی‌کند. با فیلتر mce_buttons می‌توان دکمه‌های غیرضروری را حذف کرد:

add_filter('mce_buttons', function($buttons) {
    return array(
        'formatselect',
        'bold',
        'italic',
        'bullist',
        'numlist',
        'link',
        'unlink',
        'undo',
        'redo',
    );
});

add_filter('mce_buttons_2', function($buttons) {
    // حذف ردیف دوم کامل
    return array();
});

برای ویرایشگر بلوکی (Gutenberg)، محدودسازی متفاوت است:

add_filter('allowed_block_types_all', function($allowed_blocks, $editor_context) {
    if ($editor_context->post && $editor_context->post->post_type === 'post') {
        return array(
            'core/paragraph',
            'core/heading',
            'core/image',
            'core/list',
            'core/quote',
            'core/embed',
        );
    }
    return $allowed_blocks;
}, 10, 2);

محدودسازی بلوک‌های Gutenberg

Gutenberg ده‌ها بلوک پیش‌فرض دارد که برای مشتری غیرفنی گیج‌کننده است. محدودسازی بلوک‌ها به بلوک‌های ضروری، تجربه ویرایش را ساده‌تر می‌کند. برای مطالعه بیشتر درباره Gutenberg، مقاله ویرایشگر Classic یا Gutenberg؛ کدام برای WordPress بهتر است؟ را ببینید.

add_filter('allowed_block_types_all', function($allowed_blocks, $editor_context) {
    // فقط برای نویسندگان غیر ادمین
    if (!current_user_can('manage_options')) {
        return array(
            'core/paragraph',
            'core/heading',
            'core/image',
            'core/list',
            'core/quote',
            'core/embed',
            'core/separator',
            'core/spacer',
        );
    }
    return $allowed_blocks;
}, 10, 2);

همچنین می‌توان بلوک‌های افزونه‌ها را نیز محدود کرد:

add_action('enqueue_block_editor_assets', function() {
    if (!current_user_can('manage_options')) {
        wp_enqueue_script(
            'unregister-blocks',
            get_stylesheet_directory_uri() . '/js/unregister-blocks.js',
            array('wp-blocks', 'wp-dom-ready'),
            '1.0.0',
            true
        );
    }
});

و در فایل unregister-blocks.js:

wp.domReady(function() {
    wp.blocks.unregisterBlockType('core/cover');
    wp.blocks.unregisterBlockType('core/columns');
    wp.blocks.unregisterBlockType('core/media-text');
});

استفاده از ACF برای فیلدهای سفارشی

یکی از موثرترین راه‌ها برای ساده‌سازی تجربه مشتری، استفاده از Advanced Custom Fields (ACF) است. با ACF می‌توان فیلدهای مشخصی تعریف کرد که مشتری فقط همان‌ها را پر کند، بدون نگرانی از ساختار محتوا. برای مطالعه بیشتر، مقاله مدیریت محتوای پیچیده با ACF را ببینید.

if (function_exists('acf_add_local_field_group')) {
    acf_add_local_field_group(array(
        'key' => 'group_product_info',
        'title' => 'اطلاعات محصول',
        'fields' => array(
            array(
                'key' => 'field_price',
                'label' => 'قیمت (تومان)',
                'name' => 'price',
                'type' => 'number',
                'required' => 1,
            ),
            array(
                'key' => 'field_brand',
                'label' => 'برند',
                'name' => 'brand',
                'type' => 'text',
            ),
            array(
                'key' => 'field_warranty',
                'label' => 'گارانتی',
                'name' => 'warranty',
                'type' => 'select',
                'choices' => array(
                    '6_months' => '۶ ماه',
                    '12_months' => '۱۲ ماه',
                    '24_months' => '۲۴ ماه',
                ),
            ),
        ),
        'location' => array(
            array(
                array(
                    'param' => 'post_type',
                    'operator' => '==',
                    'value' => 'product',
                ),
            ),
        ),
    ));
}

با ACF، می‌توان نمایش فیلدها را در ویرایشگر ساده‌سازی کرد و از مشتری خواست فقط داده‌های مشخصی را وارد کند. این رویکرد، به‌ویژه برای محصولات، املاک، رستوران‌ها و مشاغل مشابه مفید است.

حذف متاباکس‌های غیرضروری

متاباکس‌ها (Meta Boxes) جعبه‌هایی هستند که در صفحه ویرایش نوشته نمایش داده می‌شوند. بسیاری از آن‌ها برای مشتری غیرفنی بی‌معنا هستند:

add_action('add_meta_boxes', function() {
    // حذف متاباکس‌های غیرضروری
    remove_meta_box('authordiv', 'post', 'normal');
    remove_meta_box('trackbacksdiv', 'post', 'normal');
    remove_meta_box('commentstatusdiv', 'post', 'normal');
    remove_meta_box('commentsdiv', 'post', 'normal');
    remove_meta_box('slugdiv', 'post', 'normal');
    remove_meta_box('postcustom', 'post', 'normal');
    
    // حذف متاباکس‌های Yoast برای نویسندگان
    if (!current_user_can('manage_options')) {
        remove_meta_box('wpseo_meta', 'post', 'normal');
    }
}, 100);

حذف متاباکس‌ها، صفحه ویرایش را خلوت‌تر و مشتری‌پسندتر می‌کند.

پاک‌سازی اعلان‌ها و پیام‌های مزاحم

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

اعلان‌های هسته و بروزرسانی

اعلان‌های هسته وردپرس (مانند «بروزرسانی جدید موجود است») برای مشتری غیرفنی گیج‌کننده هستند. می‌توان آن‌ها را حذف کرد:

add_action('admin_init', function() {
    if (!current_user_can('manage_options')) {
        remove_action('admin_notices', 'update_nag', 3);
        remove_action('admin_notices', 'maintenance_nag');
    }
});

// حذف اعلان بروزرسانی از منوی بالای صفحه
add_action('admin_bar_menu', function($wp_admin_bar) {
    if (!current_user_can('manage_options')) {
        $wp_admin_bar->remove_node('updates');
        $wp_admin_bar->remove_node('comments');
        $wp_admin_bar->remove_node('new-content');
    }
}, 999);

اعلان‌های افزونه‌ها و قالب‌ها

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

// حذف اعلان‌های تبلیغاتی افزونه‌ها
add_action('admin_init', function() {
    if (!current_user_can('manage_options')) {
        // حذف همه اعلان‌های admin_notices به‌جز موارد ضروری
        remove_all_actions('admin_notices');
        
        // بازگرداندن اعلان‌های ضروری
        add_action('admin_notices', 'my_custom_notices');
    }
});

// حذف اعلان‌های خاص افزونه‌ها با فیلتر
add_action('admin_init', function() {
    if (class_exists('SomePlugin')) {
        remove_action('admin_notices', array('SomePlugin', 'show_notice'));
    }
});

توجه: حذف همه اعلان‌ها با remove_all_actions ممکن است اعلان‌های ضروری (مانند هشدارهای امنیتی) را نیز حذف کند. باید با احتیاط انجام شود.

پنل خوش‌آمدگویی

پنل Welcome پیش‌فرض وردپرس، اطلاعاتی درباره ویژگی‌های وردپرس نمایش می‌دهد که برای مشتری بی‌فایده است:

add_action('welcome_panel', function() {
    remove_action('welcome_panel', 'wp_welcome_panel');
});

// یا بازنویسی پنل Welcome با محتوای سفارشی
add_action('welcome_panel', function() {
    if (!current_user_can('edit_dashboard')) {
        return;
    }
    ?>
    <div class="welcome-panel-content">
        <h2>به پنل مدیریت سایت خوش آمدید</h2>
        <p>برای شروع، از منوی «محصولات» استفاده کنید.</p>
        <p>در صورت نیاز به راهنما، با پشتیبانی تماس بگیرید.</p>
    </div>
    <?php
});

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

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

ویجت‌های راهنما در داشبورد

افزودن ویجت‌های راهنما در داشبورد، مشتری را در مسیر درست هدایت می‌کند:

add_action('wp_dashboard_setup', function() {
    wp_add_dashboard_widget(
        'quick_guide_widget',
        'راهنمای سریع',
        function() {
            ?>
            <ul>
                <li><strong>افزودن محصول جدید:</strong> منوی محصولات → افزودن جدید</li>
                <li><strong>بررسی سفارش‌ها:</strong> منوی سفارش‌ها → همه سفارش‌ها</li>
                <li><strong>ویرایش صفحه اصلی:</strong> برگه‌ها → صفحه اصلی</li>
                <li><strong>تغییر لوگو:</strong> ظاهر سایت → سفارشی‌سازی → لوگو</li>
            </ul>
            <?php
        }
    );
});

تب Help و راهنمای متنی

وردپرس یک تب Help در بالای صفحه‌های پیشخوان دارد. می‌توان محتوای این تب را سفارشی کرد:

add_action('current_screen', function($screen) {
    if ($screen->id === 'edit-product') {
        $screen->add_help_tab(array(
            'id' => 'product_help',
            'title' => 'راهنمای محصولات',
            'content' => '<p>در این صفحه می‌توانید محصولات فروشگاه را مدیریت کنید. برای افزودن محصول جدید، روی دکمه «افزودن جدید» کلیک کنید.</p>',
        ));
        
        $screen->set_help_sidebar(
            '<p><strong>پشتیبانی:</strong></p>' .
            '<p>تلفن: ۰۲۱-۱۲۳۴۵۶۷۸</p>' .
            '<p>ایمیل: support@example.com</p>'
        );
    }
});

نقطه‌نماها (Admin Pointers)

نقطه‌نماها جعبه‌های راهنمای کوچکی هستند که در کنار عناصر پیشخوان ظاهر می‌شوند:

add_action('admin_enqueue_scripts', function($hook) {
    if ($hook !== 'edit.php?post_type=product') {
        return;
    }
    
    wp_enqueue_style('wp-pointer');
    wp_enqueue_script('wp-pointer');
    
    add_action('admin_print_footer_scripts', function() {
        ?>
        <script>
        jQuery(document).ready(function($) {
            $('#menu-posts-product').pointer({
                content: '<h3>محصولات</h3><p>اینجا محصولات فروشگاه را مدیریت کنید.</p>',
                position: { edge: 'left', align: 'middle' },
                close: function() {
                    $.post(ajaxurl, { action: 'dismiss_product_pointer' });
                }
            }).pointer('open');
        });
        </script>
        <?php
    });
});

ویدیوها و مستندات

افزودن لینک به ویدیوهای آموزشی یا مستندات، به مشتری کمک می‌کند مستقل عمل کند:

add_action('wp_dashboard_setup', function() {
    wp_add_dashboard_widget(
        'tutorial_videos_widget',
        'ویدیوهای آموزشی',
        function() {
            ?>
            <ul>
                <li><a href="https://example.com/videos/add-product" target="_blank">افزودن محصول جدید</a></li>
                <li><a href="https://example.com/videos/manage-orders" target="_blank">مدیریت سفارش‌ها</a></li>
                <li><a href="https://example.com/videos/edit-pages" target="_blank">ویرایش برگه‌ها</a></li>
            </ul>
            <?php
        }
    );
});

بهینه‌سازی عملکرد پیشخوان

پیشخوان سنگین، تجربه مشتری را به‌طور مستقیم تحت تأثیر قرار می‌دهد. چند نکته برای بهینه‌سازی:

  • حذف ویجت‌های سنگین: ویجت‌هایی که کوئری‌های پیچیده اجرا می‌کنند، بار پیشخوان را افزایش می‌دهند.
  • محدودسازی افزونه‌های پیشخوان: افزونه‌هایی که فقط برای تیم فنی هستند، در بارگذاری پیشخوان تأثیر می‌گذارند.
  • کش object: استفاده از Redis یا Memcached برای کش داده‌های پیشخوان.
  • بارگذاری تنبل: بارگذاری بخش‌های پیشخوان فقط زمانی که کاربر به آن‌ها مراجعه می‌کند.
  • حداقل بارگذاری اسکریپت‌ها: فقط در صفحه‌های مرتبط، اسکریپت‌های موردنیاز بارگذاری شوند.
// بارگذاری اسکریپت فقط در صفحه‌های خاص
add_action('admin_enqueue_scripts', function($hook) {
    if ($hook !== 'index.php') {
        return;
    }
    wp_enqueue_script('my-dashboard-script', /* ... */);
});

نکات امنیتی در سفارشی‌سازی پیشخوان

سفارشی‌سازی پیشخوان باید با رعایت اصول امنیتی انجام شود:

  • عدم افشای اطلاعات: در متن راهنما، اطلاعات حساس مانند نام کاربری یا مسیر سرور را ننویسید.
  • Sanitization: هر ورودی مشتری را پاک‌سازی کنید.
  • Nonce: در فرم‌ها و درخواست‌های AJAX از nonce استفاده کنید. برای مطالعه بیشتر، مقاله چگونه نانس را در فرم‌های سفارشی وردپرس درست پیاده‌سازی کنیم؟ را ببینید.
  • Capability Check: پیش از هر عملیات، سطح دسترسی کاربر را بررسی کنید.
  • عدم افشای لینک‌های مدیریتی: لینک‌های مستقیم به صفحه‌های حساس را در راهنما قرار ندهید.
// نمونه صحیح: بررسی capability پیش از هر عملیات
add_action('admin_post_my_action', function() {
    if (!current_user_can('manage_options')) {
        wp_die('دسترسی غیرمجاز');
    }
    check_admin_referer('my_action_nonce');
    // پردازش
});

چک‌لیست تحویل پیشخوان به مشتری

پیش از تحویل پروژه، چک‌لیست زیر را مرور کنید:

  • [ ] منوهای غیرضروری حذف شده‌اند.
  • [ ] منوها بر اساس جریان کاری مشتری بازچینش شده‌اند.
  • [ ] نام منوها به زبان مشتری تغییر یافته است.
  • [ ] لوگو و رنگ‌بندی پیشخوان با هویت برند مشتری هماهنگ است.
  • [ ] صفحه ورود سفارشی‌سازی شده است.
  • [ ] نقش سفارشی برای مشتری تعریف شده است.
  • [ ] دسترسی‌های حساس محدود شده‌اند.
  • [ ] ویرایشگر محتوا ساده‌سازی شده است.
  • [ ] بلوک‌های غیرضروری Gutenberg حذف شده‌اند.
  • [ ] متاباکس‌های غیرضروری حذف شده‌اند.
  • [ ] اعلان‌های مزاحم حذف شده‌اند.
  • [ ] ویجت‌های راهنما در داشبورد افزوده شده‌اند.
  • [ ] تب Help سفارشی‌سازی شده است.
  • [ ] ویدیوها یا مستندات آموزشی ارائه شده است.
  • [ ] عملکرد پیشخوان بهینه شده است.
  • [ ] نکات امنیتی رعایت شده‌اند.
  • [ ] کد سفارشی در Child Theme یا MU-Plugin قرار داده شده است.
  • [ ] نسخه پشتیبان از فایل‌ها و دیتابیس تهیه شده است.
  • [ ] جلسه آموزشی برای مشتری برگزار شده است.
  • [ ] راه‌های ارتباطی پشتیبانی به مشتری ارائه شده است.

پرسش‌های پرتکرار درباره سفارشی‌سازی پیشخوان

در این بخش، به پرسش‌های متداول پاسخ داده می‌شود. این ساختار برای بهینه‌سازی محتوا برای موتورهای پاسخگو (Answer Engines) نیز مفید است.

چرا باید پیشخوان وردپرس را برای مشتری سفارشی کنم؟

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

چه چیزهایی در پیشخوان باید حذف شوند؟

منوهای غیرضروری (Comments، Tools، Plugins)، اعلان‌های تبلیغاتی، ویجت‌های نامربوط در داشبورد، متاباکس‌های غیرضروری در ویرایشگر و اعلان‌های بروزرسانی برای مشتری غیرفنی.

آیا حذف منوهای هسته وردپرس امن است؟

بله، در صورتی که با remove_menu_page و محدودسازی دسترسی URL انجام شود. اما باید مطمئن شوید که قابلیت‌های وابسته از کار نمی‌افتند.

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

با تابع add_role() در هوک init. سپس با map_meta_cap و user_has_cap، دسترسی‌های دقیق‌تر را کنترل کنید.

آیا سفارشی‌سازی پیشخوان بر سرعت سایت اثر می‌گذارد؟

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

چگونه بلوک‌های Gutenberg را محدود کنم؟

با فیلتر allowed_block_types_all. برای محدودسازی پیشرفته‌تر، می‌توان از JavaScript و wp.blocks.unregisterBlockType استفاده کرد.

آیا ACF برای ساده‌سازی پیشخوان مناسب است؟

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

چگونه اعلان‌های تبلیغاتی افزونه‌ها را حذف کنم؟

با remove_action برای اعلان‌های خاص، یا با remove_all_actions('admin_notices') برای حذف همه اعلان‌ها (با احتیاط).

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

بله. سفارشی‌سازی باید بر اساس جریان کاری مشتری، سطح مهارت فنی و نیازهای کسب‌وکار او طراحی شود. یک راه‌حل یکسان برای همه مشتریان، احتمالاً مناسب هیچ‌کدام نیست.

چگونه سفارشی‌سازی را در Child Theme قرار دهم؟

کد سفارشی پیشخوان را در functions.php قالب فرزند قرار دهید. برای کدهای حیاتی که نباید با تغییر قالب حذف شوند، از MU-Plugin استفاده کنید.

چگونه از پیشخوان خودم محافظت کنم در حالی که مشتری دسترسی دارد؟

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

آیا سفارشی‌سازی پیشخوان بر سئو اثر می‌گذارد؟

به‌طور مستقیم، خیر. اما تجربه بهتر مشتری به تولید محتوای بیشتر و بهتر منجر می‌شود که به‌طور غیرمستقیم بر سئو اثر می‌گذارد.

نکات پیشرفته برای مهندسان ارشد

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

معماری کد سفارشی پیشخوان

در پروژه‌های حرفه‌ای، کد سفارشی پیشخوان باید در یک ساختار منظم سازمان‌دهی شود:

mu-plugins/
└── admin-customization/
    ├── admin-customization.php       # فایل اصلی
    ├── includes/
    │   ├── class-menu-manager.php    # مدیریت منوها
    │   ├── class-branding.php         # برندینگ
    │   ├── class-roles.php            # نقش‌ها
    │   ├── class-editor.php           # ویرایشگر
    │   ├── class-notices.php          # اعلان‌ها
    │   └── class-help.php             # راهنما
    └── assets/
        ├── css/
        └── js/

این ساختار، نگهداری و توسعه را ساده‌تر می‌کند.

استفاده از Composer برای وابستگی‌ها

composer require yoast/php-codesniffer
composer require --dev wp-coding-standards/wpcs

برای مطالعه بیشتر درباره Composer، مقاله Composer برای مدیریت وابستگی وردپرس را ببینید.

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

در پروژه‌های حرفه‌ای، پایش فعالیت مشتری در پیشخوان مفید است:

add_action('admin_init', function() {
    if (!is_user_logged_in()) {
        return;
    }
    
    $user = wp_get_current_user();
    $log = array(
        'user' => $user->user_login,
        'action' => $_SERVER['REQUEST_URI'],
        'time' => current_time('mysql'),
        'ip' => $_SERVER['REMOTE_ADDR'],
    );
    
    error_log(json_encode($log));
});

این لاگ برای عیب‌یابی و آموزش مشتری مفید است.

سفارشی‌سازی White-Label

در پروژه‌های سازمانی، ممکن است لازم باشد وردپرس به‌طور کامل به هویت مشتری درآید:

// حذف همه اشاره‌ها به وردپرس
add_action('init', function() {
    if (!current_user_can('manage_options')) {
        add_filter('admin_footer_text', function() {
            return 'مدیریت سایت';
        });
    }
});

// تغییر نام منوی Dashboard
add_action('admin_menu', function() {
    global $menu;
    foreach ($menu as $key => $item) {
        if ($item[2] === 'index.php') {
            $menu[$key][0] = 'خانه';
        }
    }
});

Integration با سیستم‌های خارجی

در پروژه‌های سازمانی، پیشخوان ممکن است به سیستم‌های خارجی متصل باشد:

add_action('wp_dashboard_setup', function() {
    wp_add_dashboard_widget(
        'crm_stats_widget',
        'آمار CRM',
        function() {
            $response = wp_remote_get('https://api.crm.example.com/stats', array(
                'headers' => array(
                    'Authorization' => 'Bearer ' . get_option('crm_api_key'),
                ),
            ));
            
            if (!is_wp_error($response)) {
                $stats = json_decode(wp_remote_retrieve_body($response), true);
                echo '<ul>';
                foreach ($stats as $key => $value) {
                    printf('<li>%s: %s</li>', esc_html($key), esc_html($value));
                }
                echo '</ul>';
            }
        }
    );
});

نکات کلیدی برای پایداری بلندمدت

در پایان، چند نکته کلیدی که باید در خاطر بماند:

  • کد سفارشی را در MU-Plugin یا Child Theme قرار دهید: نه در هسته وردپرس.
  • ساختار منظم داشته باشید: کد را در کلاس‌ها و فایل‌های جداگانه سازمان‌دهی کنید.
  • Composer و Coding Standards: از استانداردهای وردپرس پیروی کنید.
  • نسخه‌بندی: هر تغییر در پیشخوان را در Git ثبت کنید.
  • محیط استیجینگ: تغییرات را ابتدا در استیجینگ تست کنید.
  • پشتیبان‌گیری: قبل از هر تغییر مهم، پشتیبان بگیرید.
  • پایش فعالیت: لاگ فعالیت مشتری برای عیب‌یابی و آموزش.
  • مستندسازی: تغییرات پیشخوان را برای تیم و مشتری مستند کنید.
  • آموزش مشتری: جلسه آموزشی و ویدیوهای راهنما ارائه دهید.
  • White-Label: در پروژه‌های سازمانی، وردپرس را به هویت مشتری نزدیک کنید.

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