[wp-trac] [WordPress Trac] #23016: Allow plugins to manipulate WP_Roles ($wp_roles global) on construct
WordPress Trac
noreply at wordpress.org
Thu Dec 20 08:38:46 UTC 2012
#23016: Allow plugins to manipulate WP_Roles ($wp_roles global) on construct
-----------------------------+-----------------------------
Reporter: johnjamesjacoby | Type: defect (bug)
Status: new | Priority: normal
Milestone: 3.6 | Component: Role/Capability
Version: 3.5 | Severity: normal
Keywords: early 3.6-early |
-----------------------------+-----------------------------
The WP_Roles class is difficult to extend. There are no actions, filters,
or intercept points to allow plugins to target it. Because the $wp_roles
global can be created anytime (even doing_it_wrong on plugins_loaded)
there's no reliable way to modify any part of $wp_roles.
(The only place WP_Roles actually has any action at all is in the
set_role() method, which is the least useful function in the class since
it noops all user roles if a user has more than one.)
The specific use case I have is bbPress's dynamic roles.
bbPress is unable to add its dynamic roles to the $wp_roles global on
switch_to_blog(). Neither of WP_Roles's initialization methods have
actions to allow bbPress to add its roles on.
* switch_to_blog() calls $wp_roles->reinit()
* then wp_get_current_user()
* finally $current_user->for_blog()
At no point can bbPress reliably append its roles to $wp_roles->roles,
causing the current user to incorrectly be missing their bbPress role for
that site.
More over, the WP_Roles::reinit() method seems like a one-use stop-gap to
fix a specific problem, that ends up introducing other issues with trying
to extend it. If the use_db flag is set to false, it bails early, and
there's no way for plugins that don't use database roles to reinitialize
their roles correctly again.
The attached patch does two things:
* Removes the reinit() method completely, and instead re-instantiates the
$wp_roles global inside switch_to_blog(). WP_Roles::_init() is not a heavy
function, and the guts are basically identical between the two methods.
* Adds a byref action to WP_Roles::init() that allow plugins like bbPress
to add their dynamic roles anytime $wp_roles is created.
--
Ticket URL: <http://core.trac.wordpress.org/ticket/23016>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software
More information about the wp-trac
mailing list