قطعه کد مخفی کردن منوی مدیریت وردپرس
قطعه کد مخفی کردن منوی مدیریت وردپرس چطور کار میکند؟ راهنمای عملی حذف منوهای غیرضروری از پیشخوان، اعمال شرطی براساس نقش و capability، پنهانسازی زیرم
سالها پیش، سایتی را برای یک آموزشگاه کوچک تحویل دادم که در آن، مدیرعامل با یک نقش اداری ساده وارد پیشخوان میشد. یک هفته بعد زنگ زد و پرسید: «چرا اینهمه منو اینجاست؟ من فقط برای دیدن پیامهای دانشآموزان میآیم، ولی اینجا ده تا گزینه دیگر هم هست که نمیدانم چهکار میکنند.» آن تماس، یک باور رایج را در ذهن من شکست: اینکه تمام منوهای پیشخوان وردپرس باید برای همه قابل مشاهده باشند. در واقع، پنهان کردن منوهای غیرضروری، یکی از مؤثرترین راهها برای بهبود تجربهٔ کاربری مدیران غیرفنی است، بیآنکه چیزی از قابلیتهای سایت کم شود. این مقاله، دقیقاً همان موضوع را با هم مرور میکند: قطعه کد مخفی کردن منوی مدیریت وردپرس چه کاری انجام میدهد، با چه هوکهایی کار میکند، چطور براساس نقش و capability اعمال شرطی شود، و چه ملاحظات امنیتی و پایداری در آن وجود دارد. اگر با مفهوم پایهٔ اسنیپت آشنا نیستید، پیش از ادامه قطعه کد وردپرس چیست و چگونه از آن استفاده کنیم نقطهٔ شروع بهتری است. مقالهٔ خواهر این موضوع در قطعه کد محدود کردن دسترسی کاربران وردپرس به لایهٔ پرمعناتر دسترسیها میپردازد؛ این مقاله اما روی همان چیزی تمرکز دارد که کاربر میبیند: منوی پیشخوان.
چرا پنهان کردن منوها، یک تصمیم تجربی است، نه فقط امنیتی
وقتی صحبت از پنهان کردن منوی پیشخوان میشود، اولین چیزی که به ذهن میرسد امنیت است. ولی تجربهٔ من میگوید این تصمیم، به همان اندازه که امنیتی است، تجربی هم هست. سه دلیل که در پروژههای خودم پنهانسازی منوها را جدی میگیرم:
دلیل اول: کاهش بار شناختی. پنل وردپرس در حالت پیشفرض حدود ده منوی سطح اول دارد: نوشتهها، رسانه، برگهها، دیدگاهها، نمایش، افزونهها، کاربران، ابزارها، تنظیمات. برای مدیر فنی این تنوع، فرصت است؛ ولی برای یک کاربر اداری، بار سنگینی است که تمرکز او را از کار اصلی میگیرد. هر منویی که حذف میشود، بخشی از این بار شناختی کاهش مییابد.
دلیل دوم: کاهش خطای انسانی. کاربری که منوی «افزونهها» را میبیند، حتی اگر قصد شرارت نداشته باشد، در لحظهٔ بیحوصلگی ممکن است روی آن کلیک کند و اتفاقی را بیندازد. در پروژهای، کاربری که منوی «ابزارها» را میدید، سهواً یک ایمپورت آزمایشی را شروع کرد که نیمهکاره ماند و سایت را چند ساعت بههم ریخت. پنهان کردن این منو از دید او، از همان روز، جلوی این نوع حادثه را گرفت.
دلیل سوم: کاهش سطح حمله. اگر حساب یک کاربر غیرمدیر به هر دلیلی آلوده شود، هر منویی که در پیشخوان میبیند، یک درِ بالقوه برای مهاجم است. پنهان کردن منوها، این درها را کم میکند — نه بهطور کامل، چون در لایهٔ فنی هم باید capabilityها محدود باشند، ولی بهعنوان یک لایهٔ تکمیلی، ارزش دارد. تحلیل تفصیلی این تفکر در راهنمای امنیت وردپرس برای مبتدیان آمده است.
پیشخوان وردپرس، دفتر کار هر کاربر است. اگر پشت هر میز، پروندههای همهٔ کارمندان دیگر هم انبار شده باشد، آن کارمند وقت کار کردن ندارد. پنهان کردن منوها، پاکسازی همان دفتر است.
پنهان کردن منو و محدود کردن دسترسی: تفاوت مهمی که نباید قاطی شود
این تفکیک، پایهٔ فهم درست این مقاله است و اکثر پروژههایی که با مشکل مواجه شدهاند، اینجا اشتباه کردهاند. دو کار کاملاً متفاوت در حوزهٔ کنترل دسترسی وجود دارد:
پنهان کردن منو: کاربر همچنان به آن بخش دسترسی دارد، ولی منو در پیشخوان نمایش داده نمیشود. اگر کاربر آدرس مستقیم آن بخش را در مرورگر وارد کند، میتواند آن را ببیند. پنهان کردن، یک تصمیم تجربی است، نه یک اقدام امنیتی.
محدود کردن دسترسی: کاربر از نظر فنی امکان دسترسی به آن بخش را ندارد. اگر آدرس مستقیم را وارد کند، وردپرس پیام «دسترسی غیرمجاز» میدهد. محدود کردن دسترسی، یک اقدام امنیتی واقعی است که در لایهٔ capability اتفاق میافتد.
تفاوت این دو، در تجربهٔ من، منبع یکی از رایجترین باورهای غلط در پروژههای وردپرسی است: «منوی افزونهها را مخفی کردم، پس کاربر دیگر نمیتواند افزونه نصب کند.» این جمله غلط است. مخفی کردن، فقط ظاهر را تغییر میدهد. اگر آن کاربر آدرس /wp-admin/plugin-install.php را وارد کند، همچنان میتواند افزونه نصب کند — مگر اینکه capabilityهای او در لایهٔ نقش محدود شده باشد. توضیح دقیق این لایهٔ دوم در قطعه کد افزودن نقش کاربری جدید وردپرس و قطعه کد محدود کردن دسترسی کاربران وردپرس آمده است.
در پروژههای خودم، همیشه هر دو کار را انجام میدهم: هم منو را از دید کاربر پنهان میکنم و هم دسترسیاش را در لایهٔ نقش محدود میکنم. این ترکیب، تجربهٔ کاربری و امنیت را همزمان بهبود میدهد.
هوکهای مسئول: از admin_menu تا admin_bar_menu
وردپرس برای مدیریت منوی پیشخوان، مجموعهای از هوکها و توابع اختصاصی در اختیار شما میگذارد. نقشهٔ این هوکها، از ابتدا بدانید که در کدام بخش چه ابزاری دارید:
| هدف | هوک | تابع اصلی |
|---|---|---|
| منوهای سطح اول پیشخوان | admin_menu | remove_menu_page |
| زیرمنوهای پیشخوان | admin_menu | remove_submenu_page |
| ابزارکهای صفحهٔ پیشخوان | wp_dashboard_setup | remove_meta_box |
| نوار مدیریت بالای سایت | admin_bar_menu | remove_node |
سه نکتهٔ کلیدی در این نقشه. اول، هوک admin_menu هم برای منوهای سطح اول و هم برای زیرمنوها استفاده میشود؛ این هوک در لحظهای اجرا میشود که وردپرس در حال ساخت ساختار منوها است. دوم، استفاده از اولویت بالا (مثلاً ۹۹۹) در این هوک ضروری است تا مطمئن شوید همهٔ منوها پیش از تلاش شما برای حذف، ثبت شدهاند. سوم، برای هر یک از این هوکها، تابع اختصاصی وردپرس وجود دارد که کار را ساده میکند. توضیح تفصیلی این هوکها در مهمترین Action Hook های وردپرس و برای نحوۀ اتصال، نحوه استفاده از add_action در وردپرس آمده است.
حذف منوهای سطح اول با remove_menu_page
ابزار اصلی برای حذف منوهای سطح اول، تابع remove_menu_page است. این تابع، اسلاگ منو را میگیرد و منو را حذف میکند. الگوی پایه:
/**
* Snippet: Hide unnecessary admin menus for non-admins.
*
* @since 2026-09-16
* @author WordPressKar
*
* Purpose: Remove tools, comments, plugins and themes menus for non-admin users.
* Location: mu-plugins directory or child theme functions.php.
*/
add_action( 'admin_menu', 'wphk_hide_admin_menus', 999 );
function wphk_hide_admin_menus() {
if ( current_user_can( 'manage_options' ) ) {
return;
}
remove_menu_page( 'tools.php' );
remove_menu_page( 'edit-comments.php' );
remove_menu_page( 'plugins.php' );
remove_menu_page( 'themes.php' );
}
چهار نکتهٔ کلیدی در همین نمونه. اول، استفاده از اولویت ۹۹۹ که تضمین میکند تابع شما بعد از ثبت همهٔ منوها اجرا میشود؛ بدون این اولویت، ممکن است برخی منوها دوباره ظاهر شوند. توضیح این مفهوم در Priority در هوکهای وردپرس چیست آمده است. دوم، بررسی current_user_can( 'manage_options' ) در ابتدای تابع که به مدیران اجازه میدهد همهٔ منوها را ببینند. سوم، انتخاب منوها براساس نیاز پروژه، نه براساس حدس؛ در تجربهٔ من، پنهان کردن «ابزارها» و «افزونهها» برای کاربران غیرفنی، همیشه اثرگذار بوده است. چهارم، اسلاگ منوها را درست انتخاب کردهام: tools.php، edit-comments.php، plugins.php و themes.php. اگر اسلاگ اشتباه باشد، وردپرس خطایی نمیدهد و فقط چیزی حذف نمیشود. برای نمونههای بیشتر در این حوزه، قطعه کد مخفی کردن منوی مدیریت وردپرس مرجع خوبی است.
حذف زیرمنوها با remove_submenu_page
گاهی نمیخواهیم کل یک منو را حذف کنیم، بلکه فقط یکی از زیرمنوهای آن را. مثلاً در منوی «تنظیمات»، زیرمنوی «حریم خصوصی» ممکن است برای نقش خاصی بیمعنی باشد. ابزار مناسب، تابع remove_submenu_page است:
add_action( 'admin_menu', 'wphk_hide_admin_submenus', 999 );
function wphk_hide_admin_submenus() {
if ( current_user_can( 'manage_options' ) ) {
return;
}
// حذف زیرمنوی «حریم خصوصی» از منوی تنظیمات
remove_submenu_page( 'options-general.php', 'options-privacy.php' );
// حذف زیرمنوی «افزودن جدید» از منوی نوشتهها برای نقشهای محدود
if ( ! current_user_can( 'publish_posts' ) ) {
remove_submenu_page( 'edit.php', 'post-new.php' );
}
}
سه نکتهٔ کلیدی در این الگو. اول، پارامتر اول remove_submenu_page اسلاگ منوی والد است، نه نام نمایشی آن. برای منوی «تنظیمات» این اسلاگ options-general.php است. دوم، برای منوی «نوشتهها» که اسلاگ والدش edit.php است، زیرمنوی «افزودن جدید» با اسلاگ post-new.php حذف میشود. سوم، اعمال شرطی براساس capability که باعث میشود کاربران با دسترسی انتشار، همچنان به زیرمنو دسترسی داشته باشند. یک نکتهٔ ظریف: اگر کل زیرمنوها را حذف کنید، وردپرس بهطور خودکار منوی والد را هم پنهان میکند. الگوهای مشابه برای حذف زیرمنوهای سفارشی افزونهها در قطعه کد مخفی کردن منوی مدیریت وردپرس آمده است.
اعمال شرطی براساس نقش و capability
پنهان کردن منوها بدون اعمال شرطی، میتواند به نتایج غیرمنتظره منجر شود. مثلاً اگر منو را برای همه حذف کنید، حتی مدیر سایت هم آن را نمیبیند. قاعدهٔ من در پروژههای خودم: همیشه براساس capability اعمال شرطی کنید، نه براساس نام نقش. دلیل این انتخاب در توابع وردپرس برای مدیریت نقشها و دسترسیها با جزئیات آمده است. الگوی درست:
add_action( 'admin_menu', 'wphk_hide_conditional_menus', 999 );
function wphk_hide_conditional_menus() {
// کاربران با دسترسی مدیریت سایت: همه منوها را میبینند
if ( current_user_can( 'manage_options' ) ) {
return;
}
// کاربران با دسترسی ویرایش نوشتههای دیگران: منوی کاربران را میبینند
if ( ! current_user_can( 'list_users' ) ) {
remove_menu_page( 'users.php' );
}
// کاربران بدون دسترسی مدیریت افزونهها: منوی افزونهها پنهان است
if ( ! current_user_can( 'activate_plugins' ) ) {
remove_menu_page( 'plugins.php' );
}
// کاربران بدون دسترسی مدیریت قالب: منوی نمایش پنهان است
if ( ! current_user_can( 'switch_themes' ) ) {
remove_menu_page( 'themes.php' );
}
// کاربران بدون دسترسی مدیریت تنظیمات: منوی تنظیمات پنهان است
if ( ! current_user_can( 'manage_options' ) ) {
remove_menu_page( 'options-general.php' );
}
}
چهار نکتهٔ کلیدی در این الگو. اول، استفاده از capabilityهای مشخص برای هر منو، نه نام نقش. دوم، بررسی جداگانهٔ هر منو، که اضافهکردن یک مورد جدید در آینده را ساده میکند. سوم، استفاده از capabilityهای استاندارد وردپرس که در مستندات رسمی تعریف شدهاند. چهارم، ترتیب منطقی که ابتدا شرایط کلی (مدیر سایت) و سپس شرایط خاص را بررسی میکند. اگر با capabilityهای وردپرس آشنایی کمتری دارید، توابع وردپرس برای مدیریت نقشها و دسترسیها مرجع جامعی است.
پنهان کردن ابزارکهای پیشخوان
صفحهٔ پیشخوان، جدا از منوها، ابزارکهایی دارد که برخی از آنها برای کاربران غیرمدیر بیمعنی یا حتی نگرانکننده هستند. هوک مناسب برای مدیریت این ابزارکها، wp_dashboard_setup است:
add_action( 'wp_dashboard_setup', 'wphk_customize_dashboard_widgets' );
function wphk_customize_dashboard_widgets() {
if ( current_user_can( 'manage_options' ) ) {
return;
}
// حذف ابزارک «اخبار وردپرس»
remove_meta_box( 'dashboard_primary', 'dashboard', 'side' );
// حذف ابزارک «پیشنویس سریع»
remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' );
// حذف ابزارک «بهروزرسانی وردپرس» (اطلاعات امنیتی)
remove_meta_box( 'dashboard_secondary', 'dashboard', 'side' );
// حذف ابزارک «به یک نگاه»
remove_meta_box( 'dashboard_right_now', 'dashboard', 'normal' );
// افزودن یک ابزارک خوشآمدگویی ساده
wp_add_dashboard_widget(
'wphk_welcome_widget',
'خوش آمدید',
'wphk_render_welcome_widget'
);
}
function wphk_render_welcome_widget() {
$user = wp_get_current_user();
if ( ! $user instanceof WP_User ) {
return;
}
printf(
'<p>%s عزیز، به پیشخوان خوش آمدید.</p>',
esc_html( $user->display_name )
);
}
چهار نکتهٔ کلیدی در این الگو. اول، استفاده از remove_meta_box با نام ابزارک، شناسهٔ صفحه و مکان (مثل side یا normal). دوم، حذف ابزارکهایی که کاربر غیرمدیر نیازی به آنها ندارد، بهویژه «اخبار وردپرس» و «بهروزرسانی» که ممکن است برای کاربر عادی گیجکننده باشد. سوم، جایگزینکردن این ابزارکها با یک ابزارک خوشآمدگویی ساده که تجربهٔ کاربری را انسانیتر میکند. چهارم، استفاده از esc_html روی نام کاربر که از تزریق داده جلوگیری میکند. الگوهای مشابه برای سفارشیسازی پیشخوان در قطعه کد افزودن ستون سفارشی به مدیریت وردپرس آمده است.
پنهان کردن گزینههای نوار مدیریت بالای سایت
نوار مدیریت (Admin Bar) که در بالای سایت نمایش داده میشود، از منوهای پیشخوان جداست و با هوک دیگری مدیریت میشود. این نوار، گزینههایی مثل «ویرایش صفحه»، «افزودن جدید»، «پیشخوان»، «پروفایل» و «خروج» را نشان میدهد. برای پنهان کردن بخشی از این گزینهها، از هوک admin_bar_menu استفاده کنید:
add_action( 'admin_bar_menu', 'wphk_customize_admin_bar', 999 );
function wphk_customize_admin_bar( $wp_admin_bar ) {
if ( current_user_can( 'manage_options' ) ) {
return;
}
// حذف گزینهٔ «افزودن جدید»
$wp_admin_bar->remove_node( 'new-content' );
// حذف گزینهٔ «جستجو»
$wp_admin_bar->remove_node( 'search' );
// حذف گزینهٔ «وردپرس» در سمت چپ
$wp_admin_bar->remove_node( 'wp-logo' );
// حذف گزینهٔ «دیدگاهها»
$wp_admin_bar->remove_node( 'comments' );
}
سه نکتهٔ کلیدی در این الگو. اول، پارامتر تابع یک شیء WP_Admin_Bar است که از طریق آن میتوانید گزینهها را حذف کنید. دوم، استفاده از متد remove_node با شناسهٔ گزینه، نه با نام نمایشی آن. سوم، اولویت ۹۹۹ که مطمئن میشود همهٔ گزینهها پیش از تلاش شما ثبت شدهاند. یک نکتهٔ عملی: در پروژههای خودم، پنهان کردن گزینهٔ «افزودن جدید» از نوار مدیریت برای کاربران با نقش نویسنده، تجربهٔ کاربریشان را بهبود میدهد چون آنها بیشتر با نوشتههای خودشان کار میکنند و نیازی به دسترسی سریع به «افزودن» سایر بخشها ندارند. تحلیل تفصیلی این نوار در قطعه کد مخفی کردن منوی مدیریت وردپرس آمده است.
یک اسنیپت کامل و آماده
پس از مرور بخشهای مختلف، بگذارید یک اسنیپت کامل را با هم ببینیم که همهٔ اینها را در یک ساختار منظم جمع میکند:
<?php
/**
* Snippet: Full admin menu customization for non-admin users.
*
* @since 2026-09-16
* @author WordPressKar
*
* Purpose: Hide unnecessary menus, submenus, dashboard widgets and admin bar items for non-admin users.
* Location: mu-plugins directory or child theme functions.php.
*/
// 1. حذف منوهای سطح اول
add_action( 'admin_menu', 'wphk_hide_main_menus', 999 );
function wphk_hide_main_menus() {
if ( current_user_can( 'manage_options' ) ) {
return;
}
if ( ! current_user_can( 'activate_plugins' ) ) {
remove_menu_page( 'plugins.php' );
}
if ( ! current_user_can( 'switch_themes' ) ) {
remove_menu_page( 'themes.php' );
}
if ( ! current_user_can( 'list_users' ) ) {
remove_menu_page( 'users.php' );
}
if ( ! current_user_can( 'export' ) ) {
remove_menu_page( 'tools.php' );
}
remove_menu_page( 'edit-comments.php' );
}
// 2. حذف زیرمنوها
add_action( 'admin_menu', 'wphk_hide_submenus', 999 );
function wphk_hide_submenus() {
if ( current_user_can( 'manage_options' ) ) {
return;
}
remove_submenu_page( 'options-general.php', 'options-privacy.php' );
if ( ! current_user_can( 'publish_posts' ) ) {
remove_submenu_page( 'edit.php', 'post-new.php' );
}
}
// 3. حذف ابزارکهای پیشخوان
add_action( 'wp_dashboard_setup', 'wphk_customize_dashboard' );
function wphk_customize_dashboard() {
if ( current_user_can( 'manage_options' ) ) {
return;
}
remove_meta_box( 'dashboard_primary', 'dashboard', 'side' );
remove_meta_box( 'dashboard_secondary', 'dashboard', 'side' );
remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' );
remove_meta_box( 'dashboard_right_now', 'dashboard', 'normal' );
remove_meta_box( 'dashboard_activity', 'dashboard', 'normal' );
}
// 4. حذف گزینههای نوار مدیریت
add_action( 'admin_bar_menu', 'wphk_customize_admin_bar', 999 );
function wphk_customize_admin_bar( $wp_admin_bar ) {
if ( current_user_can( 'manage_options' ) ) {
return;
}
$wp_admin_bar->remove_node( 'new-content' );
$wp_admin_bar->remove_node( 'wp-logo' );
$wp_admin_bar->remove_node( 'comments' );
}
چهار نکتهٔ کلیدی در این اسنیپت کامل. اول، تفکیک منطق در چهار تابع مستقل که هرکدام با یک هوک متفاوت کار میکنند. این ساختار، نگهداری را چند برابر سادهتر میکند. دوم، بررسی current_user_can( 'manage_options' ) در ابتدای هر تابع، که مدیر سایت را از همهٔ تغییرات معاف میکند. سوم، استفاده از capabilityهای مشخص برای هر تصمیم، نه نام نقش. چهارم، هدر توضیحات کامل در ابتدای اسنیپت که هدف و محل قرارگیری را روشن میکند. اصول کلی این ساختار در قطعه کد وردپرس چیست و چگونه از آن استفاده کنیم آمده است.
ملاحظهٔ امنیتی: پنهانسازی جایگزین کنترل دسترسی نیست
در چند پروژه، با این باور خطرناک روبهرو شدهام: «منوی افزونهها را از دید کاربر پنهان کردم، پس دیگر نمیتواند افزونه نصب کند.» این جمله نادرست است. تابع remove_menu_page فقط منو را از ظاهر پیشخوان حذف میکند؛ اگر کاربر آدرس /wp-admin/plugin-install.php را بهطور مستقیم وارد کند، وردپرس بررسی میکند که آیا کاربر capability مربوطه را دارد یا نه. اگر آن capability فعال باشد، کاربر میتواند از صفحهٔ نصب افزونه استفاده کند.
راهحل درست: هم منو را پنهان کنید و هم capability مربوطه را از نقش کاربر بگیرید. الگوی کامل این کار در قطعه کد افزودن نقش کاربری جدید وردپرس و قطعه کد محدود کردن دسترسی کاربران وردپرس آمده است. یک قاعدهٔ ساده: پنهانسازی، برای تجربهٔ کاربری است؛ محدودسازی capability، برای امنیت. هر دو را با هم انجام دهید، ولی آنها را جایگزین یکدیگر نکنید.
پنهان کردن منو، مثل بستن پردهٔ پنجره است؛ اگر درِ خانه باز باشد، پرده هیچ کاری نمیکند. پرده را برای زیبایی و راحتی میبندیم؛ در را برای امنیت قفل میکنیم.
محل درست قرارگیری این اسنیپت
مانند همهٔ اسنیپتهای وردپرس، محل قرارگیری این کد هم تصمیم مهمی است. سه گزینه پیش روی شماست:
گزینهٔ اول: افزونهٔ اختصاصی یا mu-plugins. این اسنیپت به تجربهٔ پیشخوان مربوط است و بخشی از استراتژی امنیتی و کاربری سایت محسوب میشود؛ بنابراین جای طبیعیاش افزونهٔ اختصاصی است، نه فایل قالب. اگر با ساختار افزونهٔ اختصاصی آشنا نیستید، کدنویسی اختصاصی برای افزونه وردپرس و ساختار فایلهای یک افزونه استاندارد وردپرس مراجع کاملی هستند.
گزینهٔ دوم: چایلد تم. اگر پروژهٔ شما ساده است و افزونهٔ اختصاصی ندارید، چایلد تم گزینهٔ قابلقبولی است؛ ولی توجه داشته باشید که در تعویض قالب، این تغییر از بین میرود و ممکن است کسی متوجه نشود. تفاوتها و کاربردهای چایلد تم در قالب وردپرس چایلد چیست و چه زمانی به آن نیاز داریم آمده است.
گزینهٔ سوم: افزونهٔ مدیریت اسنیپت. اگر میخواهید سریع شروع کنید و بعداً تصمیم بگیرید، سبکترین راه است. اگر با این رویکرد آشنا نیستید، چگونه قطعه کد وردپرس را ایمن اجرا کنیم نکات ایمنی مهمی دارد.
الگوی عملی من در پروژههای خودم: تمام کدهای مرتبط با سفارشیسازی پیشخوان را در یک افزونهٔ اختصاصی به نام «wphk-admin-ui» نگه میدارم که هم مخفیسازی منوها را در خود دارد، هم ابزارکهای سفارشی و هم تنظیمات ظاهری پیشخوان. این ساختار، در پروژههای چندساله، پایداری و مستندسازی را تضمین میکند. برای دیدن فهرست گستردهتری از اسنیپتهای کاربردی، بهترین قطعه کدهای کاربردی وردپرس برای سایتها مرجع خوبی است.
اشتباهات رایج در مخفی کردن منوها
در بازبینی سایتهای مختلف، شش اشتباه تکراری در این حوزه دیدهام که هرکدام درسآموز است:
| اشتباه | پیامد واقعی | اصلاح |
|---|---|---|
نبود اولویت بالا در هوک admin_menu | منو دوباره ظاهر میشود | استفاده از اولویت ۹۹۹ |
استفاده از اسلاگ اشتباه در remove_menu_page | منو حذف نمیشود بدون هیچ خطایی | بررسی اسلاگ دقیق منو |
| باورداشتن اینکه پنهانسازی جایگزین کنترل دسترسی است | ریسک امنیتی جدی | ترکیب پنهانسازی + محدودسازی capability |
| حذف منو برای همه کاربران، از جمله مدیر | مدیر سایت هم منو را از دست میدهد | شرط current_user_can در ابتدای تابع |
| استفاده از نام نقش بهجای capability در شرط | کاربران با نقش ترکیبی بهدرستی شناسایی نمیشوند | استفاده از current_user_can |
| نبود پیشوند اختصاصی در نام توابع | تعارض با افزونههای دیگر | پیشوند یکتا مثل wphk_ |
هرکدام از این اشتباهات را در پروژهای دیدهام و همهشان در چند دقیقه اصلاحشدنی هستند. برای مرور عمومی این نوع خطاها، اشتباهات رایج هنگام استفاده از قطعه کد وردپرس و اشتباهات رایج امنیتی وردپرس مراجع جامعی هستند.
دو پروندهٔ واقعی از پروژهها
برای اینکه این اصول در عمل روشنتر شوند، دو پروندهٔ واقعی از تجربهٔ خودم را مرور میکنم — بدون جزئیات هویتی، ولی با ساختار دقیق مشکل و راهحل.
پروندهٔ اول: آموزشگاهی که با مخفیسازی منو، تجربهٔ مدیرعامل را ساده کرد
همان پروژهٔ ابتدای مقاله. مدیرعامل آموزشگاه، روزانه برای دیدن پیامهای دانشآموزان وارد پیشخوان میشد ولی با منوی کامل وردپرس روبهرو بود. راهحل: تعریف اسنیپتی که برای نقش «مدیر آموزشگاه» فقط منوهای «نوشتهها»، «کاربران» و «دیدگاهها» را نشان میداد و بقیه را پنهان میکرد. همزمان در لایهٔ نقش، capabilityهای مدیریت افزونه و قالب از این نقش برداشته شد. نتیجه: تجربهٔ روزانهٔ مدیرعامل سادهتر شد و در دو ماه اول پس از تحویل، هیچ تماس پشتیبانیای درباره «این گزینه چیست؟» گرفته نشد. تحلیل تفصیلی این نوع بهینهسازی در راهنمای امنیت وردپرس برای مبتدیان آمده است.
پروندهٔ دوم: مجلهای که با مخفیسازی ابزارکها، هشدارهای ناخواسته را حذف کرد
در یک مجله آنلاین، تیم تحریریه با نقش editor کار میکرد و در هر بار ورود به پیشخوان، ابزارک «بهروزرسانی وردپرس» پیام میداد که نسخهٔ جدیدی موجود است — پیامی که برای این تیم هیچ معنایی نداشت، ولی هر بار نگرانی ایجاد میکرد. راهحل: افزودن اسنیپت wp_dashboard_setup که ابزارکهای «اخبار وردپرس»، «بهروزرسانی» و «به یک نگاه» را از دید تیم تحریریه حذف میکرد و بهجایش یک ابزارک سادهٔ «آمار محتوای شما» اضافه میکرد. نتیجه: تیم تحریریه با تمرکز بیشتر روی کار خود شروع به کار کرد و تعداد پیامهای «این هشدار چیست؟» در تیم پشتیبانی به صفر رسید. تجربهٔ مشابه در حوزهٔ ابزارکهای پیشخوان در قطعه کد افزودن ستون سفارشی به مدیریت وردپرس آمده است.
این دو پرونده، نکتهٔ مشترک دارند: مخفی کردن منوها و ابزارکها، اگر با آگاهی از نیاز کاربر انجام شود، تجربهٔ روزانهٔ تیم را محسوس بهبود میدهد و بهرهوری را بالا میبرد.
مسیر پیشنهادی و نتیجه
قطعه کد مخفی کردن منوی مدیریت وردپرس، یکی از سادهترین و در عین حال اثرگذارترین کارهای سفارشیسازی پیشخوان است. سه ستون این کار: استفاده از هوک admin_menu با اولویت بالا برای حذف منوها، استفاده از wp_dashboard_setup برای ابزارکهای پیشخوان، و استفاده از admin_bar_menu برای نوار مدیریت بالای سایت. اعمال شرطی براساس capability، نه نام نقش، بهترین روش برای انعطافپذیری در بلندمدت است. و ملاحظهٔ امنیتی مهم: پنهانسازی، جایگزین محدودسازی capability نیست؛ هر دو را با هم انجام دهید. محل درست این اسنیپت، افزونهٔ اختصاصی یا mu-plugins است، نه فایل قالب والد.
گام بعدی عملی که پیشنهاد میکنم: در همین امروز، با یک کاربر آزمایشی که نقش غیرمدیر دارد وارد پیشخوان شوید و ببینید چه منوهایی برای او نمایش داده میشود. از خودتان بپرسید هرکدام از این منوها برای این کاربر چه معنایی دارند و آیا حذفشان تجربهٔ کاربری را بهبود میدهد. اگر پاسخ روشن است، همین هفته میتوانید با یک اسنیپت کوچک، این بهبود را اعمال کنید. اگر تجربهای با مخفی کردن منوی پیشخوان داشتهاید — بهویژه اگر در پروژهای به نکتهای برخوردهاید که در این مقاله پوشش داده نشده یا اگر روش تمیزی برای ترکیب چند نوع سفارشیسازی پیشخوان پیدا کردهاید — برای من جالب است بدانید چطور حلش کردید. تجربهٔ خودتان را در دیدگاهها بنویسید؛ بهویژه اگر رویکرد جالبی برای مدیریت منوهای سفارشی افزونهها دارید. 🧭