تابع add_cap در وردپرس
در وردپرس مدیریت دسترسیها (capabilities) و نقشها (roles) یکی از پایههای امنیت و سازماندهی قابلیتهاست. متد add_cap که در کلاسهای WP_Role و WP_User وجود دارد، ابزاری ساده و قدرتمند برای افزودن یک capability جدید به یک نقش یا یک کاربر خاص است. در این مقاله به صورت عملی و با مثالهای واقعی نحوهٔ استفاده، نکات امنیتی و بهترین شیوهها را بررسی میکنیم.
مفاهیم پایه — نقش، قابلیت و متد add_cap
- نقش (Role): مجموعهای از قابلیتها مثل administrator، editor، author و غیره.
- قابلیت (Capability): عمل خاصی که کاربر میتواند انجام دهد، مانند edit_posts یا manage_options.
- WP_Role::add_cap(): افزودن capability به یک نقش (تمام کاربرانی که آن نقش را دارند به صورت خودکار این قابلیت را خواهند داشت).
- WP_User::add_cap(): افزودن capability فقط به یک کاربر مشخص (در متادیتای کاربر ذخیره میشود).
چرا از add_cap استفاده میکنیم؟
برای ایجاد قابلیتهای سفارشی (مثلاً manage_event برای مدیریت رویدادها)، یا تغییر دسترسیها بدون تغییر کدنویسی در هسته وردپرس. این متدها برای گسترش نقشها، امکانپذیر ساختن مدیریت دقیقتر روی CPTها (پستتایپهای سفارشی) و اعمال سیاستهای امنیتی مفید هستند.
نمونهٔ ساده: افزودن capability به یک نقش
function myplugin_add_caps_to_editor() {
$role = get_role('editor');
if ( $role ) {
$role->add_cap('manage_event'); // capability جدید
$role->add_cap('edit_event');
}
}
register_activation_hook(__FILE__, 'myplugin_add_caps_to_editor');در این مثال، هنگام فعالسازی افزونه capabilityهای manage_event و edit_event به نقش editor اضافه میشوند. استفاده از register_activation_hook باعث میشود این عمل تنها یکبار و هنگام فعالسازی انجام شود و نه در هر بار بارگذاری صفحه.
افزودن capability به یک کاربر مشخص
$user = new WP_User(123); // شناسه کاربر
$user->add_cap('manage_event');این کد فقط به کاربر با ID = 123 قابلیت manage_event را میدهد. این تغییر در جدول متای کاربران ذخیره میشود و فقط برای آن کاربر اعمال خواهد شد.
ثبت Post Type با قابلیتهای سفارشی (map_meta_cap)
register_post_type('event', array(
'labels' => array('name' => 'Events'),
'public' => true,
'capability_type' => 'event',
'map_meta_cap' => true,
'capabilities' => array(
'publish_posts' => 'publish_events',
'edit_post' => 'edit_event',
'read_post' => 'read_event',
'delete_post' => 'delete_event',
'edit_posts' => 'edit_events',
'edit_others_posts' => 'edit_others_events',
'delete_posts' => 'delete_events',
'delete_others_posts' => 'delete_others_events',
'read_private_posts' => 'read_private_events',
),
));با فعال کردن map_meta_cap و تعیین آرایه capabilities، وردپرس از متدهای map_meta_cap برای نگاشت عملیات متا (مثل ویرایش یک پست مشخص) به capabilityهای تعریفشده استفاده میکند. سپس میتوانید با add_cap این capabilityها را به نقشها یا کاربران بدهید.
حذف capability و بررسی وجود آن
$role = get_role('editor');
if ( $role->has_cap('manage_event') ) {
$role->remove_cap('manage_event');
}
$current_user = wp_get_current_user();
if ( $current_user->has_cap('manage_event') ) {
// دسترسی دارد
}remove_cap برای حذف capability استفاده میشود و has_cap برای بررسی وجود آن. مراقب باشید حذف capability از نقش، همه کاربران آن نقش را تحت تاثیر قرار میدهد.
مقایسهٔ سریع: WP_Role->add_cap vs WP_User->add_cap
| ویژگی | WP_Role->add_cap | WP_User->add_cap |
|---|---|---|
| دامنه | تمام کاربران با آن نقش | فقط کاربر مشخص |
| پایداری | در گزینههای سایت (wp_user_roles) ذخیره میشود | در متای کاربر ذخیره میشود |
| موارد استفاده | گسترش نقشها، تعریف capability برای CPT | استثناهای فردی، تست یا اعطای موقت دسترسی |
نکات امنیتی و بهترینروشها
- هرگز capabilityهای حساس (مثل manage_options یا switch_themes) را بیمحابا به نقشهای کمامتیاز اختصاص ندهید.
- افزودن capability را در هوکهای مناسب مثل register_activation_hook یا init با شرطهای منطقی انجام دهید، نه در هر بار بارگذاری صفحه.
- برای پستتایپهای سفارشی از capability_type و map_meta_cap استفاده کنید تا کنترل دقیق روی عملیات (خواندن، ویرایش، حذف) داشته باشید.
- مستندسازی capabilities افزونه یا قالب بسیار مهم است؛ اگر افزونهتان capability ایجاد میکند، در فایل readme یا تنظیمات توضیح دهید چه نقشی نیاز به آن دارد.
- در شبکه چندسایتی (multisite) برخی capabilityها متفاوت رفتار میکنند؛ بررسی کنید آیا capability موردنظرتان در سطح شبکه/سایت صحیح عمل میکند یا نیاز به network capability دارید.
نکات تکمیلی و ترفندهای حرفهای
- برای بازگردانی سریع میتوانید قابلیتها را در تابع deactivation یا uninstall افزونه حذف کنید تا از باقی ماندن تنظیمات روی سایتها جلوگیری شود.
- از فیلتر map_meta_cap میتوان برای کنترل دقیقتر (مثلاً اجازه ویرایش فقط برای نویسندهٔ پست) استفاده کرد.
- وقتی capability را به نقش اضافه میکنید، توجه کنید که برخی افزونهها نقشها را بازنویسی یا تنظیم مجدد میکنند؛ در این حالت بررسی سازگاری ضروری است.
مثال پیشرفته: اضافه کردن capability هنگام فعالسازی افزونه و پاکسازی هنگام غیرفعالسازی
function myplugin_activate() {
$roles = array('administrator', 'editor');
$caps = array('manage_event', 'edit_event', 'delete_event');
foreach ( $roles as $r ) {
$role = get_role($r);
if ( $role ) {
foreach ( $caps as $cap ) {
$role->add_cap($cap);
}
}
}
}
function myplugin_deactivate() {
$roles = array('administrator', 'editor');
$caps = array('manage_event', 'edit_event', 'delete_event');
foreach ( $roles as $r ) {
$role = get_role($r);
if ( $role ) {
foreach ( $caps as $cap ) {
$role->remove_cap($cap);
}
}
}
}
register_activation_hook(__FILE__, 'myplugin_activate');
register_deactivation_hook(__FILE__, 'myplugin_deactivate');این کد تمامی capabilityهای مربوط به رویداد را هنگام فعالسازی به نقشهای administrator و editor اضافه کرده و هنگام غیرفعالسازی پاک میکند. این الگو برای نگهداری پاکیزگی دیتابیس و جلوگیری از باقی ماندن تنظیمات ناخواسته توصیه میشود.
جمعبندی
متد add_cap ابزار ساده اما قدرتمندی برای مدیریت سطوح دسترسی در وردپرس است. با ترکیب آن با register_post_type و map_meta_cap میتوانید سیاستهای دسترسی پیچیده و امنی پیاده کنید. همیشه تغییرات در نقشها را با احتیاط انجام دهید، آنها را مستند کنید و از هوکهای مناسب برای اعمال (و بازگردانی) تغییرات استفاده نمایید.
اگر میخواهید نمونهٔ خاصی از ساختار نقشها یا نگاشت capability برای پروژهٔ خود داشته باشید، مشخصات پروژه را بفرستید تا یک طرح دقیقتر ارائه دهم.
آیا این مطلب برای شما مفید بود ؟




