Redirecționare către pagina anterioară după autentificare

27 nov. 2014, 14:30:05
Vizualizări: 49.4K
Voturi: 7

Nu folosesc niciun plugin de autentificare personalizat sau cod special. Câteva dintre paginile mele au acest cod la început.

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

Deci, acest cod nu permite utilizatorilor să vadă pagina când nu sunt autentificați. Am aceste pagini care conțin acest cod:

/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

Acum, când un utilizator accesează oricare dintre paginile de mai sus fără să fie autentificat, este redirecționat către pagina de autentificare, iar după autentificare ajunge pe pagina my-account/.

Vreau să modific scenariul actual pentru a redirecționa utilizatorul către pagina de unde a venit. Am încercat următoarele lucruri, care nu au funcționat.

Folosind HTTP_REFERRER

În formularul login/, am pus acest cod:

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

Modificarea functions.php

În functions.php, am pus acest cod:

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

Referințe:


Am încercat și acestea fără succes:

Nimic nu a funcționat. Sunt dispus să ofer mai multe detalii dacă este necesar. Mulțumesc anticipat. :)


Actualizare

Am modificat codul în acest fel:

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

Aceasta redă pagina de autentificare astfel:

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

Acest lucru ar fi suficient pentru autentificare și redirecționare. Dar trebuie să găsesc partea unde are loc redirecționarea efectivă și vreau să redirecționez folosind parametrul redirect_to!

2
Comentarii

Ai găsit vreodată o soluție la această problemă? Am aceeași problemă!

Tom Nolan Tom Nolan
7 iun. 2015 19:31:56

@ThomasNolan De fapt, am folosit o variabilă temporară! ;)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
8 iun. 2015 07:46:53
Toate răspunsurile la întrebare 4
12
13

Nu sunt sigur că înțeleg configurația ta, dar iată câteva idei:

A) Afișează un link de login cu parametrul redirect_to setat:

Poți adăuga următoarele în paginile tale cu șabloane personalizate:

if( ! is_user_logged_in() )
{
    printf( '<a href="%s">%s</a>', 
        wp_login_url( get_permalink() ),
        __( 'Trebuie să te autentifici pentru a vizualiza această pagină!', 'textdomain' )
    );
}

Aceasta va genera un link de autentificare pentru vizitatorii anonimi, cu pagina curentă în parametrul GET redirect_to.

B) Redirecționează către wp-login.php cu parametrul redirect_to setat:

Reține că apelul către wp_redirect() trebuie să se întâmple înainte de trimiterea antetelor HTTP.

Putem folosi hook-ul 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();
        }
    }
);

unde restricționăm accesul la paginile cu slug-urile member-page-1 și member-page-2.

C) Formularul nativ de login (încorporat direct):

O altă opțiune ar fi să includeți formularul nativ de autentificare direct în conținutul paginii:

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

unde restricționăm accesul la paginile cu slug-urile member-page-1 și member-page-2.

Notă: Va trebui să te ocupi și de paginile de arhivă/index/căutare.

Actualizare: Am simplificat codul folosind funcția wp_login_url().

27 nov. 2014 15:19:18
Comentarii

Am dat deja redirect_to către login.php. Verifică răspunsul actualizat. Dar după logare, se duce doar la my-account, care trebuie înlocuit cu redirect_to.

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov. 2014 15:21:54

Reține că trebuie să folosești wp_redirect înainte de trimiterea antetelor HTTP. Poți să utilizezi acțiunea template_redirect, de exemplu.

birgire birgire
27 nov. 2014 15:28:43

Bine, unde se întâmplă redirect()?

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov. 2014 15:30:26

Funcția wp_redirect() este "pluggable", dar poți accesa și filtrul wp_redirect.

birgire birgire
27 nov. 2014 15:33:45

Nu înțeleg. Ce înseamnă "pluggable"?

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov. 2014 15:34:16

Poți să o suprascrii cu propria ta funcție wp_redirect(), dar nu recomand asta.

birgire birgire
27 nov. 2014 15:34:49

Răspuns bun, dar nu am reușit să funcționeze pe o pagină de login personalizată!

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov. 2014 16:26:54

Dacă login.php-ul tău personalizat funcționează cu parametrul redirect_to, atunci cred că ar trebui să poți pur și simplu să înlocuiești wp-login.php cu login.php în fragmentul de cod de mai sus. PS: Presupun că folosești pagini WordPress și nu fișiere PHP simple.

birgire birgire
27 nov. 2014 17:37:20

Doar pagina de login personalizată nu funcționează. Originalul wp-login.php funcționează cu redirecționare.

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov. 2014 17:48:37

Acest lucru nu funcționează, dar accept răspunsul pentru munca ta depusă. Voi continua această discuție pe StackOverflow. Poți veni și acolo?

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov. 2014 17:52:46

OK, mulțumesc, se pare că ai găsit o soluție în JavaScript care funcționează pentru tine acolo.

birgire birgire
27 nov. 2014 18:37:04

Da, prietene, a fost greșeala mea. Codul personalizat era unul în JavaScript! :)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov. 2014 19:45:29
Arată celelalte 7 comentarii
5

Folosind get_permalink(), așa cum este sugerat în răspunsul acceptat, va funcționa doar dacă vă aflați într-un articol (de orice tip), dar nu va funcționa, de exemplu, dacă vă aflați într-o arhivă de categorii. Pentru a funcționa oriunde, este nevoie de URL-ul curent, indiferent de tipul de conținut pe care îl vizualizăm.

Pentru a obține URL-ul curent în WordPress, putem prelua cererea curentă din obiectul global $wp și să o atașăm la URL-ul site-ului folosind add_query_arg(). Putem folosi rezultatul în parametrul redirect_to al funcției wp_login_url():

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

Aceeași abordare poate fi utilizată și cu wp_logout_url() dacă este necesar:

wp_logout_url( site_url( add_query_arg( array(), $wp->request ) ) );
1 dec. 2015 09:11:24
Comentarii

Proiectul a murit acum un an. Ei bine, care este rostul să răspundem acum? Pentru că ai citit măcar răspunsul anterior acceptat?

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 dec. 2015 09:13:39

Da, am citit răspunsul anterior și cred că aș putea oferi un răspuns mai bun, poate nu pentru tine, dar pentru alții. Reține că acest site (și oricare dintre site-urile StackExchange în general) este folosit ca referință de mii de oameni și ei pot primi răspunsuri învechite; de aceea oferirea de răspunsuri noi sau actualizarea celor vechi este întotdeauna binevenită. Ține minte că ajutorul pe care îl primești aici nu este doar pentru tine.

cybmeta cybmeta
1 dec. 2015 09:20:24

Ha ha... Omule, am 62k pe StackOverflow. Înțeleg ce vrei să spui. Este un cod personalizat care a mers prost și nu sunt sigur că va ajuta? Oare va ajuta? Dacă da, îți mulțumesc foarte mult.

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 dec. 2015 09:21:23

Nu am nicio îndoială că poate ajuta. De exemplu, această altă întrebare a fost marcată acum câteva minute ca fiind duplicat a celei pe care o discutăm.

cybmeta cybmeta
1 dec. 2015 09:28:03

Ha ha... Bine. Renunț. Ai dreptate! :)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 dec. 2015 09:29:42
3

De asemenea, puteți utiliza acest cod în pagina personalizată de autentificare

if ( ! is_user_logged_in() ) { // Afișează formularul WordPress de autentificare:
   $args = array(
    'redirect' => esc_url($_SERVER['HTTP_REFERER']), 
    'form_id' => 'loginform-custom',
    'label_username' => __( 'Email' ),
    'label_password' => __( 'Parolă' ),
    'label_log_in' => __( 'Autentificare' ),
    'remember' => false
);
wp_login_form($args);
echo '<p><a href="' . wp_lostpassword_url($redirect) .'">Parolă pierdută</a></p>';
}

Acest cod va redirecționa utilizatorul către pagina de referință după autentificare.

6 iul. 2016 08:46:25
Comentarii

Aceasta a fost postată ca un răspuns, dar nu încearcă să răspundă la întrebare. Ar trebui probabil să fie o editare, un comentariu, altă întrebare sau ștearsă cu totul.

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
6 iul. 2016 11:13:25

Acesta răspunde la întrebare. Puteți vedea că utilizatorul este redirecționat către pagina de login personalizată <?php if(!is_user_logged_in()) wp_redirect('/login/'); ?>

KKumar KKumar
6 iul. 2016 13:30:00

V-aș ruga să verific soluția întrebării pe StackOverflow...

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
6 iul. 2016 13:46:19
1

Știu că e târziu, dar postez soluția pentru a putea ajuta pe cineva care are nevoie acum.

Iată ce fac eu și funcționează perfect.

function redirect_user_tologin(){
  global $post;
  $post_slug = $post->post_name;

  if(!is_user_logged_in()){
      if($post_slug == 'my-account') { //pot fi adăugate multiple condiții

          //creează link dinamic pentru redirecționare
          $redirect = urlencode(site_url().'/'.$post_slug);

          //redirecționare
          wp_safe_redirect(site_url().'/wp-login.php/?redirect_to=' .$redirect);
          exit;
       }
   }
}
add_action('wp', 'redirect_to_login');

Explicație

Dacă utilizatorul nu este autentificat, atunci wp_safe_redirect îl va redirecționa către pagina de login.

Pentru a redirecționa utilizatorul după autentificare, vom pasa link-ul paginii ca valoare în parametrul redirect_to, astfel încât să fie redirecționat către acea pagină specifică.

URL-ul paginii de login: site_url().'/wp-login.php/'

Link-ul pentru redirecționare: redirect_to=' .$redirect

20 ian. 2020 08:05:33
Comentarii

Mulțumesc...

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
21 ian. 2020 22:21:25