تابع remove_cap در وردپرس
در وردپرس مفاهیم نقش (Role) و قابلیت (Capability) پایهٔ مدیریت دسترسیها را شکل میدهند. متد remove_cap() ابزاری است که برای حذف یک قابلیت مشخص از یک نقش یا یک کاربر استفاده میشود. این متد میتواند در کلاسهای WP_Role و WP_User فراخوانی شود و تغییرات را بهصورت دائمی در پایگاه داده ذخیره کند.
وقتی از remove_cap() استفاده میکنیم
- وقتی میخواهیم یک نقش را ضعیفتر کنیم (برای مثال حذف امکان انتشار محتوا از نقش خاص)
- وقتی میخواهیم استثنائاتی برای یک کاربر خاص ایجاد کنیم که از نقش او متفاوت باشد
- زمانی که قابلیت سفارشی (custom capability) اضافه شده باید برداشته یا بازگشت داده شود
متفاوت بودن نقشها و دسترسیهای کاربر
نکتهٔ کلیدی آن است که حذف قابلیت از یک کاربر با حذف از یک نقش متفاوت است. اگر یک نقش، مثلا editor، قابلیت publish_posts داشته باشد و شما آن را از یک کاربر خاص حذف کنید، اما کاربر هنوز نقش editor داشته باشد، ممکن است نقشی که از قبل به کاربر تعلق دارد همچنان آن قابلیت را فراهم کند. بنابراین معمولاً برای تغییر دسترسی جمعی باید روی نقشها کار کنید، نه فقط روی کاربران.
نمونههای عملی و کدهای متداول
حذف قابلیت از یک نقش
$role = get_role( 'editor' );
if ( $role && $role->has_cap( 'publish_posts' ) ) {
$role->remove_cap( 'publish_posts' );
}این کد ابتدا نقش editor را واکشی میکند، بررسی میکند که نقش وجود دارد و سپس در صورت وجود قابلیت publish_posts آن را حذف میکند. این تغییر در جدول نقشها ذخیره میشود و روی تمام کاربرانی که آن نقش را دارند تاثیر خواهد گذاشت.
حذف قابلیت از یک کاربر خاص
$user = new WP_User( $user_id );
if ( $user->has_cap( 'edit_theme_options' ) ) {
$user->remove_cap( 'edit_theme_options' );
}کد بالا قابلیت edit_theme_options را صرفاً برای کاربر مشخص حذف میکند. توجه کنید که اگر نقش کاربر قابلیت را تامین کند، حذف از کاربر ممکن است مؤثر نباشد مگر اینکه نقش نیز تغییر داده شده باشد.
کاربرد در activation/deactivation پلاگین
وقتی پلاگین قابلیت سفارشی اضافه میکند بهترین کار این است که هنگام فعالسازی آن نقشها را آپدیت کرده و هنگام غیرفعالسازی تغییرات را بازگردانید. مثال زیر روشی رایج است:
function my_plugin_activate() {
$role = get_role( 'editor' );
if ( $role ) {
$role->add_cap( 'my_custom_cap' );
}
}
register_activation_hook( __FILE__, 'my_plugin_activate' );
function my_plugin_deactivate() {
$role = get_role( 'editor' );
if ( $role ) {
$role->remove_cap( 'my_custom_cap' );
}
}
register_deactivation_hook( __FILE__, 'my_plugin_deactivate' );در این مثال هنگام فعالسازی یک capability سفارشی اضافه شده و هنگام غیرفعالسازی همان capability حذف میشود تا نقشها به حالت قبل بازگردند و آلودگی به قابلیتهای بلا استفاده ایجاد نشود.
نکات تخصصی و ریزهکاریها
- meta capabilities مثل
edit_postاز طریق تابعmap_meta_cap()به قابلیتهای پایهای ترجمه میشوند. حذف یک meta capability مستقیم با remove_cap معنای متفاوتی دارد—باید روی capabilityهای پایهای که map میکند تمرکز کنید. - حذف capability برای نقش administrator معمولاً توصیه نمیشود؛ سوپر ادمین یا administratorها میتوانند دسترسیهای ضروری را از دست بدهند و مشکلات مدیریتی ایجاد شود.
- در حالت مولتیسایت (Multisite) نقشها معمولاً در هر سایت جدا مدیریت میشوند. اگر میخواهید تغییر را در همه سایتها اعمال کنید، لازم است در هر سایت بهصورت جداگانه نقشها را ویرایش کنید یا از network activation و یک حلقه برای سایتها استفاده کنید.
- همیشه قبل از تغییر نقشها و capabilities در محیط تولید، در محیط staging یا بکآپ تست کنید.
مثال پیشرفته: حذف امن یک capability با بررسی
function safe_remove_role_cap( $role_name, $cap ) {
$role = get_role( $role_name );
if ( ! $role ) {
return new WP_Error( 'no_role', 'Role not found' );
}
if ( ! $role->has_cap( $cap ) ) {
return false; // capability already absent
}
// جلوگیری از حذف قابلیتهای حساس برای administrator
if ( $role_name === 'administrator' && in_array( $cap, array( 'manage_options', 'edit_users' ), true ) ) {
return new WP_Error( 'protected_cap', 'Cannot remove protected capability from administrator' );
}
$role->remove_cap( $cap );
return true;
}این تابع تغییر را ایمن میکند: ابتدا وجود نقش را بررسی میکند، سپس بررسی میکند که قابلیت وجود دارد، و از حذف قابلیتهای حساس از نقش administrator جلوگیری میکند. در صورت خطا، WP_Error بازمیگرداند تا توسعهدهنده بتواند بهدرستی خطاها را هندل کند.
| مورد | عملکرد remove_cap() |
|---|---|
| روی نقش | حذف capability برای همهٔ کاربران دارای آن نقش |
| روی کاربر | حذف capability فقط از آن کاربر؛ نقش ممکن است دوباره آن را فراهم کند |
| تأثیر پایدار | ذخیره در پایگاه داده؛ تا زمانی که تغییر برنگردد باقی میماند |
خلاصه و بهترین شیوهها
- برای اعمال تغییرات سراسری، capability را از نقشها حذف کنید، نه صرفاً از کاربران منفرد.
- قبل از حذف، همیشه بررسی کنید که نقش وجود دارد و قابلیت فعلاً اضافه شده است.
- در پلاگینها هنگام فعال/غیرفعالسازی نقشها و capabilityها را بهطور منظم اضافه/حذف کنید تا ردپاهای اضافی باقی نماند.
- در محیط مولتیسایت دقت بیشتری داشته باشید و برای تغییرات شبکهای از راهکارهای مناسب استفاده کنید.
به کارگیری صحیح remove_cap() میتواند کنترل دقیقی بر دسترسیها فراهم کند اما نیازمند درک تفاوت میان نقشها و کاربران، و توجه به meta capabilities و ملاحظات امنیتی است.
آیا این مطلب برای شما مفید بود ؟




