That seems a little odd. The error message indicates that the contents of there is a WP_Error where a string is expected.
There are two items in that array that could potentially be a WP_Error (and shouldn’t be). Both of them also rely on having the new user’s user ID (the WP db primary key ID for the newly created user).
You mentioned that no user is created. That would tend to indicate that the actual issue you’re having is well upstream from this and that this PHP error being thrown is the result of something else upstream that doesn’t actually result in halted execution, but does result in the user registration failing.
The reason I would suggest that is the validation key generation where this PHP error is thrown is hooked to WP’s “user_register” action. That action comes at the end of WP’s wp_insert_user() function where the new user is created.
There are a number of things that happen in that function between where the user is inserted in the db and where the action is fired, but ultimately, when the “user_register” action is triggered, there should be a user ID. The two elements in this WP-Members part of the process that could potentially contain a WP_Error expect the ID to be a valid user at this point. The fact we’re getting a WP_Error instead of the valid result indicates no user exists (like what you’ve noted), which would mean the insertion of the user failed for some reason.
Because we’re talking about a core WP function here, that means that failure could be related to WP, WP-Members, or any other plugin in the mix that also hooks into the registration process. Since you indicated this is random, that’s going to be hard to look for.
I can certainly update the plugin to better handle the possibility of a WP_Error object coming here where it’s not expected, but that’s not actually going to help your particular case because all it will tell you is that a WP_User object was expected and we didn’t get one.
My initial recommendation is to see if you can isolate the actual issue. You might start by looking at what data was used in registrations that failed and try to test to see if the issue is consistently reproduced. If it is, then disable all plugins except WP-Members and retest with the same data to see if the same result occurs.
One things to note (and maybe this should have been pointed out at the beginning, but I’m putting it here as an endnote anyway) is that you also mentioned using emails as usernames. If you are on multisite, then that’s not a possibility. I don’t think that’s the issue because then they all would fail AND WP-Members already has an error check for this. BUT… you might be in a similar instance where you’ve got something that hooks into the registration process that doesn’t like the data being passed for some reason (like an invalid character for whatever that process does) and that’s the reason for the registration failure.
I hope this all makes at least a little bit of sense. As noted above, the PHP fatal error you’re getting isn’t actually the problem – it’s a symptom of something that went wrong earlier in the process. Hopefully, I’ve given you something you can go on to test and see if you can figure out more precisely where that is happening.