Việc thiếu vai trò đối tác đã khiến tôi bực bội trong một thời gian dài vì lớp WP_User bên dưới hỗ trợ nhiều vai trò. Tôi thậm chí đã cân nhắc tìm kiếm một giải pháp phần mềm thay thế. @lpryor - Sau khi đọc bài viết của bạn, tôi đã có động lực để tự mình thực hiện nó.
Phải mất một số dòng ngắn đáng ngạc nhiên để làm mặc dù tôi đã phải hack tệp users.php vì tôi quá lười để tạo một plugin riêng để làm điều đó cho tôi. Rõ ràng đây là cách làm sai vì vậy nếu tôi có đủ động lực trong tương lai, tôi có thể cố gắng làm đúng.
Nếu bạn không quan tâm đến việc có thể nâng cấp lên phiên bản Wordpress mới nhất (mà bạn nên) - bạn có thể thực hiện nhiều vai trò với đoạn mã bên dưới. Xin lưu ý rằng tôi không phải là một chuyên gia về wordpress. Tôi chỉ mở các tệp có liên quan và thực hiện các thay đổi mà không cố gắng hiểu đầy đủ ý nghĩa của việc tôi đang làm. Mã có vẻ hợp lý với tôi nhưng tôi sẽ không tin vào cuộc sống của mình.
(Tôi đang sử dụng 3.2 để số dòng của bạn có thể thay đổi) Trong class-wp-users-list-table.php ngay trước dòng 150 thêm một số như sau:
<div class="alignleft actions">
<label class="screen-reader-text" for="remove_role"><?php _e( 'Remove role …' ) ?></label>
<select name="remove_role" id="remove_role">
<option value=''><?php _e( 'Remove role …' ) ?></option>
<?php wp_dropdown_roles(); ?>
</select>
<?php submit_button( __( 'Remove' ), 'secondary', 'changeit', false ); ?>
</div>
sau đó thay đổi hàm current_account để trông giống như thế này
function current_action() {
if ( isset($_REQUEST['changeit']) ) {
if ( !empty($_REQUEST['new_role']) )
return 'promote';
elseif ( !empty($_REQUEST['remove_role']) )
return 'remove_role';
}
return parent::current_action();
}
Bây giờ trong users.php Nhận xét các dòng 71-76
/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
$update = 'err_admin_role';
continue;
}
*/
Thay thế set_role trong dòng 83 bằng add_role
$user->add_role($_REQUEST['new_role']);
Tại dòng 92, hãy thêm vào phần sau (Đây chỉ là một bản sao và dán được chỉnh sửa nhẹ từ hành động quảng cáo - Tôi chưa kiểm tra để đảm bảo rằng khả năng của Promotion_user phù hợp để xóa vai trò)
case 'remove_role':
check_admin_referer('bulk-users');
if ( ! current_user_can( 'promote_users' ) )
wp_die( __( 'You can’t edit that user.' ) );
if ( empty($_REQUEST['users']) ) {
wp_redirect($redirect);
exit();
}
$editable_roles = get_editable_roles();
if ( empty( $editable_roles[$_REQUEST['remove_role']] ) )
wp_die(__('You can’t remove that role'));
$userids = $_REQUEST['users'];
$update = 'remove_role';
foreach ( $userids as $id ) {
$id = (int) $id;
if ( ! current_user_can('promote_user', $id) )
wp_die(__('You can’t edit that user.'));
// The new role of the current user must also have promote_users caps
// Need to think this through
/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
$update = 'err_admin_role';
continue;
}
*/
// If the user doesn't already belong to the blog, bail.
if ( is_multisite() && !is_user_member_of_blog( $id ) )
wp_die(__('Cheatin’ uh?'));
$user = new WP_User($id);
$user->remove_role($_REQUEST['remove_role']);
}
wp_redirect(add_query_arg('update', $update, $redirect));
exit();
Tại dòng 370 thêm vào như sau
case 'remove_role':
$messages[] = '<div id="message" class="updated"><p>' . __('Removed role.') . '</p></div>';
break;