تابع current_user_can در وردپرس
تابع current_user_can() یکی از ابزارهای پایهای و حیاتی در توسعه افزونهها و قالبهای وردپرس است. این تابع برای بررسی اینکه کاربر فعلی آیا دارای یک قابلیت (capability) خاص هست یا خیر، استفاده میشود. در این مقاله به صورت دقیق، مثالهای عملی و نکات امنیتی پیرامون این تابع را بررسی میکنیم.
چرا و چه زمانی از current_user_can() استفاده کنیم؟
- محدود کردن دسترسی به بخشهای مدیریتی یا فرمها
- نمایش یا پنهان کردن آیتمهای منو بر اساس نقش کاربر
- کنترل دسترسی روی عملیات حساس مانند حذف یا ویرایش محتوا
- استفاده در درخواستهای AJAX برای جلوگیری از عملیات غیرمجاز
نحوۀ استفاده پایه
تابع یک پارامتر میگیرد که معمولاً نام قابلیت (capability) است. نتیجه آن بولی (true/false) میباشد.
if ( current_user_can( 'edit_posts' ) ) {
// show edit UI
} else {
// show message or redirect
}کد بالا بررسی میکند که آیا کاربر فعلی قابلیت edit_posts را دارد یا خیر. اگر داشته باشد رابط ویرایش نمایش داده میشود.
قابلیتها (Capabilities) و نقشها (Roles)
نقشها مجموعهای از قابلیتها هستند. برخی قابلیتهای رایج:
| نقش | نمونه قابلیتها |
|---|---|
| Administrator | all capabilities (کل دسترسیها) |
| Editor | edit_posts, edit_others_posts, publish_posts, moderate_comments |
| Author | edit_posts, publish_posts |
| Contributor | edit_posts (اما نمیتواند منتشر کند) |
| Subscriber | read |
مثال عملی: نمایش یک گزینه فقط برای مدیران
add_action( 'admin_menu', 'my_plugin_menu' );
function my_plugin_menu() {
if ( current_user_can( 'manage_options' ) ) {
add_menu_page( 'My Plugin', 'My Plugin', 'manage_options', 'my-plugin', 'my_plugin_page' );
}
}در این مثال، منوی افزونه در داشبورد فقط زمانی اضافه میشود که کاربر قابلیت manage_options (معمولاً مدیر) را داشته باشد. این مانع از دیده شدن منو برای نقشهای دیگر میشود.
چک کردن قابلیت برای یک شیء مشخص (map_meta_cap)
برای چک کردن عملیات وابسته به یک آیتم خاص مثل ویرایش یک نوشته، بهتر است از قابلیتهایی مثل edit_post همراه با شناسه نوشته استفاده شود تا حقوق به صورت متا-کپ مدیریت شود.
$post_id = 123;
if ( current_user_can( 'edit_post', $post_id ) ) {
// allow edit this specific post
} else {
// deny access
}وردپرس با استفاده از فیلترهای متا-کپ (map_meta_cap) تصمیم میگیرد که آیا کاربر میتواند آن عملیات را روی شیء مشخص انجام دهد یا خیر (مثلاً بررسی مالکیت نوشته یا ویرایش دیگران).
مثال AJAX با بررسی capability و nonce
add_action( 'wp_ajax_my_action', 'my_action_callback' );
function my_action_callback() {
check_ajax_referer( 'my_nonce', 'security' );
if ( ! current_user_can( 'edit_posts' ) ) {
wp_send_json_error( 'Unauthorized' );
}
// process request
wp_send_json_success( array( 'message' => 'Done' ) );
}در این نمونه ابتدا nonce بررسی میشود و سپس با current_user_can دسترسی کاربر چک میشود. این دو مرحله ترکیبی از محافظت در برابر CSRF و کنترل دسترسی منطقی را فراهم میآورد.
نکات امنیتی و بهترین شیوهها
- هیچگاه به صرف پنهانسازی رابط کاربری اکتفا نکنید؛ همیشه عملیات حساس را در سرور هم بررسی کنید.
- برای عملیاتی که به یک آیتم وابستهاند از قابلیتهای متا (مثل edit_post) استفاده کنید تا بررسی مالکیت و نقشها درست انجام شود.
- در درخواستهای AJAX همیشه علاوه بر current_user_can از check_ajax_referer استفاده کنید.
- از فیلترها و هوکها برای تغییر یا افزودن قابلیتها استفاده کنید و از تغییر مستقیم در هسته وردپرس خودداری کنید.
مشکلات رایج و راهحلها
1. current_user_can همیشه false برمیگرداند
ممکن است تابع قبل از آنکه وردپرس کاربر را بارگذاری کند فراخوانی شود. این تابع باید بعد از مرحلهای اجرا شود که کاربر فعلی تنظیم شده است (مثلاً بعد از init یا درون هوکهای admin_init). اگر در زمان اجرا کاربر هنوز set نشده باشد، نتیجه نادرست خواهد بود.
2. تفاوت بین role و capability
تغییر روی نقشها کافی نیست؛ گاهی لازم است قابلیتهای خاص را به نقشها اضافه یا حذف کنید. برای مدیریت دقیقتر از توابعی مثل add_role و add_cap استفاده کنید.
3. وقتی capability سفارشی دارید
برای قابلیتهای سفارشی مطمئن شوید که آنها را به نقشهای مناسب اختصاص دادهاید و در map_meta_cap یا فیلترهای مربوطه چکهای لازم را اضافه کردهاید.
مثال پیشرفته: افزودن capability سفارشی و استفاده با current_user_can
function my_plugin_activate() {
$role = get_role( 'editor' );
if ( $role ) {
$role->add_cap( 'manage_special_feature' );
}
}
register_activation_hook( __FILE__, 'my_plugin_activate' );
if ( current_user_can( 'manage_special_feature' ) ) {
// show or allow access to special feature
}در این کد هنگام فعالسازی افزونه قابلیت manage_special_feature به نقش Editor افزوده میشود. سپس با current_user_can تعیین میکنیم چه کسانی به این ویژگی دسترسی داشته باشند.
خلاصه و جمعبندی
تابع current_user_can() ابزار مرکزی برای کنترل دسترسی در وردپرس است. استفاده صحیح از آن همراه با بررسیهای جانبی مثل nonce و map_meta_cap امنیت برنامه را افزایش میدهد. همواره کنترلهای سمت سرور را فراموش نکنید و عملیات حساس را فقط با اعتماد به دادههای سمت کاربر انجام ندهید.
آیا این مطلب برای شما مفید بود ؟




