Last active
April 26, 2020 15:38
-
-
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
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
<?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