php - 前端ajax用户登录会话问题
问题描述
我有一个问题,ajax 登录表单允许我登录,有点。如果我在登录后将重定向设置为主页,它会将我发送到主页并在顶部为我提供管理栏。但是,如果我尝试然后转到管理仪表板,它会要求我使用正常的 wordpress 登录再次登录。
如何解决这个问题?我的代码:
在 page-login.php 模板中:
<form id="login" class="ajax-auth" action="login" method="post">
<p class="status"></p>
<?php wp_nonce_field('ajax-login-nonce', 'security'); ?>
<div class="form-group">
<input id="username" placeholder="<?php _e('Username','my-theme'); ?>" type="text" class="required form-control" name="username">
</div>
<div class="form-group">
<input id="password" placeholder="<?php _e('Password','my-theme'); ?>" type="password" class="required form-control" name="password">
</div>
<input class="btn btn-block btn-md btn-info" type="submit" value="<?php _e('Login','my-theme'); ?>">
</form>
在functions.php中:
function ajax_auth_init(){
global $theme_options;
$userProfilePage=$theme_options['opt-user-select'];
wp_register_script('ajax-auth-script', get_template_directory_uri() . '/assets/js/ajax-logreg-script.js', array('jquery') );
wp_enqueue_script('ajax-auth-script');
wp_localize_script( 'ajax-auth-script', 'ajax_auth_object', array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'redirecturl' => get_page_link($userProfilePage),
'loadingmessage' => __('Please wait...','my-theme')
));
// Enable the user with no privileges to run ajax_login() in AJAX
add_action( 'wp_ajax_nopriv_ajaxlogin', 'ajax_login' );
}
// Execute the action only if the user isn't logged in
if (!is_user_logged_in()) {
add_action('init', 'ajax_auth_init');
}
function ajax_login(){
// First check the nonce, if it fails the function will break
check_ajax_referer( 'ajax-login-nonce', 'security' );
// Nonce is checked, get the POST data and sign user on
// Call auth_user_login
auth_user_login($_POST['username'], $_POST['password'], __('Login','my-theme'));
die();
}
function auth_user_login($user_login, $password, $login){
$info = array();
$info['user_login'] = $user_login;
$info['user_password'] = $password;
$info['remember'] = true;
$user_signon = wp_signon( $info, false );
if ( is_wp_error($user_signon) ){
echo json_encode(array('loggedin'=>false, 'message'=>__('Wrong password or username.','my-theme')));
} else {
wp_set_current_user($user_signon->ID);
echo json_encode(array('loggedin'=>true, 'message'=> $login.__(' successful, redirecting...','my-theme')));
}
die();
}
和 ajax-logreg-script.js 文件:
jQuery(document).ready(function ($) {
// Perform AJAX login/register on form submit
$('form#login, form#register').on('submit', function (e) {
if (!$(this).valid()) return false;
$('p.status', this).show().text(ajax_auth_object.loadingmessage);
action = 'ajaxlogin';
username = $('form#login #username').val();
password = $('form#login #password').val();
email = '';
security = $('form#login #security').val();
ctrl = $(this);
$.ajax({
type: 'POST',
dataType: 'json',
url: ajax_auth_object.ajaxurl,
data: {
'action': action,
'username': username,
'password': password,
'email': email,
'security': security,
},
success: function (data) {
$('p.status', ctrl).text(data.message);
if (data.loggedin == true)
document.location.href = ajax_auth_object.redirecturl;
else if (ctrl == 'register')
grecaptcha.reset();
}
});
e.preventDefault();
});
$(".logreg-page form#login").validate({
ignore: ".ignore",
rules: {
username: {
required: true,
},
password: {
required: true,
},
},
messages: {
username: "Please enter an username.",
password: "Please enter your password.",
},
});
});
解决方案
如果您的站点使用 SSL,请将 wp_signon 函数的第二个参数设置为 true。
$user_signon = wp_signon( $info, true);
推荐阅读
- websphere - 使用 xml 格式将查询插入数据库的 esql 命令
- c# - RegEx 表达式适用于 regex101 但不适用于 C#
- purescript - 用于处理 polymothinc 记录的 API
- swift - 在 M1 mac 上为 INTEL 和 M1 构建胖二进制文件
- c++ - 没有在 C++ 项目中的任何地方定义和使用它的前向声明类背后的目的是什么?
- google-cloud-functions - 在 PubSub 后端函数或 Http 函数之间进行选择
- rust - 如何在 rust 中实现抽象工厂?
- javascript - 如何在 javascript 警报中列出数组
- python - 如何从巨大的 .txt 文件中更改运行 Locust 性能测试的测试数据
- python - 问题在 Python 中导入文件