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

Php 通过URL[WordPress]更改用户角色,php,wordpress,Php,Wordpress,我正在创建一个插件,它会将所有新用户注册为role=unverified,并在电子邮件验证之前停止用户登录。我想在他们的电子邮件上发送url,这会将当前未验证的角色更改为作者。我知道如何在WordPress中发送电子邮件等,但不知道如何创建url来改变角色。我使用自定义ajax表单登录、注册和丢失密码,因为我无法使用pie register和register plus redux插件 现行代码 function add_roles_on_plugin_activation() { add

我正在创建一个插件,它会将所有新用户注册为role=unverified,并在电子邮件验证之前停止用户登录。我想在他们的电子邮件上发送url,这会将当前未验证的角色更改为作者。我知道如何在WordPress中发送电子邮件等,但不知道如何创建url来改变角色。我使用自定义ajax表单登录、注册和丢失密码,因为我无法使用pie register和register plus 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');
函数在插件激活()上添加角色{
添加_角色('custom_role','Unverified',数组('read'=>true,'level_0'=>true));
}
注册激活挂钩(文件“在插件激活上添加角色”);
函数删除插件上的角色停用(){
删除_角色(“自定义_角色”);
}
注册停用挂钩('u文件'u'删除插件停用上的'u角色');
添加过滤器('pre\u option\u default\u role',函数($default\u role){
返回“自定义_角色”;
返回$default\u角色;
});
功能错误\u电子邮件\u验证(){
$user=wp_get_current_user();
if(在_数组('custom_role',(数组)$user->roles)中){
$logout_url=wp_login_url()。?模式=emailverify';
wp_注销();
wp_重定向($logout_url);
退出();
}     
}
添加操作(“已加载工作包”、“错误”电子邮件“验证”);
函数my_login_message(){
如果($\u GET['mode']=='emailverify'){
$message='

验证您的电子邮件。

'; 返回$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');

谢谢,这很有效。此外,您还可以使用
set_role()
方法,它基本上删除然后添加一个新角色。