WordPress 版本 4.7.5
我正在从 Instagram 注册新用户,我可以成功注册新用户。注册后我试图登录用户。
我可以使用钩子,但想要比肮脏的更好的解决方案,我已经发布了,因为那将完全没用。
if( $user_created ) {
$new_user = get_user_by( 'id', $user_created );
//$loggedin = programmatic_login( $new_user->user_login );
//ob_start();
if ( !is_user_logged_in() ) {
wp_clear_auth_cookie();
wp_set_current_user( $user_created, $new_user->user_login );
wp_set_auth_cookie( $user_created, true );
do_action( 'wp_login', $new_user->user_login );
// wp_safe_redirect(site_url() . '/profile/');
// exit;
// $redirect_to=user_admin_url();
// wp_safe_redirect($redirect_to);
// exit();
}
//ob_end_clean();
} ?>
<script>jQuery(document).ready(function(){ window.location.href = "<?php echo site_url() . '/profile/'; ?>";});</script> <?php
还尝试使用另一篇文章中的自定义programmatic_login函数。
如果我试图低于此var_dump
wp_get_current_user()
,$_COOKIE
我将获得用户对象 forwp_get_current_user()
和array(1) { ["wordpress_test_cookie"]=> string(15) "WP Cookie check" }
for $_COOKIE
。
重要编辑
代码在一个函数内部,该函数与一个钩子挂钩,该钩子在页眉显示后的页面中调用,因此我们不能在这里使用 init。这样做的任何其他方式,也是因为这个wp_safe_redirect()
或header('Location: ')
也不起作用。
我刚刚尝试过的重要更新
肮脏的工作
当我从 Instagram 登录创建用户时,成功创建后,我将用户重定向到一个带有类似 get 参数的页面,?user_id=$inserted_id
并且在 wp 钩子上,我试图获取GET['user_id']
并记录它并且它工作,试图找到一个合适的解决方案。
if ( $wpdb->insert_id ){ //that is registration with instagram
?>
<script>jQuery(document).ready(function(){ window.location.href = "<?php echo get_bloginfo('url') . '/profile/?id=' . $wpdb->insert_id; ?>";});</script>
<?php
}
接着
add_action( 'wp', 'login_current_user' );
function login_current_user(){
if ( is_page() && get_the_id() == 863 ){
if ( isset( $_GET['id'] ) ){
if ( !is_user_logged_in() ) {
$user_id = $_GET['id'];
$user = get_user_by( 'id', $user_id );
wp_clear_auth_cookie();
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id, true );
do_action( 'wp_login', $user->user_login );
if ( is_user_logged_in() ){
$redirect_to=site_url() . '/profile';
wp_safe_redirect($redirect_to);
exit();
}
}
}
}
}
有肮脏的把戏的问题。如果
id
我们传递的 get 参数存在于 wp_users 表中,则无需验证即可登录。
更新
我在重定向到个人资料页面之前创建了一个 user_meta,在验证登录用户并删除了 usermeta 之后,就像 OTP 一样。如果可能的话,努力让它变得更好。
在代码下方: -
if ( $wpdb->insert_id ){ //that is registration with instagram
$temporary_token = sha1(rand());
update_user_meta( $wpdb->insert_id, 'temporary_token', $temporary_token);
?>
<script>jQuery(document).ready(function(){ window.location.href = "<?php echo get_bloginfo('url') . '/profile/?id=' . $wpdb->insert_id . '&token=' . $temporary_token; ?>";});</script>
<?php
}
接着
add_action( 'wp', 'login_current_user' );
function login_current_user(){
if ( is_page() && get_the_id() == 863 ){
if ( isset( $_GET['id'] ) ){
if ( !is_user_logged_in() ) {
$user_id = $_GET['id'];
$user = get_user_by( 'id', $user_id );
if ( $_GET['token'] == get_user_meta( $user_id, 'temporary_token', true ) ){
delete_user_meta( $user_id, 'temporary_token', $_GET['token'] );
wp_clear_auth_cookie();
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id, true );
do_action( 'wp_login', $user->user_login );
if ( is_user_logged_in() ){
$redirect_to=site_url() . '/profile';
wp_safe_redirect($redirect_to);
exit();
}
}
}
}
}
}