Rediriger l'utilisateur vers l'URL d'origine après la connexion?


16

J'ai une fonction qui redirige les utilisateurs vers la page de connexion (home) s'ils essaient d'accéder à une autre page sans être connecté, voici comment cela fonctionne:

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

Vraiment simple et fonctionne très bien, le problème est que je dois les rediriger vers l'URL vers laquelle ils essayaient d'aller après s'être connecté avec succès, exactement comme le backend WordPress fonctionne.

Y a-t-il un moyen de faire cela? Merci d'avance!

Réponses:


16

Vous pouvez le faire facilement. Il vous suffit de spécifier un paramètre de redirection. Si vous utilisez un lien de connexion sur la page d'accueil pour accéder à la page de connexion, la solution de @ sisir est correcte.

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

Si vous utilisez un formulaire personnalisé sur la page d'accueil, puis à l'intérieur du <form>, assurez-vous de remplir un champ caché avec l'URL à rediriger

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

Et si vous utilisez wp_login_form()pour générer le formulaire, remplissez un paramètre - 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 );
?>

Modifiez les autres paramètres selon vos besoins ou vos besoins.


j'utilise un formulaire personnalisé et j'utilise votre solution de champ caché fournie, mais dans mon cas, je suis redirigé vers une URL comme celle-ci 'localhost / wordpress / localhost / wordpress / blog / quelqu'un'. de l'aide?
rafi

j'ai ceci, j'utilise une double barre oblique. donc ma solution est comme ça <? php echo '//'. $ _SERVER ["HTTP_HOST"]. $ _SERVER ["REQUEST_URI"]; ?>
rafi

6

Essayez de passer the_permalink()comme $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 );

ÉDITER:

Désolé, vous avez mal compris votre question à l'origine. Essaye ça:

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

Remarque également: une utilisation correcte de wp_redirect()nécessite généralement l'ajout exit;, que j'ai ajouté à mon deuxième exemple.


Cela n'a aucun sens, la redirection doit retourner à la maison, cela fonctionne bien, j'ai besoin d'un moyen pour attraper l'URL d'origine et rediriger l'utilisateur là-bas une fois qu'il se connecte.
Javier Villanueva

Désolé, vous avez mal compris votre question à l'origine. J'ai ajouté une modification qui, nous l'espérons, répond à votre cas d'utilisation.
Chip Bennett

4

Merci à tous, j'ai en quelque sorte utilisé un peu ce que tout le monde recommandait, donc à la fin mon code ressemble à ceci:

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

Et sur mon formulaire de connexion (je code en dur mon formulaire de connexion dans mon application, merci @Ashfame de m'avoir informé de wp_login_form, je ne savais pas qu'il existait) J'ai ajouté ceci lorsque les informations d'identification de l'utilisateur sont correctes et qu'elles sont prêtes à se connecter:

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

Merci beaucoup pour votre aide, j'ai voté pour tout le monde!


Salut Javier, dans quel fichier as-tu ajouté ces fonctions? Merci.
Tyler Durden

Infunctions.php
Javier Villanueva

4
Vous devez appeler exit()ou die()après wp_redirect(). Sinon, il est possible que le code après wp_redirect()s'exécute, ce qui peut entraîner des bogues et des failles de sécurité.
Ian Dunn

2

c'est mon code que j'utilise pour diriger vers la page de connexion wp. Puis, une fois connecté, ils sont retournés là où ils étaient. Mais ce n'est pas la page d'accueil mais la page de connexion wordpress où je configure la connexion personnalisée.

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

Vous voudrez peut-être faire des recherches avec. En règle générale, vous obtiendrez l'URL actuelle d'un utilisateur en$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]


0

Le login_redirectcrochet du filtre est ici une solution plus complète et efficace. De cette façon, vous pouvez proposer différents chemins de redirection pour différents niveaux d'utilisateurs, ou conserver l'URL de redirection en cas d'erreur lors de la connexion (par ex. Mot de passe incorrect).

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

Cela n'a fonctionné aucune de vos réponses mais seulement en ajoutant une petite chose, cela a fonctionné! Voici mon 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 );

Seulement, j'ai ajouté /wp-login.phppar rapport à la réponse de @ Matt, mais pour moi, c'est la clé. J'espère que cela pourra aider! :)

**ÉDITER:

J'ai détecté une ERREUR lorsque vous utilisez FORCE wordpress pour navegate en HTTPS. Cette méthode ne fonctionne pas car la redirection est en HTTP. Pour résoudre le problème, j'ai changé la fonction. Voici le résultat:

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

Je vérifie le protocole et je supprimé « esc_url» et ajouté le protocole approprié: $protocol://. J'ai aussi changé le "".

Je suis basé avec cette page .


0

Je sais que c'est super tard, mais j'ai fait un post sur exactement comment faire si des personnes futures le trouvent et en ont besoin:

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


Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien de référence. Les réponses de lien uniquement peuvent devenir invalides si la page liée change. Voir Comment répondre .
Gabriel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.