web-dev-qa-db-fra.com

Rediriger vers une page de référence après la connexion

Je n'utilise aucun plugin de connexion personnalisé ni aucun code sur mesure. Quelques-unes de mes pages contiennent ce morceau de code au tout début.

<?php
    if(!is_user_logged_in())
        wp_redirect('/login/');
?>

Donc, cela ne permet pas aux utilisateurs de voir la page lorsqu'ils ne sont pas connectés. J'ai ces pages portant ce morceau de code:

/wp-content/my-theme/my-account/
/wp-content/my-theme/my-account/world.php
/wp-content/my-theme/my-account/subscription.php
/wp-content/my-theme/my-dashboard.php
/wp-content/my-theme/my-files.php

Désormais, lorsqu'un utilisateur accède à l'une des pages ci-dessus sans se connecter, il redirige vers la page de connexion et, lorsqu'il se connecte, il renvoie à la page my-account/.

Je souhaite modifier le scénario actuel pour que l'utilisateur redirige vers la page de renvoi, d'où il vient. J'ai essayé les choses suivantes, qui n'ont jamais fonctionné.

Utiliser un HTTP_REFERRER

Dans la forme login/, j'ai placé ce morceau de code:

<input type="hidden" name="redirect" value="<?php echo $_SERVER['HTTP_REFERER']; ?>" />

Piratage functions.php

Dans le functions.php, j'ai placé ce morceau de code:

if ( (isset($_GET['action']) && $_GET['action'] != 'logout') || (isset($_POST['login_location']) && !empty($_POST['login_location'])) ) {
        add_filter('login_redirect', 'my_login_redirect', 10, 3);
        function my_login_redirect() {
                $location = $_SERVER['HTTP_REFERER'];
                wp_safe_redirect($location);
                exit();
        }
}

Références:


J'ai aussi essayé ceux-ci et j'ai échoué:

Rien ne fonctionnait. Je suis heureux de fournir plus de détails si nécessaire. Merci d'avance. :)


Mettre à jour

J'ai modifié le code de cette façon:

<?php
    if(!is_user_logged_in())
        wp_redirect('/login/?redirect_to=' . $_SERVER["REQUEST_URI"]);
?>

Cela rend la page de connexion de la manière suivante:

/login.php?redirect_to=/my-account/subscription.php

Cela me suffirait pour authentifier et rediriger. Mais je dois trouver le bit où se trouve la vraie redirection et je veux le rediriger en utilisant le paramètre redirect_to!

Je ne suis pas sûr de comprendre votre configuration, mais voici quelques idées:

A) Affichez un lien de connexion avec le jeu de paramètres redirect_to:

Vous pouvez ajouter les éléments suivants à vos pages de modèles personnalisées:

if( ! is_user_logged_in() )
{
    printf( '<a href="%s">%s</a>', 
        wp_login_url( get_permalink() ),
        __( 'You need to login to view this page!' )
    );
}

Cela générera un lien de connexion, pour les visiteurs anonymes, avec la page actuelle dans le paramètre redirect_to GET.

B) Rediriger vers le wp-login.php avec le paramètre redirect_to défini:

Notez que l'appel à wp_redirect() doit avoir lieu avant l'envoi des en-têtes HTTP.

Nous pouvons l'appeler via le hook template_redirect:

add_action( 'template_redirect', 
    function()
    {
        if( ! is_user_logged_in() 
            && is_page( array( 'member-page-1', 'member-page-2' ) ) 
        )
        {
            wp_safe_redirect( wp_login_url( get_permalink() ) ); 
            exit();
        }
    }
);

où nous restreignons l'accès aux pages avec les slugs member-page-1 et member-page-2.

C) Le formulaire de connexion natif (en ligne):

Une autre option consisterait à inclure le formulaire de connexion natif directement dans le contenu de la page:

add_filter( 'the_content', function( $content ) {

    if( ! is_user_logged_in() 
        && is_page( array( 'member-page-1', 'member-page-2' ) ) 
    )
        $content = wp_login_form( array( 'echo' => 0 ) );

    return $content;
}, PHP_INT_MAX );

où nous restreignons l'accès aux pages avec les slugs member-page-1 et member-page-2.

Notez que vous devrez vous occuper des pages archive/index/search.

Mise à jour: Je l'ai simplifié à l'aide de la fonction wp_login_url() .

8
birgire

Usgin get_permalink(), comme suggéré dans la réponse acceptée, ne fonctionnera que si vous êtes dans une publication (de tout type) mais cela ne fonctionnera pas, par exemple, si vous êtes dans une archive de catégorie. Pour que cela fonctionne n'importe où, l'URL actuelle est nécessaire, quel que soit le type de contenu que nous voyons.

Pour obtenir l'URL actuelle dans WordPress, nous pouvons obtenir la demande actuelle à partir de l'objet global $wp et l'ajouter à l'URL du site à l'aide de add_query_arg(). Nous pouvons utiliser le résultat dans le paramètre redirect_to de la fonction wp_login_url():

wp_login_url( site_url( add_query_arg( array(), $wp->request ) ) );

La même approche peut être utilisée avec wp_logout_url() si nécessaire:

wp_logout_url( site_url( add_query_arg( array(), $wp->request ) ) );
2
cybmeta

Vous pouvez également utiliser ce code dans votre page de connexion personnalisée.

if ( ! is_user_logged_in() ) { // Display WordPress login form:
   $args = array(
    'redirect' => esc_url($_SERVER['HTTP_REFERER']), 
    'form_id' => 'loginform-custom',
    'label_username' => __( 'Email' ),
    'label_password' => __( 'Password' ),
    'label_log_in' => __( 'Log In' ),
    'remember' => false
);
wp_login_form($args);
echo '<p><a href="' . wp_lostpassword_url($redirect) .'">Lost Password</a></p>';
}

Cela redirigera l'utilisateur vers la page de référence, après la connexion.

0
KKumar