Last active
June 15, 2025 21:43
-
-
Save avs-alexandra/cb911a394473913757ccf180ef4f15da to your computer and use it in GitHub Desktop.
Wordpress multiple roles
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Добавим мультивыбор ролей пользователя. | |
Добавим папку multi-role-selector в папке /public_html/wp-content/plugins | |
Создадим файл multi-role-selector.php | |
<?php | |
/* | |
Plugin Name: Выбор ролей | |
Description: Позволяет назначать несколько ролей одному пользователю. | |
Version: 1.0 | |
Author: avs-alexandra | |
*/ | |
function mrpu_plugin_init() | |
{ | |
load_plugin_textdomain('multiple-roles-per-user', false, dirname(plugin_basename(__FILE__)) . '/languages/'); | |
} | |
add_action('plugins_loaded', 'mrpu_plugin_init'); | |
function mrpu_admin_enqueue_scripts($handle) | |
{ | |
if ('user-edit.php' == $handle) { | |
// We need jQuery to move things around :) | |
wp_enqueue_script('jquery'); | |
} | |
} | |
add_action('admin_enqueue_scripts', 'mrpu_admin_enqueue_scripts', 10); | |
/** | |
* Adds the GUI for selecting multiple roles per user | |
*/ | |
function mrpu_add_multiple_roles_ui($user) | |
{ | |
// Not allowed to edit user - bail | |
if (!current_user_can('edit_user', $user->ID)) { | |
return; | |
} | |
$current_action = current_action(); | |
$current_screen = get_current_screen(); | |
$roles = get_editable_roles(); | |
//Ensure only admins or users with edit_users role can assign roles | |
$user_can_edit_users = current_user_can('edit_users'); | |
$user_roles = array_intersect(array_values($user->roles), array_keys($roles)); | |
if ($user_can_edit_users) : | |
?> | |
<div class="mrpu-roles-container"> | |
<h3><?php _e('User Roles', 'multiple-roles-per-user'); ?></h3> | |
<table class="form-table"> | |
<tr> | |
<th><label for="user_credits"><?php _e('Roles', 'multiple-roles-per-user'); ?></label></th> | |
<td> | |
<?php foreach ($roles as $role_id => $role_data) : ?> | |
<label for="user_role_<?php echo esc_attr($role_id); ?>"> | |
<input type="checkbox" id="user_role_<?php echo esc_attr($role_id); ?>" value="<?php echo esc_attr($role_id); ?>" name="mrpu_user_roles[]" <?php echo in_array($role_id, $user_roles) ? ' checked="checked"' : ''; ?> /> | |
<?php echo $role_data['name']; ?> | |
</label> | |
<br /> | |
<?php endforeach; ?> | |
<br /> | |
<?php wp_nonce_field('mrpu_set_roles', '_mrpu_roles_nonce'); ?> | |
</td> | |
</tr> | |
</table> | |
</div> | |
<?php endif; ?> | |
<?php if ('profile' !== $current_screen->id) : ?> | |
<?php | |
// Do some hacking around to hide the built-in user roles selector | |
// First hide it with CSS and then get rid of it with jQuery | |
?> | |
<style> | |
label[for="role"], | |
select#role { | |
display: none; | |
} | |
</style> | |
<script type="text/javascript"> | |
(function($) { | |
$(document).ready(function() { | |
var row = $('select#role').closest('tr'); | |
var clone = row.clone(); | |
// clone.insertAfter( $('select#role').closest('tr') ); | |
row.html($('.mrpu-roles-container tr').html()); | |
$('.mrpu-roles-container').remove(); | |
}) | |
})(jQuery) | |
</script> | |
<?php endif; ?> | |
<?php } | |
add_action('edit_user_profile', 'mrpu_add_multiple_roles_ui', 0); | |
//When editing your own profile | |
add_action('show_user_profile', 'mrpu_add_multiple_roles_ui', 0); | |
/** | |
* Saves the selected roles for the user | |
*/ | |
function mrpu_save_multiple_user_roles($user_id) | |
{ | |
// Not allowed to edit user - bail | |
if (!current_user_can('edit_user', $user_id) || !wp_verify_nonce($_POST['_mrpu_roles_nonce'], 'mrpu_set_roles')) { | |
return; | |
} | |
$user = new WP_User($user_id); | |
$roles = get_editable_roles(); | |
$new_roles = isset($_POST['mrpu_user_roles']) ? (array) $_POST['mrpu_user_roles'] : array(); | |
// Get rid of any bogus roles | |
$new_roles = array_intersect($new_roles, array_keys($roles)); | |
$roles_to_remove = array(); | |
$user_roles = array_intersect(array_values($user->roles), array_keys($roles)); | |
if (!$new_roles) { | |
// If there are no roles, delete all of the user's roles | |
$roles_to_remove = $user_roles; | |
} else { | |
$roles_to_remove = array_diff($user_roles, $new_roles); | |
} | |
foreach ($roles_to_remove as $_role) { | |
$user->remove_role($_role); | |
} | |
if ($new_roles) { | |
// Make sure that we don't call $user->add_role() any more than it's necessary | |
$_new_roles = array_diff($new_roles, array_intersect(array_values($user->roles), array_keys($roles))); | |
foreach ($_new_roles as $_role) { | |
$user->add_role($_role); | |
} | |
} | |
} | |
add_action('edit_user_profile_update', 'mrpu_save_multiple_user_roles'); | |
//Own profile update hook | |
add_action('personal_options_update', 'mrpu_save_multiple_user_roles'); | |
/** | |
* Gets rid of the "Role" column and adds-in the "Roles" column | |
*/ | |
function mrpu_add_roles_column($columns) | |
{ | |
$old_posts = isset($columns['posts']) ? $columns['posts'] : false; | |
unset($columns['role'], $columns['posts']); | |
$columns['mrpu_roles'] = __('Roles', 'multiple-roles-per-user'); | |
if ($old_posts) { | |
$columns['posts'] = $old_posts; | |
} | |
return $columns; | |
} | |
add_filter('manage_users_columns', 'mrpu_add_roles_column'); | |
/** | |
* Displays the roles for a user | |
*/ | |
function mrpu_display_user_roles($value, $column_name, $user_id) | |
{ | |
static $roles; | |
if (!isset($roles)) { | |
$roles = get_editable_roles(); | |
} | |
if ('mrpu_roles' == $column_name) { | |
$user = new WP_User($user_id); | |
$user_roles = array(); | |
$_user_roles = array_intersect(array_values($user->roles), array_keys($roles)); | |
foreach ($_user_roles as $role_id) { | |
$user_roles[] = $roles[$role_id]['name']; | |
} | |
return implode(', ', $user_roles); | |
} | |
return $value; | |
} | |
add_filter('manage_users_custom_column', 'mrpu_display_user_roles', 10, 3); |
Author
avs-alexandra
commented
Apr 28, 2025

Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment