web-dev-qa-db-fra.com

Redirection de l'utilisateur vers l'URL de destination après la connexion

Scénario: si l'utilisateur ne se connecte pas, redirige l'utilisateur pour personnaliser la page de connexion, puis redirige vers la page de destination après la connexion. Je n'utilise pas de fonction ou plugin. Ce code à la page de restriction:

if (!is_user_logged_in()){ wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]) );
}

avec succès pour la connexion de l'utilisateur, mais dans la page de connexion, l'URL devient? page = login et ne peut pas rediriger l'URL vers la page de destination Comment le faire? Quelqu'un pourrait aider, s'il vous plaît?

7
Juan Lie

J'ai fait quelque chose de similaire récemment.

1. Si l'utilisateur n'est pas connecté, j'ai capturé l'URL de la page souhaitée/de destination et l'a ajouté sous la forme d'un argument de requête à l'URL de la page de connexion.

2. Redirige l'utilisateur vers la page de connexion.

function wpa_59205_redirect(){
    global $post;
    if ( ! is_user_logged_in() ) {
                // this will tack on the current page's url as a query arg for the login page's url
        $redirect = add_query_arg( 'redirect_to', get_permalink( $post->ID ), $url_of_your_login_page_here );
                // redirect to the login page
        wp_redirect( $redirect );
        exit();
    }
}
add_action( 'template_redirect', 'wpa_59205_redirect' );

3. Vous pouvez ensuite filtrer l'URL vers laquelle l'utilisateur est redirigé après la connexion, à l'aide du filtre login_redirect. Il suffit de vérifier la présence de votre requête var précédemment ajoutée:

function wpa_59205_login_redirect( $redirect_to ){
    if( isset( $_REQUEST['redirect_to'] ) ) {
        return $_REQUEST['redirect_to'];
    } else {
        return $redirect_to;
    }
}
add_filter( 'login_redirect', 'wpa_59205_login_redirect');

J'ai fait cela avec une page de connexion WooCommerce, donc je filtrais leur filtre de redirection de connexion propriétaire, mais login_redirect est la version par défaut WP de sorte que je pense cela devrait fonctionner pas testé.

3
helgatheviking

Votre extrait devrait fonctionner correctement.

Tout d'abord, votre formulaire de connexion personnalisé peut ne pas respecter redirect_to. wp-login.php le fait, mais vous devrez également envoyer l'argument redirect_to à la soumission du formulaire wp-login.php. Montrez le code de votre formulaire de connexion.

Vous devez faire attention à la façon dont vous utilisez wp_redirect. Cela fonctionne en envoyant des en-têtes:

<?php
/**
 * Redirects to another page.
 *
 * @since 1.5.1
 * @uses apply_filters() Calls 'wp_redirect' hook on $location and $status.
 *
 * @param string $location The path to redirect to
 * @param int $status Status code to use
 * @return bool False if $location is not set
 */
function wp_redirect($location, $status = 302) {
    global $is_IIS;

    $location = apply_filters('wp_redirect', $location, $status);
    $status = apply_filters('wp_redirect_status', $status, $location);

    if ( !$location ) // allows the wp_redirect filter to cancel a redirect
        return false;

    $location = wp_sanitize_redirect($location);

    if ( !$is_IIS && php_sapi_name() != 'cgi-fcgi' )
        status_header($status); // This causes problems on IIS and some FastCGI setups

    header("Location: $location", true, $status);
}

Donc, si des parties de vos pages ont déjà été chargées et que vous n'utilisez pas la mise en mémoire tampon de sortie , cela ne fonctionnera pas. Headers already sent et toutes ces affaires.

Si tel est le cas, vous feriez mieux de simplement afficher un message avec un lien vers le formulaire de connexion ou d'afficher le formulaire lui-même (par exemple. wp_login_form ).

Deuxièmement, vous devez toujours appeler exit ou die après avoir utilisé wp_redirect pour exécuter le script PHP (par exemple, WordPress), envoyer des en-têtes et des mises à jour. Sinon, des éléments plus bas sur la page risquent de tuer vos en-têtes de redirection.

<?php
wp_redirect(site_url('wp-login.php'));
exit;

Enfin, si vous souhaitez inclure l'hôte dans votre URL redirect_to, vous devez inclure le protocole.

Vous pouvez aussi simplement utiliser $_SERVER['REQUEST_URI'].

<?php
$url = add_query_arg('redirect_to', $_SERVER['REQUEST_URI'], site_url('wp-login.php'));
wp_redirect($url);
exit;
2
chrisguitarguy

Remarque: wp_redirect ne sera pas appelé si la page a démarré. Assurez-vous de l'appeler plus haut.

<?php 

    if (!is_user_logged_in()){
        $current_url = $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"];
        wp_redirect( wp_login_url( $current_url ) ); 
        exit;
    }
?> 

wp_redirect: http://codex.wordpress.org/Function_Reference/wp_redirect

wp_login_url: http://codex.wordpress.org/Function_Reference/wp_login_url

0
AnupRaj