در سیستم مدیریت محتوای وردپرس هر کاربری که ایجاد می کنید باید یک نقش تعریف شده و مشخص(مدیر، نویسنده، مشارکت کننده و …) داشته باشد، هر چند که با افزونه قدرتمند Members می توانید به یک کاربر چندین نقش متفاوت اختصاص دهید.
در هر صورت ممکن است کاربرانی با نقش نویسنده(Author) یا مشارکت کننده(Contributor) داشته باشید که در تولید و انتشار محتوا کمک حال شما هستند، در چنین شرایطی هر کاربری می تواند در لیست همه نوشته ها موارد زیر را مشاهده کند:
- کلیه نوشته های وب سایت
- تعداد کل نوشته ها
- نوشته های منتشر شده
- نوشته های در حال بررسی
برای درک بهتر موضوع فرض کنید یک شرکت تولیدی ۲۰ واحد مختلف(روابط عمومی، فروش، قراردادها، بازاریابی و …) دارد که به ازای هر واحد یک کاربر با نقش مدنظر نیز ایجاد کرده است، حال شرکت فوق از شما می خواهد امکانی فراهم کنید تا هر واحد فقط به صفحات و نوشته های خود دسترسی داشته باشد.
در چنین شرایطی از چه مکانیزم و ترفندی استفاده می کنید؟ برای دریافت پاسخ با ما همراه باشید تا اینکار را به ساده ترین روش ممکن پیاده سازی کنیم.
ایجاد کاربر نویسنده
از آنجایی که در حال حاضر من تنها نویسنده مدیر دِو هستم یک کاربر فرضی به نام “مجید خدایی” با نقش نویسنده ایجاد می کنم، مجید اولین پست خود را منتشر کرده و لیست نوشته های وردپرس را به صورت زیر مشاهده می کند.
همانطور که ملاحظه می کنید او نوشته های من را می بیند اما نمی تواند آنها را تغییر دهد.
حالا کدهای زیر را در فایل functions.php قرار می دهیم.
function hide_posts_from_other_users( $query ) {
if ( is_admin()
&& $query->is_main_query()
&& get_current_screen()->id == 'edit-post'
&& !current_user_can( 'manage_options' ) ) {
$query->set( 'author', get_current_user_id() );
}
return $query;
}
add_action( 'pre_get_posts', 'hide_posts_from_other_users', 10, 1 );
این بار در لیست نوشته ها فقط پست های متعلق به مجید لود می شود، اما مقدار “همه” و “منتشر شده” همچنان مجموع پست ها را نشان می دهد.
برای اصلاح تعداد پست ها کدهای زیر را به functions.php اضافه می کنیم.
function change_post_count( $views ){
$currentUserID = get_current_user_id();
if ( get_current_screen()->id == 'edit-post'
&& $currentUserID !== 0
&& !current_user_can( 'manage_options' ) ) {
global $wpdb;
$results = $wpdb->get_results( "SELECT post_status,COUNT(*) count_p
FROM $wpdb->posts
WHERE post_type='post'
AND post_author=$currentUserID
GROUP BY post_status" );
$status_count = array();
foreach ( $results as $result ) {
$status_count[ $result->post_status ] = $result->count_p;
}
unset( $views['all'] );
unset( $views['mine'] );
foreach ( $views as $index => $view ) {
if ( array_key_exists( $index, $status_count ) ) {
$views[$index] = preg_replace( '/\(.+\)/U',
'(' . $status_count[$index] . ')', $views[$index] );
} else {
$views[$index] = preg_replace( '/\(.+\)/U',
'(' . ۰ . ')', $views[$index] );
}
}
}
return $views;
}
add_filter( 'views_edit-post', 'change_post_count', 10, 1 );
در نهایت خروجی کار بدین صورت خواهد بود.
جمع بندی
توجه داشته باشید کدهای بررسی شده فقط در پنل مدیریتی وردپرس آن هم در لیست نوشته ها اجرا خواهد شد و هیچگونه سربار اضافی به سایر بخش ها تحمیل نمی کند.
آغا عالی …دستتون درد نکنه …
خواهش میکنم دوست عزیز