Reindirizzare alla pagina di riferimento dopo il login

27 nov 2014, 14:30:05
Visualizzazioni: 49.4K
Voti: 7

Non sto utilizzando plugin di login personalizzati o codice specifico. Alcune delle mie pagine hanno questo pezzo di codice all'inizio.

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

Quindi, questo non permette agli utenti di visualizzare la pagina quando non sono loggati. Ho queste pagine che contengono questo codice:

/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

Ora, quando un utente va in una qualsiasi delle pagine sopra indicate, senza essere loggato, viene reindirizzato alla pagina di login, e quando l'utente effettua l'accesso, atterra nella pagina my-account/.

Voglio modificare lo scenario attuale per far reindirizzare l'utente alla pagina di riferimento da cui proveniva. Ho provato le seguenti soluzioni, che non hanno mai funzionato.

Utilizzo di HTTP_REFERRER

Nel form login/, ho inserito questo pezzo di codice:

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

Modifica di functions.php

Nel file functions.php, ho inserito questo pezzo di codice:

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

Riferimenti:


Ho anche provato questi e fallito:

Niente ha funzionato. Sono disponibile a fornire ulteriori dettagli se necessario. Grazie in anticipo. :)


Aggiornamento

Ho modificato il codice in questo modo:

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

Questo visualizza la pagina di login in questo modo:

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

Questo sarebbe sufficiente per autenticarmi e reindirizzare. Ma devo trovare il punto dove avviene il reindirizzamento reale e voglio reindirizzarlo utilizzando il parametro redirect_to!

2
Commenti

Hai mai trovato una soluzione a questo problema? Sto avendo lo stesso problema!

Tom Nolan Tom Nolan
7 giu 2015 19:31:56

@ThomasNolan In realtà ho usato una variabile temporanea! ;)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
8 giu 2015 07:46:53
Tutte le risposte alla domanda 4
12
13

Non sono sicuro di capire la tua configurazione, ma ecco alcune idee:

A) Mostra un link di login con il parametro redirect_to impostato:

Potresti aggiungere il seguente codice alle tue pagine di template personalizzate:

if( ! is_user_logged_in() )
{
    printf( '<a href="%s">%s</a>', 
        wp_login_url( get_permalink() ),
        __( 'Devi effettuare il login per visualizzare questa pagina!' )
    );
}

Questo genererà un link di login, per i visitatori anonimi, con la pagina corrente nel parametro GET redirect_to.

B) Reindirizza a wp-login.php con il parametro redirect_to impostato:

Nota che la chiamata a wp_redirect() deve avvenire prima dell'invio degli header HTTP.

Possiamo chiamarla all'interno dell'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();
        }
    }
);

dove limitiamo l'accesso alle pagine con gli slug member-page-1 e member-page-2.

C) Il form di login nativo (in-line):

Un'altra opzione sarebbe includere il form di login nativo direttamente nel contenuto della pagina:

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

dove limitiamo l'accesso alle pagine con gli slug member-page-1 e member-page-2.

Nota che dovresti gestire anche le pagine di archivio/indice/ricerca.

Aggiornamento: Ho semplificato usando la funzione wp_login_url().

27 nov 2014 15:19:18
Commenti

Ho già passato il parametro redirect_to alla pagina login.php. Controlla la risposta aggiornata. Ma dopo il login, viene reindirizzato a my-account, che dovrebbe essere sostituito con redirect_to.

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

Nota che devi usare wp_redirect prima che vengano inviati gli header HTTP. Potresti voler usare l'azione template_redirect, ad esempio.

birgire birgire
27 nov 2014 15:28:43

Ok, dove avviene il redirect()?

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

La funzione wp_redirect() è pluggable, ma puoi anche accedere al filtro wp_redirect.

birgire birgire
27 nov 2014 15:33:45

Non capisco. Cosa significa pluggable?

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

Puoi sovrascriverla con la tua funzione wp_redirect(), ma non lo consiglio.

birgire birgire
27 nov 2014 15:34:49

Ottima risposta, ma non sono riuscito a farla funzionare su una pagina di login personalizzata!

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

Se il tuo login.php personalizzato funziona con il parametro redirect_to, allora penso che dovresti semplicemente sostituire wp-login.php con login.php nel frammento di codice sopra. PS: presumo che tu stia usando pagine WordPress e non semplici file PHP.

birgire birgire
27 nov 2014 17:37:20

Il login personalizzato non funziona. L'originale wp-login.php funziona con il reindirizzamento.

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

Questo non funziona, ma accetto comunque la risposta per il tuo duro lavoro. Continuo la discussione su StackOverflow. Puoi venire lì?

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

ok grazie, sembra che tu abbia trovato una soluzione Javascript che funziona per te là.

birgire birgire
27 nov 2014 18:37:04

Sì amico, era un mio errore. Il codice personalizzato era in JavaScript! :)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov 2014 19:45:29
Mostra i restanti 7 commenti
5

Utilizzare get_permalink(), come suggerito nella risposta accettata, funzionerà solo se ci si trova in un post (di qualsiasi tipo) ma non funzionerà, ad esempio, se si è in un archivio di categoria. Per farlo funzionare ovunque, è necessario l'URL corrente, indipendentemente dal tipo di contenuto che stiamo visualizzando.

Per ottenere l'URL corrente in WordPress possiamo recuperare la richiesta corrente dall'oggetto globale $wp e aggiungerlo all'URL del sito utilizzando add_query_arg(). Possiamo utilizzare il risultato nel parametro redirect_to della funzione wp_login_url():

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

Lo stesso approccio può essere utilizzato con wp_logout_url() se necessario:

wp_logout_url( site_url( add_query_arg( array(), $wp->request ) ) );
1 dic 2015 09:11:24
Commenti

Il progetto è morto un anno fa. Beh, che senso ha rispondere ora? Perché, hai letto la risposta precedente che era stata accettata?

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 dic 2015 09:13:39

Sì, ho letto la risposta precedente e penso di poter dare una risposta migliore, magari non per te ma per altri. Tieni presente che questo sito (e in generale qualsiasi sito della rete StackExchange) viene utilizzato come riferimento da migliaia di persone e potrebbero trovare risposte obsolete; ecco perché fornire nuove risposte o aggiornare quelle vecchie è sempre ben accetto. Ricorda che l'aiuto che ricevi qui non è solo per te.

cybmeta cybmeta
1 dic 2015 09:20:24

Ah ah... Amico, ho 62k su StackOverflow. Capisco cosa intendi. È un codice personalizzato che è andato male, e non sono sicuro che possa aiutare? Lo farà? Se sì, grazie mille.

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 dic 2015 09:21:23

Non ho dubbi che possa aiutare. Ad esempio, questa altra domanda è stata segnata pochi minuti fa come duplicata di quella di cui stiamo discutendo.

cybmeta cybmeta
1 dic 2015 09:28:03

Ah ah... Va bene. Mi arrendo. Hai ragione! :)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 dic 2015 09:29:42
3

Puoi anche utilizzare questo codice nella tua pagina di login personalizzata

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

Questo reindirizzerà l'utente alla pagina di provenienza dopo il login.

6 lug 2016 08:46:25
Commenti

Questo è stato pubblicato come risposta, ma non tenta di rispondere alla domanda. Potrebbe essere una modifica, un commento, un'altra domanda o essere eliminato del tutto.

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
6 lug 2016 11:13:25

Questo effettivamente risponde alla domanda. Puoi vedere che l'utente viene reindirizzato alla pagina di login personalizzata <?php if(!is_user_logged_in()) wp_redirect('/login/'); ?>

KKumar KKumar
6 lug 2016 13:30:00

Gentilmente, vorrei verificare la soluzione alla domanda su StackOverflow...

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
6 lug 2016 13:46:19
1

So che è tardi, ma pubblico la soluzione in modo che possa aiutare qualcuno nel bisogno al momento.

Questo è quello che sto facendo e funziona perfettamente.

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

  if(!is_user_logged_in()){
      if($post_slug == 'my-account') { //puoi aggiungere più condizioni

          //crea il link dinamico per la pagina di reindirizzamento
          $redirect = urlencode(site_url().'/'.$post_slug);

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

Spiegazione

Se l'utente non è loggato, allora wp_safe_redirect porterà l'utente alla pagina di login.

Per reindirizzare l'utente dopo il login, passeremo il link della pagina come valore nel parametro redirect_to in modo che porti l'utente a quella specifica pagina.

URL della pagina di login: site_url().'/wp-login.php/'

Link di reindirizzamento: redirect_to=' .$redirect

20 gen 2020 08:05:33
Commenti

Grazie...

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
21 gen 2020 22:21:25