Make Integrating Multiple Roles Per User Easier for Plugin Authors
|Reported by:||mobius5150||Owned by:|
|Component:||Role/Capability||Keywords:||has-patch 2nd-opinion commit|
WordPress supports multiple role per user, however to use this feature is very difficult for plugin authors to integrate well, and often requires adding plugin admin pages instead of integrating with the pre-existing user-edit.php. Due to the difficulty of this, and the fact that most plugins that allow this aren't very user-friendly, I believe users are staying away from multiple roles.
This ticket aims to change how easy it is to work with the current role management system, as well as to add a couple role-based filters and actions, while still keeping the front-end of the administrative interface single-role only. (Because it seems to be the prevailing opinion the multiple roles per user is plugin territory.) In addition, I completely agree that the vast majority of sites can best function with one role per user, however in some cases (such as the site I'm working on now) you simply need to be able to choose multiple roles.
First Patch File
The first patch file moves the code for the role dropdown off of /wp-admin/user-edit.php, /wp-admin/includesclass-wp-users-list-table.php, /wp-admin/users-new.php, /wp-admin/options-general.php and into /wp-admin/includes/template.php where two new functions are created:
This function does what wp_dropdown_roles used to do, but it returns the value instead of echoing it. (Note that wp_dropdown_roles() now acts as a wrapper for wp_get_dropdown_roles(). (The old function is still in place for backwards compatibility.)
This function creates the full dropdown and applies a new 'user_role_selector' filter to the markup before echoing it out. This way the default dropdown can be overridden by something else (perhaps checkboxes).
Second Patch File
The second patch file changes the functions that handle user creation and updating so they can be hooked into and a developer could make this work with multiple roles. This file affects /wp-admin/includes/users.php and /wp-includes/user.php.
A new sanitize_user_role filter was created and sanitation of $_POST['role'] in /wp-admin/includes/user.php when user-edit.php is submitted was moved there. The new function is called wp_sanitize_user_role(). (This is so that if user-edit.php is submitted and $_POST['role'] were to contain a value other than a string (perhaps an array of roles) it can be sanitized and worked with accordingly.
A new pre_user_role filter was added to wp_insert_user() in /wp-includes/user.php. This was mainly done because almost every other field that this function processes has a matching filter like this, and I thought maybe $roles felt left out as it did not. :(
I supposed somebody could also use it for something useful as well.
A new apply_user_role action was added to wp_insert_user(). The function itself no longer uses $user->set_role(), instead saving user role changes is now handled by this new action. A matching function wp_apply_user_role() was added to set the user role like wp_insert_user() used to do. This way however, a plugin author could simply hook into apply_user_role to apply multiple roles to a user.
All in all, this patch was designed so that the average user would never even notice that a change has been made to user management, however a plugin author looking to add an easy way for people to select multiple roles for a user can quickly hook into this and have a nice, easy, well integrated and WordPress-like plugin.
I have done a few tests adding users and changing roles around with these patches applied on a fresh installation with no plugins and the only changes to WordPress being those that are in the attached patches, and everything seems to work seamlessly.
By the way, I am quite new to WordPress, so I added the needs-testing tag, because it does, but I also want to make sure I've done everything the 'WordPress' way and I want to make sure I havn't missed anything that is broken because of these small changes.
Change History (53)
comment:26 @rahul286 — 3 years ago
- Cc rahul286@… added
comment:41 follow-up: ↓ 42 @nikolov.tmw — 21 months ago
- Cc ico.the.star.dust@… added
comment:42 in reply to: ↑ 41 ; follow-up: ↓ 43 @landwire — 18 months ago
- Keywords 2nd-opinion added
- Milestone changed from Future Release to Awaiting Review
- Severity changed from normal to major
- Type changed from enhancement to defect (bug)
- Version changed from 3.2 to 2.0
comment:45 follow-up: ↓ 46 @jorbin — 3 months ago
- Keywords commit added
- Type changed from defect (bug) to enhancement