Redirecionar usuário para URL original após o login?

15

Eu tenho uma função que redireciona os usuários para a página de login (home) se eles estão tentando acessar qualquer outra página sem estar logado, aqui está como funciona:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( get_option('home') );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

Realmente simples e funciona bem, o problema é que preciso redirecioná-los para a URL que eles estavam tentando acessar depois de fazer login com sucesso, exatamente como o back-end do WordPress funciona.

Existe uma maneira de fazer isso? Obrigado antecipadamente!

    
por Javier Villanueva 30.04.2011 / 05:35

7 respostas

4

Obrigado a todos, eu meio que usei um pouco do que todo mundo recomendou. No final, meu código ficou assim:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

E no meu formulário de login (estou hardcoding meu formulário de login na minha aplicação graças @Ashfame por me avisar sobre wp_login_form Eu não tinha idéia que existia) eu adicionei isso quando as credenciais do usuário são muito bem e eles estão prontos para iniciar sessão :

if (isset($_REQUEST['redirect_to'])){
    wp_redirect($_REQUEST['redirect_to']);
    // wp_redirect() does not exit automatically, and should almost always be followed by a call to exit;
    exit;

} else {
    wp_redirect(get_bloginfo('url') . '/groups/');
    exit;
}

Muito obrigado pela sua ajuda, votei em todos!

    
por Javier Villanueva 30.04.2011 / 18:41
15

Você pode fazer isso facilmente. Você só precisa especificar um parâmetro de redirecionamento. Se você estiver usando um link de login na página inicial para acessar a página de login, a solução da @sisir está correta.

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] ); ?>

Se você estiver usando um formulário personalizado na página inicial, insira um campo oculto com o URL para redirecionar

.
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>" />

E se você estiver usando <form> para gerar o formulário, preencha um parâmetro - enlace

<?php
$args = array(
        'echo' => true,
        'redirect' => site_url( $_SERVER['REQUEST_URI'] ), 
        'form_id' => 'loginform',
        'label_username' => __( 'Username' ),
        'label_password' => __( 'Password' ),
        'label_remember' => __( 'Remember Me' ),
        'label_log_in' => __( 'Log In' ),
        'id_username' => 'user_login',
        'id_password' => 'user_pass',
        'id_remember' => 'rememberme',
        'id_submit' => 'wp-submit',
        'remember' => true,
        'value_username' => NULL,
        'value_remember' => false );

wp_login_form( $args );
?>

Altere outros parâmetros conforme o que você tem ou precisa.

    
por Ashfame 30.04.2011 / 12:43
6

Tente passar the_permalink() como o argumento $redirect :

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( the_permalink() );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

EDITAR:

Desculpe, entendi mal sua pergunta originalmente. Tente isto:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        $redirect = home_url() . '/wp-login.php?redirect_to=' . urlencode( $_SERVER['REQUEST_URI'] );
        wp_redirect( $redirect );
        exit;
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

Note também: o uso adequado de wp_redirect() geralmente requer a adição de exit; , que eu adicionei ao meu segundo exemplo.

    
por Chip Bennett 30.04.2011 / 05:42
2

este é o meu código que eu uso as pessoas para direcionar para a página de login do wp. Então, quando logados, voltaram para onde estavam. Mas não é a home page, mas a página de login do wordpress onde eu configuro o login personalizado.

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) ?>

Você pode querer pesquisar com. Normalmente, você obterá a URL atual de um usuário por $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

    
por Sisir 30.04.2011 / 10:43
0

O login_redirect filtro gancho é uma solução mais completa e eficaz aqui. Dessa forma, você pode oferecer diferentes caminhos de redirecionamento para diferentes níveis de usuários ou manter o URL de redirecionamento em caso de erro ao efetuar login (por exemplo, Senha Incorreta).

function login_redirect( $redirect_to, $request, $user ){
  if(isset($_REQUEST['redirect_to'])){
    return $_REQUEST['redirect_to'];
  }
  return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );

function restrict_access_if_logged_out(){
  if (!is_user_logged_in() && !is_home()){
    $redirect = home_url() . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
    
por Matt 12.08.2014 / 17:24
0

Não funcionou nenhuma de suas respostas, mas apenas adicionando uma pequena coisa, funcionou! Aqui meu código:

function login_redirect( $redirect_to, $request, $user ){
  if(isset($_REQUEST['redirect_to'])){
    return $_REQUEST['redirect_to'];
  }
  return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );

function restrict_access_if_logged_out(){
  if (!is_user_logged_in() && !is_home()){
    $redirect = home_url() . '/wp-login.php?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]));
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

Só adicionei /wp-login.php em comparação com a resposta do @ Matt, mas para mim foi a chave. Espero que ajude! :)

** EDITAR:

Eu detectei um ERRO quando você está FORCE wordpress para navegar em HTTPS. Este método não funciona porque o redirecionamento está em HTTP. Para corrigir o problema eu mudei a função. Este é o resultado:

function restrict_access_if_logged_out(){
  global $wp;
  $protocol='http';
  if (isset($_SERVER['HTTPS']))
    if (strtoupper($_SERVER['HTTPS'])=='ON')
      $protocol='https';
  if (!is_user_logged_in() && !is_home() && ($wp->query_vars['pagename'] != 'downloads') ){
    $redirect = home_url() . "/wp-login.php?redirect_to= $protocol://" . $_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

Eu verifiquei o protocolo e excluí o ' esc_url ' e adicionei o protocolo correto: $protocol:// . Também mudei o "" .

Tenho como base esta página .

    
por Neil 23.05.2017 / 14:40
0

Eu sei que isso é muito tarde, mas eu fiz um post sobre como fazer isso, se pessoas futuras encontrarem isso e precisarem disso:

enlace

    
por user90810 17.03.2016 / 22:02