Benutzer nach der Anmeldung zur ursprünglichen URL umleiten?

16

Ich habe eine Funktion, die Benutzer auf die Anmeldeseite (Startseite) umleitet, wenn sie versuchen, auf eine andere Seite zuzugreifen, ohne angemeldet zu sein:

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

Das Problem ist, dass ich sie nach der erfolgreichen Anmeldung zu der URL umleiten muss, zu der sie wollten, genau wie das WordPress-Backend funktioniert.

Gibt es eine Möglichkeit, dies zu tun? Danke im Voraus!

Javier Villanueva
quelle

Antworten:

16

Das geht ganz einfach. Sie müssen nur einen Umleitungsparameter angeben. Wenn Sie einen Anmeldelink auf der Startseite verwenden, um zur Anmeldeseite zu gelangen, ist die Lösung von @ sisir korrekt.

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

Wenn Sie ein benutzerdefiniertes Formular auf der Startseite verwenden, <form>stellen Sie sicher, dass Sie innerhalb des Felds ein ausgeblendetes Feld mit der URL ausfüllen, die umgeleitet werden soll

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

Wenn Sie wp_login_form()das Formular mit generieren, geben Sie einen Parameter ein: 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 );
?>

Ändern Sie andere Parameter je nach Bedarf.

Ashfame
quelle
Ich verwende ein benutzerdefiniertes Formular und verwende die von Ihnen bereitgestellte Lösung für versteckte Felder. In meinem Fall werde ich jedoch zu einer URL wie dieser umgeleitet: "localhost / wordpress / localhost / wordpress / blog / someone". irgendeine Hilfe?
Rafi
Ich habe dies, ich verwende doppelten Schrägstrich. Meine Lösung ist also wie folgt: <? php echo '//'. $ _SERVER ["HTTP_HOST"]. $ _SERVER ["REQUEST_URI"]; ?>
Rafi
6

Versuchen Sie, the_permalink()als $redirectArgument zu übergeben:

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

BEARBEITEN:

Sorry, habe deine Frage ursprünglich falsch verstanden. Versuche dies:

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

Beachten Sie auch: Die ordnungsgemäße Verwendung von wp_redirect()erfordert in der Regel das Hinzufügen exit;, das ich meinem zweiten Beispiel hinzugefügt habe.

Chip Bennett
quelle
Das ergibt keinen Sinn, die Weiterleitung muss nach Hause gehen, das funktioniert. Ich brauche eine Möglichkeit, die ursprüngliche URL abzufangen und den Benutzer dorthin weiterzuleiten, sobald er sich anmeldet.
Javier Villanueva
Sorry, habe deine Frage ursprünglich falsch verstanden. Ich habe eine Bearbeitung hinzugefügt, die hoffentlich Ihren Anwendungsfall anspricht.
Chip Bennett
4

Vielen Dank, ich habe ein bisschen von dem verwendet, was alle empfohlen haben, sodass mein Code am Ende so aussieht:

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

Und in meinem Anmeldeformular (ich habe mein Anmeldeformular in meiner Bewerbung fest codiert, danke @Ashfame, dass ich über wp_login_form informiert wurde. Ich hatte keine Ahnung, dass es existiert.)

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

Vielen Dank für Ihre Hilfe, ich habe alle gewählt!

Javier Villanueva
quelle
Hallo Javier, in welcher Datei hast du diese Funktionen hinzugefügt? Vielen Dank.
Tyler Durden
Infunctions.php
Javier Villanueva
4
Sie sollten anrufen exit()oder die()nach wp_redirect(). Andernfalls wird der Code möglicherweise wp_redirect()ausgeführt, was zu Fehlern und Sicherheitslücken führen kann.
Ian Dunn
2

Dies ist mein Code, den ich benutze, um Leute zu wp Login-Seite zu leiten. Wenn sie dann eingeloggt waren, kehrten sie dorthin zurück, wo sie waren. Aber es ist nicht die Startseite, sondern die WordPress-Anmeldeseite, auf der ich die benutzerdefinierte Anmeldung einrichte.

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

Vielleicht möchten Sie mit recherchieren. In der Regel erhalten Sie die aktuelle URL eines Benutzers von$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

Sisir
quelle
0

Der login_redirectFilterhaken ist hier eine vollständigere und effektivere Lösung. Auf diese Weise können Sie verschiedene Weiterleitungspfade für verschiedene Benutzerebenen anbieten oder die Weiterleitungs-URL beibehalten, falls beim Anmelden ein Fehler auftritt (z. B. Falsches Kennwort).

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 );
Matt
quelle
0

Es hat bei keiner Ihrer Antworten geklappt, aber es hat nur ein bisschen geklappt! Hier mein Code:

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

Nur ich fügte hinzu /wp-login.php im Vergleich zu @Matt's Antwort , aber für mich war das der Schlüssel. Ich hoffe, das hilft! :)

**BEARBEITEN:

Ich habe einen FEHLER festgestellt, als Sie mit FORCE WordPress in HTTPS navigieren. Diese Methode funktioniert nicht, da die Umleitung in HTTP erfolgt. Zur Behebung des Problems habe ich die Funktion geändert. Das ist das Ergebnis:

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

Ich überprüfe das Protokoll und dann habe ich gelöscht ‚ esc_url‘ und fügte hinzu , das richtige Protokoll: $protocol://. Auch das habe ich geändert "".

Ich arbeite mit dieser Seite .

Neil
quelle
0

Ich weiß, dass dies sehr spät ist, aber ich habe einen Post darüber verfasst, wie dies zu tun ist, wenn zukünftige Leute dies finden und es brauchen:

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

user90810
quelle
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert. Siehe Antworten .
Gabriel