WordPress.org

Make WordPress Core

Opened 2 years ago

Last modified 4 weeks ago

#17924 new enhancement

Make Integrating Multiple Roles Per User Easier for Plugin Authors

Reported by: mobius5150 Owned by:
Priority: normal Milestone: Future Release
Component: Role/Capability Version: 3.2
Severity: normal Keywords: has-patch
Cc: Mobius5150, anointed, dragunoff, NateJacobs, pauli.price@…, deltafactory, sascha@…, knut@…, danielrolls, dcowgill@…, rahul286@…, etvoilaletravail, johnjamesjacoby, hello@…, dromsey@…, gare_c

Description

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.

Changes

First Patch File

attachment:Replace_Admin_Role_Dropdown.patch
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:

wp_get_dropdown_roles()

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.)

wp_user_role_selector()

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

attachment:Create_Role_Update_Actions_Filters.patch
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.

wp_sanitize_user_role()

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.

pre_user_role

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.

apply_user_role

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.

Conclusion

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.

Attachments (6)

Replace_Admin_Role_Dropdown.patch (9.3 KB) - added by mobius5150 2 years ago.
The first patch.
Create_Role_Update_Actions_Filters.patch (5.0 KB) - added by mobius5150 2 years ago.
The second patch.
Create_Role_Update_Actions_Filters_3.2.1.patch (4.8 KB) - added by mobius5150 2 years ago.
The second patch.
Replace_Admin_Role_Dropdown_3.2.1.patch (9.3 KB) - added by mobius5150 2 years ago.
The first patch.
wp-3.3.2-multi-role-diff.patch (3.7 KB) - added by mobius5150 13 months ago.
A single patch file for WP 3.3.2
wp-3.6-alpha-multi-role-diff.patch (13.2 KB) - added by mobius5150 6 months ago.
A patch prepared against trunk of WP 3.6-alpha

Download all attachments as: .zip

Change History (44)

comment:1 follow-up: scribu2 years ago

Related: #10201

comment:2 anointed2 years ago

  • Cc anointed added

comment:3 in reply to: ↑ 1 mobius51502 years ago

I updated the second diff so that the users list table on /wp-admin/users.php now uses a user_role_name filter to list the roles of the user. In addition, if the $role variable that $WP_Users_List_Table->single_row() is left empty, it will load an array of roles from the $user_object passed to it.

Again, this has not been updated to actually use multiple roles, it simply provides of means for plugin authors to work with this table.

Replying to scribu:

Related: #10201

Yes, the comment here by Jeremy Clarke presented good points and is what initially got me thinking about this. I just felt that the initial direction of that ticket was pretty different than what I had in mind.

comment:4 mobius51502 years ago

Updated the filter in the first patch to pass the args of the wp_user_role_selector() function to the filter.

mobius51502 years ago

The first patch.

mobius51502 years ago

The second patch.

comment:5 mobius51502 years ago

I've uploaded a new copy of each patch with 3.2.1 in the file name -- these have been modified to work with the new release of 3.2.1

Really hoping this will gain some traction, I'd really like to see this ability in WordPress, and I have several projects that would highly benefit from this.

mobius51502 years ago

The second patch.

mobius51502 years ago

The first patch.

comment:6 nacin22 months ago

I could get behind this.

comment:7 lpryor22 months ago

This would be really useful. I'd love to have multiple roles per user.

I'd use it to define a number of roles, each with a separate group of capabilities: for example, one around creating and managing blog posts, one around each type of custom post, one for moderating forums (I'm using buddypress) and so on. And then a user could be a blog manager, a forums moderator, or both. At the moment you have to define a separate role for each possible combination of responsibilities.

comment:8 dragunoff21 months ago

  • Cc dragunoff added

comment:9 NateJacobs21 months ago

  • Cc NateJacobs added

comment:10 marfarma20 months ago

  • Cc pauli.price@… added

comment:11 deltafactory19 months ago

  • Cc deltafactory added

comment:12 landwire18 months ago

  • Cc sascha@… added

comment:13 mobius515016 months ago

  • Keywords dev-feedback needs-testing removed

Hi Everyone,

Sorry I have not had time to generate a diff patch for this as things have been changing on my end.

I have however updated the code to work with the latest version of WordPress at the time of writing. It is available on my blog at: http://michaelblouin.ca/2011/multiple-roles-per-user-in-wordpress

Just scroll to the bottom of the article and follow the instructions to install both the modified version of WP and te plugin and you'll have multiple roles per user.

In the meantime if anyone would be willing to petition anyone higher up on the commit chain to support our cause it would be highly appreciated.

If we can get more support I would release the neccesary diff to apply this to the latest WP version

Best regards,
Michael Blouin (Mobius5150)

comment:14 follow-up: greenshady15 months ago

Just wanted to chime in here to say that multiple roles per user is one of the most-requested features for my Members plugin. I'm definitely on board with testing this and trying to get it into 3.5.

comment:15 in reply to: ↑ 14 mobius515014 months ago

Replying to greenshady:

Just wanted to chime in here to say that multiple roles per user is one of the most-requested features for my Members plugin. I'm definitely on board with testing this and trying to get it into 3.5.

This is great news. I'm just entering exam weeks here, so it will be a little while before I resurface, but expect me to be fully back at it with this by (very) early may at the latest to make a push for 3.5.

comment:16 knutsp14 months ago

  • Cc knut@… added

comment:17 ruthik14 months ago

Definitely added.

comment:18 equalserving14 months ago

I too am willing to test this as it is a feature that is most often requested by my clients.

comment:19 mobius515013 months ago

Hello all.

I've created a new patch for 3.3.2 -- although I've gotten lazy and I no longer split it into 2 patch files (which I don't know why I did anyways).

I know, its kindof a funny time in the WP development cycle to release a patch for 3.3.2, with 3.4 coming soon, but I assure you that the 3.4 patch won't be long after 3.4 is released.

Let me know if you have any issues with this patch.

mobius515013 months ago

A single patch file for WP 3.3.2

comment:20 follow-up: mobius515013 months ago

I forgot to mention -- as always, a pre-diffed and ready-to-go copy of WordPress is available for your enjoyment here: http://michaelblouin.ca/2011/multiple-roles-per-user-in-wordpress

(For those of you that are currently using this on your sites)

comment:21 in reply to: ↑ 20 ; follow-up: nacin13 months ago

Replying to mobius5150:

(For those of you that are currently using this on your sites)

You should try to implement this as a plugin using the hooks available rather than as a core hack. In general, if you are going to submit a temporary hack, you should only distribute it as a patch file. Then, ideally, only those knowledgeable enough to realize what they are doing will go forward with it.

As a matter of creating patches, please post a single patch with all changes, and make that patch against "trunk", which is currently 3.4-RC1 but is always a moving target.

And in terms of getting it into a future release, I'd have to take a closer look at the approach, but I definitely like the general direction.

comment:22 in reply to: ↑ 21 mobius515013 months ago

Replying to nacin:

You should try to implement this as a plugin using the hooks available rather than as a core hack. In general, if you are going to submit a temporary hack, you should only distribute it as a patch file. Then, ideally, only those knowledgeable enough to realize what they are doing will go forward with it.

The reason for this patch is that short of output buffering the WP admin pages and doing a search and replace on the page html, there is no way of implementing this with only hooks. All the patch does is add the actions and filters necessary to extend this functionality, the rest is done with a plugin.

As a matter of creating patches, please post a single patch with all changes, and make that patch against "trunk", which is currently 3.4-RC1 but is always a moving target.

In my hurry to get this patched before I fell asleep at my keyboard, I actually didn't notice trunk was 3.4-RC1, and actually made the diff for that. Once 3.4 is officially release I'll update the patch file again.

And in terms of getting it into a future release, I'd have to take a closer look at the approach, but I definitely like the general direction.

Thanks for your feedback, I know a number of people would love more support for this.

comment:23 ruthik12 months ago

I'm on-board. I'm restricting site content on a per-role basis. One role can't access the same content another role has access to, but some users need to have both of those roles. Will download the patch files and start playing with it now :) Thanks for this!

comment:24 danielrolls11 months ago

  • Cc danielrolls added

comment:25 dcowgill10 months ago

  • Cc dcowgill@… added

comment:26 rahul28610 months ago

  • Cc rahul286@… added

Multiple Role will take care of way too many things! :-)

I am really delighted to see there is work in progress here.

Its quite intuitive as a user can be "subscriber" on blog, "moderator" in forum, "foo" in some plugin & "bar" in some other plugin!

With current way - a lot of capabilities manipulation need to be done to get things working... :|

Last edited 8 months ago by rahul286 (previous) (diff)

comment:27 etvoilaletravail8 months ago

  • Cc etvoilaletravail added

comment:28 anointed8 months ago

+++1 trying my best to show continued huge interest in this.

Hoping it just might sneak its way into 3.5 since it can't work as a standalone plugin.

comment:29 scribu8 months ago

I don't think this will make it into 3.5, since it hasn't been discussed at all during the first part of the release cycle and we're already in beta: http://make.wordpress.org/core/version-3-5-project-schedule/

comment:30 scribu8 months ago

Related: #22361

comment:31 johnjamesjacoby8 months ago

  • Cc johnjamesjacoby added

comment:32 follow-up: scribu6 months ago

  • Milestone changed from Awaiting Review to 3.6

comment:33 scribu6 months ago

Related: #22959

comment:34 in reply to: ↑ 32 mobius51506 months ago

Replying to scribu:
Thanks! I'm starting to get excited for this.

I've prepared a version patched against the current trunk (3.6-alpha). And am attaching it now. I also found a bug in the 3.3.2 patch -- so I hope that nobody ended up using or trying that.

The version I'm currently uploading has been tested against a freshly checked out WP (from trunk) and appears to work just fine, a second set of eyes may be beneficial if someone has the time, but not much has changed from previous patches.

mobius51506 months ago

A patch prepared against trunk of WP 3.6-alpha

comment:35 swissspidy6 months ago

  • Cc hello@… added

comment:36 goto106 months ago

  • Cc dromsey@… added

comment:37 ryan5 weeks ago

  • Milestone changed from 3.6 to Future Release

comment:38 gare_c4 weeks ago

  • Cc gare_c added
Note: See TracTickets for help on using tickets.