Change user role via URL

I'm creating plugin which will register all new users as role = unverified and stop user from login until email verification. I want to send url on their email which will change the current unverified role to author. I know how to send email etc all of that in WordPress but can't figure out how to create url which will change the role. I'm using custom ajax form to login,register and lostpassword because of it i'm unable to use pie register and register-plus-redux plugins.

Current code

function add_roles_on_plugin_activation() {
    add_role( 'custom_role', 'Unverified', array( 'read' => true, 'level_0' => true ) );
register_activation_hook( __FILE__, 'add_roles_on_plugin_activation' ); 

function remove_roles_on_plugin_deactivation() {
    remove_role( 'custom_role' );
register_deactivation_hook( __FILE__, 'remove_roles_on_plugin_deactivation' ); 

add_filter('pre_option_default_role', function($default_role){
    return 'custom_role'; 
    return $default_role; 

function error_email_verify() {
$user = wp_get_current_user();
if ( in_array( 'custom_role', (array) $user->roles ) ) {

       $logout_url = wp_login_url().'?mode=emailverify';
       wp_redirect( $logout_url );
add_action('wp_loaded', 'error_email_verify');

function my_login_message() {

    if( $_GET['mode'] == 'emailverify' ){
        $message = '<p id="login_error"><b>Verify your email.</b></p>';
        return $message;

add_filter('login_message', 'my_login_message');


Here is what I would do. Basically I would generate a link that would have parameters attached to it something like this:

Generate Link

$username = 'user_login';
$hashcode = sha1(md5(md5("hacaak".$username."aalog")));
$link = get_home_url().'/?a='.$hashcode.'&b='.$hashcode.'&u='.$username.'&c='.$hashcode.'';

Output of link [][1] When the user clicks on this link in the email you just sent them use this method to catch the GET parameter coming into the site:

function to get the variables from url

function catch_email(){
        $username = sanitize_user($_GET['u']);
        $user=get_user_by( 'login', $username );
        $user_id = $user->ID;
        $user_role = new WP_User($user_id);
        $user_role->remove_role( 'unverified' );
        $user_role->add_role( 'author' );
        $url = get_home_url().'/Login?mode=emailverify';

add_action('get_header', 'catch_email');

Need Your Help

failure deploying LocalDB app to Arvixe

c# iis deployment connection-string localdb

I'm trying to deploy a WCF Data Service to Arvixe. The data service is built on Entity Framework 5 and Data Services 5.4. It creates a fair number of LocalDB databases (named according to runtime i...

JSR-308 extension of JSR-305?

java annotations

Eclipse's null analysis now supports JSR-308, i.e. you can now put @Nonull, etc. on generic type parameters.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.