通过URL [WordPress]更改用户角色


Change user role via URL [WordPress]

我正在创建插件,将所有新用户注册为role =未经验证,并停止用户从登录直到电子邮件验证。我想在他们的电子邮件中发送url,这将更改当前未验证的角色为作者。我知道如何在WordPress中发送电子邮件等所有这些,但不知道如何创建将改变角色的url。我使用自定义ajax表单登录,注册和丢失密码,因为它我无法使用pie注册和注册+ redux插件。

当前代码

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_logout();
       wp_redirect( $logout_url );
       exit();
    }     
}
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');

我会这样做。基本上我会生成一个带有参数的链接像这样:

生成链接

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


链接输出

(http: yourwebsite.com/a = fe440709d341e7b4994636b12e556aa7f23bb9ce& b = fe440709d341e7b4994636b12e556aa7f23bb9ce& u = jack& c = fe440709d341e7b4994636b12e556aa7f23bb9ce] [1]

当用户点击你刚刚发送给他们的邮件中的链接时,使用这个方法来捕获进入站点的GET参数:

函数从url

获取变量
function catch_email(){
    if(isset($_GET['a']))
    {
        $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';
        wp_redirect($url);
    }
}
add_action('get_header', 'catch_email');