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


16

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, eis 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 eu preciso redirecioná-los para o URL para o qual eles estavam tentando acessar após o login bem-sucedido, exatamente como o back-end do WordPress funciona.

Existe uma maneira de fazer isso? Desde já, obrigado!

Respostas:


16

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 do @ 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, dentro da <form>, certifique-se de preencher um campo oculto com a URL para redirecionar

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

E se você estiver usando wp_login_form()para gerar o formulário, preencha um parâmetro - http://codex.wordpress.org/Function_Reference/wp_login_form

<?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.


Estou usando formulário personalizado e estou usando sua solução de campo oculto fornecida, mas no meu caso estou sendo redirecionado para URL como este 'localhost / wordpress / localhost / wordpress / blog / alguém'. qualquer ajuda?
Rafi

Eu tenho isso, estou usando barra dupla. então minha solução é assim <? php echo '//'. $ _SERVER ["HTTP_HOST"]. $ _SERVER ["REQUEST_URI"]; ?>
rafi

6

Tente passar the_permalink()como $redirectargumento:

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, sua pergunta foi mal interpretada originalmente. Tente o seguinte:

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

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


Isso não faz qualquer sentido, as necessidades de redirecionamento para ir para casa, que está funcionando bem eu preciso de alguma forma para pegar a url original e redirecionar o usuário lá uma vez que ele faz login.
Javier Villanueva

Desculpe, sua pergunta foi mal interpretada originalmente. Adicionei uma edição que, esperançosamente, trata do seu caso de uso.
Chip Bennett

4

Obrigado a todos, eu meio que usei um pouco do que todos recomendaram, e no final meu código fica 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 codificando meu formulário de login no meu aplicativo, agradeço ao @Ashfame por me informar sobre o wp_login_form que eu não fazia ideia de que existia).

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 por sua ajuda, votei em todos!


Oi Javier, em qual arquivo você adicionou essas funções? Obrigado.
Tyler Durden

Infunctions.php
Javier Villanueva

4
Você deve ligar exit()ou die()depois wp_redirect(). Caso contrário, é possível que o código depois wp_redirect()seja executado, o que pode levar a erros e vulnerabilidades de segurança.
Ian Dunn

2

este é o meu código que eu uso pessoas para direcionar para a página de login do wp. Então, quando logados, eles voltaram para onde estavam. Mas não é a página inicial, 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. Normalmente, você obtém o URL atual de um usuário$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]


0

O login_redirectgancho de filtro é uma solução mais completa e eficaz aqui. Dessa forma, você pode oferecer caminhos de redirecionamento diferentes para diferentes níveis de usuários ou manter o URL de redirecionamento no caso de um erro ao fazer 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 );

0

Não funcionou nenhuma das suas respostas, mas apenas adicionou um pouco, 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.phpem comparação com a resposta de @ Matt, mas para mim tem sido a chave. Espero que ajude! :)

**EDITAR:

Detectei um ERRO quando você está no FORCE wordpress para navegar no HTTPS. Este método não funciona porque o redirecionamento está no HTTP. Para corrigir o problema, 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 verifico o protocolo e, em seguida, eu apaguei ' esc_url' e acrescentou o protocolo correto: $protocol://. Também mudei o "".

Eu sou baseado nesta página .


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.