web-dev-qa-db-fra.com

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

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és, 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 bien, le problème est que je dois les rediriger vers l’URL qu’ils essayaient d’aller après s’être connectés avec succès, exactement comme le backend de WordPress.

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

15
Javier Villanueva

Merci à tous, j'ai utilisé un peu de ce que tout le monde a recommandé afin que 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 suis en train de coder 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 bonnes et qu'ils sont prêts à 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!

4
Javier Villanueva

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, dans le <form>, assurez-vous de renseigner un champ masqué 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, indiquez 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 ce que vous avez ou avez besoin.

15
Ashfame

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

MODIFIER:

Désolé, j'ai 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 );

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

6
Chip Bennett

c'est mon code que j'utilise pour diriger les gens vers la page de connexion wp. Puis, une fois connectés, ils sont retournés à leur lieu d'origine. Mais ce n’est pas la page d’accueil, mais la page de connexion wordpress où j’ai configuré la connexion personnalisée.

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

Vous voudrez peut-être faire des recherches avec. En général, vous obtiendrez l'URL actuelle d'un utilisateur par $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]

2
Sisir

Cela n'a pas fonctionné dans vos réponses, mais seulement dans l'ajout d'une petite chose, ça 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.php par rapport à la réponse de @ Matt, mais pour moi a été la clé. J'espère que cela pourra aider! :)

**MODIFIER:

J'ai détecté une erreur lorsque vous êtes forcé wordpress to navegate dans 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 );

J'ai vérifié le protocole, puis j'ai supprimé 'esc_url' et ajouté le protocole correct: $protocol://. Aussi j'ai changé le "".

Je suis basé avec cette page .

0
Neil

Je sais que c'est très tard, mais j'ai publié un article expliquant comment faire si les futurs utilisateurs trouvent cela et en ont besoin:

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

0
user90810

Le crochet de filtre login_redirect est ici une solution plus complète et plus 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 (mot de passe incorrect, par exemple).

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
Matt