Php Wordpress登录部分有效

Php Wordpress登录部分有效,php,wordpress,wordpress-rest-api,Php,Wordpress,Wordpress Rest Api,我尝试在wordpress中登录用户,但它仅适用于在UI中注册的用户,而不适用于程序添加的用户。 登录是对Ajax登录请求的响应: //wp_clear_auth_cookie(); $usr = wp_set_current_user ( $user->ID, $user->user_login); wp_set_auth_cookie ( $user->ID ); function register_user($username, $usertype, $externa

我尝试在wordpress中登录用户,但它仅适用于在UI中注册的用户,而不适用于程序添加的用户。 登录是对Ajax登录请求的响应:

//wp_clear_auth_cookie();
$usr = wp_set_current_user ( $user->ID, $user->user_login);
wp_set_auth_cookie  ( $user->ID );
function register_user($username, $usertype, $externalid)
{
   $user_email =  'theuseremail@mail.com';
   $result = wp_insert_user(array('user_login' => $username,
                                  'nice_name'  => $username,
                                  'user_email' => $user_email,
                                  'user_pass'  => '***********'   ));
   $fb_user_id = $result;
   add_user_meta( $fb_user_id, 'specific_attribute', $specific_id, true );
   $user = get_user_by('id', $fb_user_id);
   return $user;
}
function load_user($usertype, $specific_id)
{
   $user = get_users(array(
        'meta_key'     => 'specific_attribute',
        'meta_value'   => $specific_id
     ));
   return $user [0];
}
每个步骤以及任何类型的用户都有日志输出。它在数据库中成功注册,从数据库中加载,甚至登录都可以。甚至会为这两类用户创建一个会话。它可以在数据库中看到。但在所有登录流之后,当页面被重定向或刷新时,只有UI注册的用户进入该站点。在所有成功的步骤之后,程序化的步骤都没有加载:静默不工作,没有错误消息,没有警告,没有失败。看起来需要一些额外的步骤来启用或激活。所有类型的用户都显示在UI的仪表板中

我怀疑以编程方式添加的用户不完整或未激活。这是用户注册为响应Ajax注册请求的方式:

//wp_clear_auth_cookie();
$usr = wp_set_current_user ( $user->ID, $user->user_login);
wp_set_auth_cookie  ( $user->ID );
function register_user($username, $usertype, $externalid)
{
   $user_email =  'theuseremail@mail.com';
   $result = wp_insert_user(array('user_login' => $username,
                                  'nice_name'  => $username,
                                  'user_email' => $user_email,
                                  'user_pass'  => '***********'   ));
   $fb_user_id = $result;
   add_user_meta( $fb_user_id, 'specific_attribute', $specific_id, true );
   $user = get_user_by('id', $fb_user_id);
   return $user;
}
function load_user($usertype, $specific_id)
{
   $user = get_users(array(
        'meta_key'     => 'specific_attribute',
        'meta_value'   => $specific_id
     ));
   return $user [0];
}
这两种用户使用相同的代码,即通过UI注册的用户和通过编程注册的用户。以下是如何从数据库加载用户作为对Ajax登录请求的响应:

//wp_clear_auth_cookie();
$usr = wp_set_current_user ( $user->ID, $user->user_login);
wp_set_auth_cookie  ( $user->ID );
function register_user($username, $usertype, $externalid)
{
   $user_email =  'theuseremail@mail.com';
   $result = wp_insert_user(array('user_login' => $username,
                                  'nice_name'  => $username,
                                  'user_email' => $user_email,
                                  'user_pass'  => '***********'   ));
   $fb_user_id = $result;
   add_user_meta( $fb_user_id, 'specific_attribute', $specific_id, true );
   $user = get_user_by('id', $fb_user_id);
   return $user;
}
function load_user($usertype, $specific_id)
{
   $user = get_users(array(
        'meta_key'     => 'specific_attribute',
        'meta_value'   => $specific_id
     ));
   return $user [0];
}
在这两种情况下,登录都使用元数据字段特定的_属性。对于通过UI注册的用户,此属性将手动添加到数据库中,因为没有此类UI字段。对于其他用户,它会自动添加到函数register\u user中。当我尝试使用标准登录/密码表单登录任何用户时,也会发生同样的情况

工作流更新:
1.PHP:

$user=load_user(请求['usertype'],请求['specific_id'])
如果未加载,则注册用户(请求['username']、请求['usertype']、请求['specific\u id'])
//wp_clear_auth_cookie();
$usr=wp\u set\u当前用户($user->ID,$user->user\u login);
wp\u set\u auth\u cookie($user->ID);
执行操作('wp\u login',$user->user\u login);

返回$user// 在这段代码中:

   $user = load_user(request['usertype'], request['specific_id'])
   if not load then register_user(request['username'], request['usertype'], request['specific_id'])
   //wp_clear_auth_cookie();
   $usr = wp_set_current_user ( $user->ID, $user->user_login);
   wp_set_auth_cookie  ( $user->ID );
   do_action( 'wp_login', $user->user_login );
   return $user; //<-- this is returned to javascript Ajax request
}

在这里,我编写了以编程方式登录和注册WordPress的脚本

已创建用于登录的ajax请求

add_action( 'wp_ajax_gs_user_login_action', 'gspre_user_login');
add_action( 'wp_ajax_nopriv_gs_user_login_action', 'gspre_user_login');
function gspre_user_login(){


    $creds = array();
    $username = $creds['user_login'] = $_POST['user_login'];
    $creds['user_password'] = $_POST['user_pass'];

    $userbyname = get_user_by( 'login', $username );
    if ($userbyname) {
        $user = $userbyname;

    }

    $userbyemail = get_user_by('email', $username);
    if ($userbyemail) {
        $user = $userbyemail;
    }

    if ($user) { 

        $user_roles = implode(', ', $user->roles);

        $user = wp_signon( $creds, true );
        if ( is_wp_error($user) ){

            $myArr = array(
            'response' => 'Invalide username and password',
            'redirect_url' => '',
            'message' => $user->get_error_message()
            );

        }else{

            wp_set_current_user( $user->ID );
            wp_set_auth_cookie( $user->ID );

            if ($user_roles == "administrator") {

                $redirect_url = home_url('wp-admin/');

            }else{

                $redirect_url = home_url();
            }

            $myArr = array(
                'response' => 'Login successfully',
                'redirect_url' => $redirect_url,
                'message' => 'Login successfully'
            );
        }


    }else{

        $myArr = array(
        'response' => 'Invalide username and password',
        'redirect_url' => '',
        'message' => $user->get_error_message()
        );

    }


    $myJSON = json_encode($myArr); 
    echo $myJSON;
    die();
}
已创建ajax注册请求

add_action( 'wp_ajax_gs_user_reg_action', 'gspre_user_reg');
add_action( 'wp_ajax_nopriv_gs_user_reg_action', 'gspre_user_reg');
function gspre_user_reg(){

    //Create user 

    //start: Fill you details here 
    $user_login = $_POST['user_login']; 
    $user_email = $_POST['email']; 
    $user_pass = $_POST['password']; 
    $display_name = $_POST['display_name']; 
    $first_name = $_POST['first_name']; 
    $last_name = $_POST['last_name']; 
    $role = 'administrator';
    //end: Fill you details here 


    $flag_1 = 0;
    $flag_2 = 0;

    $check_username_exists = username_exists( $user_login );
    if ($check_username_exists) {
        $flag_1 = 1;
    }

    $check_email_exists = email_exists($user_email);
    if ($check_email_exists) {
        $flag_2 = 1;
    }


    if ($flag_1 == 0 && $flag_2 == 0) { 

         $userdata = array(
                    'user_login'  =>  $user_login,
                    'user_pass'   =>  $user_pass,
                    'user_email'  =>  $user_email,
                    'display_name'=>  $display_name,
                    'first_name'  =>  $first_name,
                    'last_name'   =>  $last_name
                );

        $user_id = wp_insert_user($userdata);

        wp_update_user( array ('ID' => $user_id, 'role' => $role) );

        if(is_wp_error($user_id)){

            //echo $user->get_error_message();

            $myArr = array(
            'response' => 'register xyz',
            'message' => $user->get_error_message()
            );


        }else{

            //echo "User created successfully";

            $myArr = array(
            'response' => 'register xyz',
            'message' => 'User created successfully'
            );

        }


    }else{

        //echo "User already exist";

        $myArr = array(
        'response' => 'register xyz',
        'message' => 'User already exist'
        );
    }

    $myJSON = json_encode($myArr); 
    echo $myJSON;
    die();
}
此外,我们还为登录表单创建了一个快捷码 短代码::[gsuserlogin]

add_shortcode('gsuserlogin', 'gsuserlogin_shortcode_function');
function gsuserlogin_shortcode_function(){

    if (is_user_logged_in()) {
        return 'You have Logged in'; 
    }
    ?>
    <form name="loginform" id="loginform" action="" method="post">

        <div class="msg_ajax"></div>

        <div>
            <label for="gs_user_login"><?php echo _e('Username or Email', 'gs-users'); ?></label>
                <input type="text" name="gs_user_login" id="gs_user_login" class="input" value="" size="20">
        </div>
        <div>
            <label for="gs_user_pass"><?php echo _e('Password', 'gs-users'); ?></label>
                <input type="password" name="gs_user_pass" id="gs_user_pass" class="input" value="" size="20">
        </div>

        <div>
            <label><input name="gs_user_rememberme" type="checkbox" id="gs_user_rememberme" value="true"> <?php echo _e('Remember Me', 'gs-users'); ?></label>
        </div>

        <input type="hidden" name="action" value="gs_user_login_action">

        <input type="button" id="login_btn" value="Login">

    </form> 

    <script type="text/javascript">
        jQuery(document).ready(function(){

            jQuery(document).on('click', '#login_btn', function(){

                var target = jQuery(this);

                var user_login = jQuery('#gs_user_login').val();

                var user_pass = jQuery('#gs_user_pass').val();

                //Ajax
                jQuery.ajax({
                    url: '<?php echo admin_url( 'admin-ajax.php');?>',
                    type: "POST",
                    data: {'action': 'gs_user_login_action', user_login: user_login, user_pass: user_pass},
                    cache: false,
                    dataType: 'json',
                    beforeSend: function(){
                    },
                    complete: function(){
                    },
                    success: function (response) { console.log(response);

                        jQuery('.msg_ajax').text(response['message']);
                        console.log(response['redirect_url']);
                        console.log(response['message']);

                        if (response['redirect_url']!="") {
                            window.location.href = response['redirect_url'];
                        }


                    }
                });
                //Ajax


            });

        });
    </script>
    <?php
}
add_shortcode('gsuserlogin','gsuserlogin_shortcode_function');
函数gsuserlogin\u短代码\u函数(){
如果(用户是否已登录){
返回“您已登录”;
}
?>
jQuery(文档).ready(函数(){
jQuery(document).on('click','#login_btn',function(){
var target=jQuery(this);
var user_login=jQuery('#gs_user_login').val();
var user_pass=jQuery('#gs_user_pass').val();
//阿贾克斯
jQuery.ajax({
url:“”,
类型:“POST”,
数据:{'action':'gs_user_login_action',user_login:user_login,user_pass:user_pass},
cache:false,
数据类型:“json”,
beforeSend:function(){
},
完成:函数(){
},
成功:函数(响应){console.log(响应);
jQuery('.msg_ajax').text(响应['message']);
log(响应['redirect_url']);
日志(响应['message']);
如果(响应['redirect_url']!=“”){
window.location.href=response['redirect_url'];
}
}
});
//阿贾克斯
});
});
jQuery(文档).ready(函数(){
jQuery(document).on('click','#btn_reg',function(){
var target=jQuery(this);
var first_name=jQuery('#first_name').val();
var last_name=jQuery('#last_name').val();
var user_login=jQuery('#user_login').val();
var email=jQuery('#email').val();
var password=jQuery('#password').val();
//阿贾克斯
jQuery.ajax({
url:“”,
类型:“POST”,
数据:{'action':'gs_user_reg_action',first_name:first_name,last_name:last_name,user_login:user_login,email:email,password:password},
cache:false,
数据类型:“json”,
beforeSend:function(){
},
完成:函数(){
},
成功:函数(响应){console.log(响应);
jQuery('.msg_ajax').text(响应['message']);
log(response['response']);
日志(响应['message']);
}
});
//阿贾克斯
});
});

那么,哪一部分不起作用了?第一部分?你启用了其他插件吗?
密码应该是
user\u pass
同样在
wp\u insert\u user
@HowardE中有一个干净的Wordpress。除了我开发的插件外,没有安装任何插件。关于哪个部分不起作用,很奇怪,但一切都在工作。只是每件事。我为每个步骤写详细的日志。用户已注册、加载,没有问题。在所有工作流成功并完成后,它将失败。我执行重定向,但用户未加载。@Howar