Przekierować użytkownika do oryginalnego adresu URL po zalogowaniu?


16

Mam funkcję, która przekierowuje użytkowników do strony logowania (głównej), jeśli próbują uzyskać dostęp do dowolnej innej strony bez zalogowania, oto jak to działa:

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

Naprawdę proste i działa dobrze, problem polega na tym, że muszę przekierować ich do adresu URL, do którego próbowali przejść po udanym zalogowaniu, dokładnie tak jak działa backend WordPressa.

Czy jest na to sposób? Z góry dziękuję!

Odpowiedzi:


16

Możesz to zrobić z łatwością. Musisz tylko podać parametr przekierowania. Jeśli używasz linku logowania na stronie głównej, aby przejść do strony logowania, wówczas rozwiązanie @ sisir jest poprawne.

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

Jeśli używasz niestandardowego formularza na stronie głównej, w środku <form>upewnij się, że wypełniasz ukryte pole adresem URL, aby przekierować

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

A jeśli używasz wp_login_form()do wygenerowania formularza, wypełnij parametr - 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 );
?>

Zmień inne parametry zgodnie z tym, co masz lub potrzebujesz.


Używam niestandardowego formularza i używam dostarczonego rozwiązania ukrytego pola, ale w moim przypadku przekierowuje mnie na adres URL taki jak „localhost / wordpress / localhost / wordpress / blog / someone”. jakaś pomoc?
rafi

mam to, używam podwójnego ukośnika. więc moje rozwiązanie jest takie jak <? php echo „//”. $ _SERVER [„HTTP_HOST”]. $ _SERVER [„REQUEST_URI”]; ?>
rafi

6

Spróbuj podać the_permalink()jako $redirectargument:

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

EDYTOWAĆ:

Przepraszamy, źle zrozumiałem twoje pytanie. Spróbuj tego:

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

Uwaga: prawidłowe użycie wp_redirect()ogólnie wymaga dodania exit;, które dodałem do mojego drugiego przykładu.


To nie ma sensu, przekierowanie musi iść do domu, to działa dobrze Potrzebuję jakiegoś sposobu, aby złapać oryginalny adres URL i przekierować użytkownika, gdy się zaloguje.
Javier Villanueva

Przepraszamy, źle zrozumiałem twoje pytanie. Dodałem zmianę, która, mam nadzieję, dotyczy twojego przypadku użycia.
Chip Bennett

4

Dzięki wszystkim, użyłem trochę tego, co wszyscy polecili, więc w końcu mój kod wygląda następująco:

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

I na moim formularzu logowania (na stałe zapisuję mój formularz logowania w aplikacji dzięki @Ashfame za poinformowanie mnie o wp_login_form nie miałem pojęcia, że ​​istnieje) dodałem to, gdy dane logowania są prawidłowe i są gotowe do zalogowania:

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

Wielkie dzięki za pomoc, głosowałem za wszystkimi!


Cześć Javier, do którego pliku dodałeś te funkcje? Dzięki.
Tyler Durden

Wfunctions.php
Javier Villanueva

4
Powinieneś zadzwonić exit()lub die()po wp_redirect(). W przeciwnym razie możliwe wp_redirect()jest wykonanie kodu po , co może prowadzić do błędów i luk w zabezpieczeniach.
Ian Dunn

2

to jest mój kod, którego używam do przekierowania na stronę logowania wp. Po zalogowaniu wrócili do miejsca, w którym byli. Ale to nie jest strona główna, ale strona logowania wordpress, na której konfiguruję niestandardowe logowanie.

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

Możesz chcieć przeprowadzić badania. Zazwyczaj otrzymasz aktualny adres URL użytkownika$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]


0

login_redirectHak filtr jest bardziej kompletne i skuteczne rozwiązanie tutaj. W ten sposób możesz zaoferować różne ścieżki przekierowania dla różnych poziomów użytkowników lub zachować adres URL przekierowania w przypadku błędu podczas logowania (tj. Niepoprawne hasło).

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

To nie zadziałało z żadną z twoich odpowiedzi, ale tylko dodając małą rzecz, zadziałało! Oto mój kod:

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

Tylko dodałem /wp-login.phpw porównaniu do odpowiedzi @ Matta, ale dla mnie był kluczem. Mam nadzieję, że to pomaga! :)

**EDYTOWAĆ:

Wykryłem BŁĄD, gdy wymuszasz wordpress, aby nawigować w HTTPS. Ta metoda nie działa, ponieważ przekierowanie odbywa się w HTTP. Aby rozwiązać problem, zmieniłem funkcję. Oto wynik:

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

I sprawdzić protokół i potem usunięty „ esc_url” i dodał prawidłowy protokół: $protocol://. Również zmieniłem "".

Opieram się na tej stronie .


0

Wiem, że jest już bardzo późno, ale napisałem post o tym, jak to zrobić, jeśli ktoś w przyszłości znajdzie to i potrzebuje:

http://www.ryanprejean.com/force-login-with-redirect-and-exceptions/


Chociaż ten link może odpowiedzieć na pytanie, lepiej dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie. Zobacz jak odpowiedzieć .
Gabriel,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.