Вход в Wordpress работает частично - PullRequest
2 голосов
/ 09 марта 2020

Я пытаюсь войти в систему в WordPress, но он работает только для пользователей, зарегистрированных в пользовательском интерфейсе, а не для тех, которые добавлены программой. Вход в систему выполняется в ответ на Ajax запрос на вход в систему:

//wp_clear_auth_cookie();
$usr = wp_set_current_user ( $user->ID, $user->user_login);
wp_set_auth_cookie  ( $user->ID );

Для каждого шага и для любого типа пользователя имеется журнал. Он успешно зарегистрирован в базе данных, загружен из базы данных, и даже логин в порядке. И даже сеанс создан для обоих типов пользователей. Это можно увидеть в базе данных. Но после всего потока входа в систему, когда страница перенаправлена ​​или обновлена, на сайт заходит только зарегистрированный пользовательский интерфейс. Программные c просто не загружаются после всех успешных шагов: молча не работает, никаких сообщений об ошибках, никаких предупреждений, никаких сбоев. Похоже, для включения или активации нужны дополнительные шаги. Все виды пользователей отображаются на панели инструментов в пользовательском интерфейсе.

Я подозреваю, что программно добавленный пользователь не завершен или не активирован. Вот как пользователь регистрируется в ответ на Ajax запрос регистрации:

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;
}

Один и тот же код используется для обоих типов пользователей, зарегистрированных в пользовательском интерфейсе, и тех, которые зарегистрированы программно. Существует способ загрузки пользователя из базы данных в ответ на Ajax запрос входа в систему:

function load_user($usertype, $specific_id)
{
   $user = get_users(array(
        'meta_key'     => 'specific_attribute',
        'meta_value'   => $specific_id
     ));
   return $user [0];
}

Для входа в систему используется поле метаданных specific_attribute в обоих случаях. Для пользователей, зарегистрированных пользовательским интерфейсом, этот атрибут добавляется вручную в базу данных, поскольку такого поля пользовательского интерфейса нет. Для остальных он добавляется автоматически в функцию register_user . То же самое происходит, когда я пытаюсь войти в систему любого пользователя, используя стандартную форму логина / пароля.

Обновление рабочего процесса: 1. PHP:

       $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
    }
Javascript:
    function onClick()
    {
       let xhttp = new XMLHttpRequest();
       xhttp.onreadystatechange = function()
          {
            if (this.readyState == 4 && this.status == 200)
            {
                window.location = redirectaddress; //redirect
                //or window.location=window.location;//just refresh
            }
          }
       xhttp.open("POST", "/wp-json/register_or_login", true);
       xhttp.setRequestHeader("Content-type", "application/json");
       xhttp.send(JSON.stringify(request));
    }

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Здесь я написал скрипт для входа и регистрации в 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();
}

Также, Создан шорткод для формы входа Shortcode :: [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
}

Создан шорткод для формы регистрации

Shortcode :: [gsuserreg]

add_shortcode('gsuserreg', 'gsuserreg_shortcode_function');
function gsuserreg_shortcode_function(){

    if (is_user_logged_in()) {

        return 'You have Logged in'; 

    }

    ?>
    <form name="regform" id="regform" action="" method="post">

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

        <div>
            <label for="first_name"><?php echo _e('first_name', 'gs-users'); ?></label>
            <input type="text" name="first_name" id="first_name">
        </div>

        <div>
            <label for="last_name"><?php echo _e('last_name', 'gs-users'); ?></label>
            <input type="text" name="last_name" id="last_name">
        </div>

        <div>
            <label for="user_login"><?php echo _e('user_login', 'gs-users'); ?></label>
            <input type="text" name="user_login" id="user_login">
        </div>

        <div>
            <label for="email"><?php echo _e('email', 'gs-users'); ?></label>
            <input type="text" name="email" id="email">
        </div>

        <div>
            <label for="password"><?php echo _e('password', 'gs-users'); ?></label>
            <input type="password" name="password" id="password">
        </div>

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

        <input type="button" id="btn_reg" value="Send My Message">

    </form>


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

            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();

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


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


                    }
                });
                //Ajax


            });

        });
    </script>


    <?php

}

Вставьте приведенный выше код в функции темы. php Надеюсь, это сработает, спасибо вам:)

1 голос
/ 10 марта 2020

В этом фрагменте кода:

   $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
}

В четвертой строке $ user не будет установлен ничего, если он был только что создан.

Также в той же строке вы записал $ user как $ usr

Я действительно делал то же самое раньше. Ниже приведена соответствующая часть кода, который я использовал, когда делал это.

$user_id = lookup_user_id();

// Create the user in the WordPress DB if it does not exist
if ($user_id === false){
    $username = $_POST['username'];
    $email = $_POST['email'];
    // We're never going to know the password stored in the WordPress DB, but that is alright
    // because we will only authenticate this user against our SSO server and not the WordPress DB
    $password = wp_generate_password(33, true, true);
    $user_id = wp_insert_user( array('user_login'=>$username, 'user_pass'=>$password, 'user_email'=>$email, 'display_name'=>$_POST['username']) );
}

// Login the user
wp_set_auth_cookie($user_id, false);
if (isset($_POST['redirect'])){
    header('Location: '.$_POST['redirect']);
}
...