การขาดบทบาท mutiple ทำให้ฉันหงุดหงิดเป็นเวลานานเนื่องจากคลาส WP_User ที่พื้นฐานรองรับหลายบทบาท ฉันพิจารณาแล้วว่ากำลังมองหาโซลูชันซอฟต์แวร์ทางเลือก @lpryor - หลังจากอ่านโพสต์ของคุณฉันได้รับแรงบันดาลใจในการนำมันมาใช้ใหม่
มันต้องใช้จำนวนบรรทัดที่สั้นอย่างน่าประหลาดใจแม้ว่าฉันจะต้องแฮกไฟล์ users.php เพราะฉันขี้เกียจเกินกว่าจะสร้างปลั๊กอินแยกต่างหากเพื่อทำมันให้ฉัน เห็นได้ชัดว่านี่เป็นวิธีที่ผิดในการทำเช่นนั้นหากฉันมีแรงจูงใจเพียงพอในอนาคตฉันอาจลองทำอย่างถูกต้อง
หากคุณไม่สนใจเกี่ยวกับความสามารถในการอัพเกรดเป็น Wordpress เวอร์ชันล่าสุด (ซึ่งคุณควร) - คุณสามารถใช้หลายบทบาทกับตัวอย่างโค้ดด้านล่าง โปรดจำไว้ว่าฉันไม่ใช่ผู้เชี่ยวชาญด้านเวิร์ดเพรส ฉันเพิ่งเปิดไฟล์ที่เกี่ยวข้องและทำการเปลี่ยนแปลงโดยไม่พยายามที่จะเข้าใจความหมายทั้งหมดของสิ่งที่ฉันทำ รหัสดูเหมือนสมเหตุสมผลกับฉัน แต่ฉันจะไม่ไว้ใจกับชีวิตของฉัน
(ฉันใช้ 3.2 ดังนั้นหมายเลขบรรทัดของคุณอาจแตกต่างกัน) ใน class-wp-users-list-table.php ก่อนบรรทัด 150 เพิ่มบางอย่างดังต่อไปนี้:
<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>
จากนั้นเปลี่ยนฟังก์ชั่น current_account เพื่อให้มีลักษณะเช่นนี้
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();
}
ตอนนี้ใน users.php แสดงความคิดเห็นออกสาย 71-76
/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
$update = 'err_admin_role';
continue;
}
*/
แทนที่ set_role ในบรรทัด 83 ด้วย add_role
$user->add_role($_REQUEST['new_role']);
ที่บรรทัด 92 เพิ่มรายการต่อไปนี้ (นี่เป็นเพียงแค่สำเนา & วางที่แก้ไขเบา ๆ จากการดำเนินการโปรโมต - ฉันยังไม่ได้ตรวจสอบเพื่อให้แน่ใจว่าความสามารถในการ Promot_user นั้นเหมาะสมสำหรับการลบบทบาท)
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();
ที่บรรทัด 370 เพิ่มดังต่อไปนี้
case 'remove_role':
$messages[] = '<div id="message" class="updated"><p>' . __('Removed role.') . '</p></div>';
break;