Is this the plugin you’re using? Since it’s a Premium plugin I can’t download its code to test things on my end. Would you mind searching in that plugin folder for all mentions of the set_user_role action?https://codex.wordpress.org/Plugin_API/Action_Reference/set_user_role
You’ll most likely find lines that look like this:
add_action( 'set_user_role', 'XXXXX'
Where XXXXX is a specific function name. Could you then copy both the line that starts with add_action, and the whole XXXXX function that you should find later in that same file, like so:
function XXXXX(
...
}
Thanks!
Hi Jeremy, thanks for getting back to me. Firstly I have fixed the issue for now by rolling back to version 4.3.1 of Jetpack. Also I noticed that the ‘test connection’ feature of Jetpack found failures under 4.3.2, but these disappeared under 4.3.1.
To answer your specific question, yes that is the correct plugin. I only found one (non comment) line referencing ‘set_user_role’ within the plugin
function update_wp_user_Role($wp_user_id, $role) {
..
..
do_action('set_user_role', $wp_user_id, $role); //Fire the action for other plugin(s)
There are no ‘add_action()’ lines in the plugin for ‘set_user_role’.
Let me know if you need anything else.
Cheers
do_action('set_user_role', $wp_user_id, $role);
That’s most likely what’s causing the issue. This action, as defined by WordPress Core itself, accepts 3 different arguments:
https://github.com/WordPress/WordPress/blob/4.6.1/wp-includes/class-wp-user.php#L584-L594
The last argument, $old_roles, was added to WordPress in WordPress 3.6.0. Unfortunately, it seems WP-eMember wasn’t updated to take that third argument into account. As a result, all other plugins hooking into the set_user_role action will throw an error as long as WP-eMember is active.
To solve this issue, WP-eMember would have to add a third argument, to allow other plugins to use it.
Could you contact the WP-eMember team and ask them to take a look at the issue?
Let me know how it goes.
The ‘$old_roles’ parameter is marked as optional in the codex – https://codex.wordpress.org/Plugin_API/Action_Reference/set_user_role
which must be the case when extending an existing function for back-compatibility. However JetPack is linking in action function – maybe_clear_other_linked_admins_transient( $user_id, $role, $old_roles ) for set_user_role where $old_roles is NOT optional. (line 927 of class.jetpack.php) so breaking back-compatibility.
OK I can fix this for now and raise with the plugin writer as well – should be easy enough. You may want to add this plugin incompatibility to the Jetpack support docs.
Cheers
Just to verify I have fixed my copy of WP-eMember and added the $old_roles parameter. I now have no issues with JetPack 4.3.2.
Thanks for the help.
Cheers
Excellent, I’m glad to hear you could get this fixed!
We’ll also patch Jetpack in the next release; you can follow our progress on this here:
https://github.com/Automattic/jetpack/pull/5486
Good stuff. Turns out that the WP-eMember plugin does not need to invoke do_action('set user role'...) as it calls wp_update_user() to set the new role, and of course that already invokes the ‘set_user_role’ hook chain with all three parameters, as you pointed out earlier. I have already removed the call completely from my version of WP-eMember.
Cheers