Skip to content

Instantly share code, notes, and snippets.

@krasenslavov
Last active April 26, 2020 15:38
Show Gist options
  • Save krasenslavov/8a75512a5ae0f162409368fb9bede0fb to your computer and use it in GitHub Desktop.
Save krasenslavov/8a75512a5ae0f162409368fb9bede0fb to your computer and use it in GitHub Desktop.
Add and remove custom user roles without plugin. Visit blog post https://bit.ly/3boczPg
<?php
$msg = '';
// Remove custom user role and assign all users with this role to subscibres.
if (!empty($_GET)) {
if (!empty($_GET['del'])) {
$users = get_users(['role__in' => [esc_attr($_GET['del'])]]);
foreach($users as $user) {
wp_update_user([
'ID' => $user->ID,
'role' => 'subscriber'
]);
}
remove_role(esc_attr($_GET['del']));
$msg = "Custom user role removed!";
}
}
// Create new custom user role and assign selected caabilities.
if (!empty($_POST)) {
if (!empty($_POST['user-role-name'])
&& !empty($_POST['user-role-caps'])) {
$user_role = esc_html($_POST['user-role-name']);
foreach($_POST['user-role-caps'] as $idx => $val) {
$user_caps[$val] = true;
}
$result = add_role(
strtolower(str_replace(' ', '_', $user_role)),
$user_role,
$user_caps
);
if (null !== $result) {
$msg = "New <strong>{$result->name}</strong> user role created!";
}
else {
$msg = 'Custom user role already exists!';
}
}
}
// Add UX to the Settings page to create and delete custom user roles.
add_action('admin_init', function() use($msg) {
add_settings_field('manage_custom_user_roles',
'Custom User Roles',
function() use($msg) {
global $wp_roles;
// Load FA and customize the multiple select dropdown with checkboxes.
wp_enqueue_style('fontawesome-4.7', 'https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css', null, false, 'all');
wp_add_inline_style('fontawesome-4.7', '
.select-checkbox option:not([value=""])::before {
content: "\2610";
width: 1.5rem;
text-align: center;
display: inline-block;
height: 1.5rem;
}
.select-checkbox option:not([value=""]):checked::before {
content: "\2611";
}
.select-checkbox-fa option:not([value=""])::before {
font-family: FontAwesome;
content: "\f096";
width: 1.5rem;
padding: .5rem 0;
display: inline-block;
margin-left: 2px;
}
.select-checkbox-fa option:not([value=""]):checked::before {
content: "\f046";
}');
?>
<div class="roles">
<!-- UX section to remove/delete user role -->
<?php foreach($wp_roles->roles as $role => $attrs) :?>
<?php if (!in_array($role, ['administrator','editor','author','contributor','subscriber'])): ?>
<p><?php echo $attrs['name'];?> <a href="?del=<?php echo $role;?>">[x]</a></p><br />
<?php endif; ?>
<?php endforeach;?>
<!-- Output message -->
<p>
<strong><?php echo $msg;?></strong>
</p>
<!-- UX section to craete new user role -->
<p>
<input type="text" name="user-role-name" id="user-role-name" size="40" required />
</p>
<br />
<select class="form-control select-checkbox-fa" multiple size="25" name="user-role-caps[]" requierd>
<option value="export">export</option>
<option value="import">import</option>
<option value="read">read</option>
<option value="">-----------------------------------------</option>
<option value="delete_others_posts">delete_others_posts</option>
<option value="delete_posts">delete_posts</option>
<option value="delete_private_posts">delete_private_posts</option>
<option value="delete_published_posts">delete_published_posts</option>
<option value="edit_others_posts">edit_others_posts</option>
<option value="edit_posts">edit_posts</option>
<option value="edit_posts_role_permissions">edit_posts_role_permissions</option>
<option value="edit_private_posts">edit_private_posts</option>
<option value="edit_published_posts">edit_published_posts</option>
<option value="publish_posts">publish_posts</option>
<option value="read_private_posts">read_private_posts</option>
<option value="">-----------------------------------------</option>
<option value="delete_others_pages">delete_others_pages</option>
<option value="delete_pages">delete_pages</option>
<option value="delete_private_pages">delete_private_pages</option>
<option value="delete_published_pages">delete_published_pages</option>
<option value="edit_others_pages">edit_others_pages</option>
<option value="edit_pages">edit_pages</option>
<option value="edit_pages_role_permissions">edit_pages_role_permissions</option>
<option value="edit_private_pages">edit_private_pages</option>
<option value="edit_published_pages">edit_published_pages</option>
<option value="publish_pages">publish_pages</option>
<option value="read_private_pages">read_private_pages</option>
<option value="">-----------------------------------------</option>
<option value="delete_themes">delete_themes</option>
<option value="edit_theme_options">edit_theme_options</option>
<option value="edit_themes">edit_themes</option>
<option value="install_themes">install_themes</option>
<option value="switch_themes">switch_themes</option>
<option value="update_themes">update_themes</option>
<option value="activate_plugins">activate_plugins</option>
<option value="delete_plugins">delete_plugins</option>
<option value="edit_plugins">edit_plugins</option>
<option value="install_plugins">install_plugins</option>
<option value="update_plugins">update_plugins</option>
<option value="">-----------------------------------------</option>
<option value="create_users">create_users</option>
<option value="delete_users">delete_users</option>
<option value="delete_users_higher_level">delete_users_higher_level</option>
<option value="edit_users">edit_users</option>
<option value="edit_users_higher_level">edit_users_higher_level</option>
<option value="list_users">list_users</option>
<option value="promote_users">promote_users</option>
<option value="promote_users_higher_level">promote_users_higher_leve</option>
<option value="promote_users_to_higher_level">promote_users_to_higher_level</option>
<option value="remove_users">remove_users</option>
<option value="">-----------------------------------------</option>
<option value="bulk_edit_roles">bulk_edit_roles</option>
<option value="create_roles">create_roles</option>
<option value="delete_roles">delete_roles</option>
<option value="edit_role_menus">edit_role_menus</option>
<option value="edit_roles">edit_roles</option>
<option value="list_roles">list_roles</option>
<option value="">-----------------------------------------</option>
<option value="level_0">level_0</option>
<option value="level_1">level_1</option>
<option value="level_10">level_10</option>
<option value="level_2">level_2</option>
<option value="level_3">level_3</option>
<option value="level_4">level_4</option>
<option value="level_5">level_5</option>
<option value="level_6">level_6</option>
<option value="level_7">level_7</option>
<option value="level_8">level_8</option>
<option value="level_9">level_9</option>
<option value="">-----------------------------------------</option>
<option value="delete_attachments">delete_attachments</option>
<option value="delete_content_shortcodes">delete_content_shortcodes</option>
<option value="delete_login_redirects">delete_login_redirects</option>
<option value="delete_others_attachments">delete_others_attachments</option>
<option value="read_others_attachments">read_others_attachments</option>
<option value="">-----------------------------------------</option>
<option value="edit_attachments">edit_attachments</option>
<option value="edit_content_shortcodes">edit_content_shortcodes</option>
<option value="edit_dashboard">edit_dashboard</option>
<option value="edit_files">edit_files</option>
<option value="edit_login_redirects">edit_login_redirects</option>
<option value="edit_nav_menu_permissions">edit_nav_menu_permissions</option>
<option value="edit_others_attachments">edit_others_attachments</option>
<option value="edit_widget_permissions">edit_widget_permissions</option>
<option value="">-----------------------------------------</option>
<option value="manage_capabilities">manage capabilities</option>
<option value="manage_categories">manage_categories</option>
<option value="manage_links">manage_links</option>
<option value="manage_options">manage_options</option>
<option value="">-----------------------------------------</option>
<option value="moderate_comments">moderate_comments</option>
<option value="unfiltered_upload">unfiltered_upload</option>
<option value="update_core">update_core</option>
<option value="upload_files">upload_files</option>
</select>
</div>
<script>
// Allow to have multiple selects without the need of CMD or CTRL keys.
(function($) {
$('select.form-control option').mousedown(function(event) {
event.preventDefault();
$(this).prop('selected', !$(this).prop('selected'));
return false;
});
})(jQuery);
</script>
<?php
},
'general',
'default',
array('label_for' => 'manage_custom_user_roles')
);
}, 10, 1);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment