情况:通过外部网站上的链接,用户可以重定向到wordpress页面,其中显示付款表单。此页面仅供登录用户访问。所以在链接中有一个参数(包含特定用户的用户名),用于进行程序化登录。
在程序化登录代码的最后,我已经实现了一些代码,以便从查询字符串中删除参数,并在没有progammatic登录参数的情况下重定向到新地址。
问题:并不总是会删除参数。
CODE:(它分为两个功能)
网址示例:http://www.example.com/?page_id=00&token=pippo
检查参数是否存在的函数(如果TRUE执行程序化登录)
add_action('after_setup_theme', 'autologin', 2, 10);
function autologin() {
if(isset($_GET['token'])) { //autologin token is set
$username = $_GET['token'];
programmatic_login($username);
}
}
执行程序化登录并从查询字符串
中删除参数的功能function programmatic_login( $username ) {
if(is_user_logged_in()) {
$current_user = wp_get_current_user();
if($username != $current_user->user_login) {
wp_logout();
}
else {
//Remove the "token" from the URL + redirect
$url = home_url( add_query_arg( null, null ));
$parsed_url = parse_url($url);
parse_str($parsed_url['query'], $parsed_str);
unset($parsed_str['token']);
$actual_link = "http://$_SERVER[HTTP_HOST]/?";
$http_builded = $actual_link . http_build_query($parsed_str);
// wp_redirect( $http_builded );
header('Location: ' . $http_builded, true);
exit();
// die();
}
}
if(!is_user_logged_in()) {
// Set the new User
$user = get_user_by( 'login', $username );
$user_id = $user->ID;
wp_set_current_user( $user_id, $username );
wp_set_auth_cookie( $user_id );
// $user = wp_signon( array( 'user_login' => $username ) );
do_action( 'wp_login', $username );
if ( is_wp_error($user) ) {
error_log(print_r( $user->get_error_message(), TRUE));
}
if ( is_a( $user, 'WP_User' ) ) {
if ( is_user_logged_in() ) {
// Remove the "token" from the URL + redirect
$url = home_url( add_query_arg( null, null ));
$parsed_url = parse_url($url);
parse_str($parsed_url['query'], $parsed_str);
unset($parsed_str['token']);
$actual_link = "http://$_SERVER[HTTP_HOST]/?";
$http_builded = $actual_link . http_build_query($parsed_str);
// wp_redirect( $http_builded );
header('Location: ' . $http_builded, true);
exit();
// die();
}
}
}
}
结果:登录始终成功,但有时不会删除此参数。更少见的是,没有发生重定向,因为我发现表单的预填充字段仍然是旧的(当我从一个用户切换到另一个用户时)。
有人看到一些错误吗?或者您是否有任何建议可以获得更具体的信息或者做得更好?
P.S。:我需要进行重定向,因为它解决了表单提交时wp_verify_nonce()的问题