Reindirizzare alla pagina di riferimento dopo il login
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:
- Reindirizzare WordPress alla pagina di riferimento dopo il login
- Suggerimento WordPress: Reindirizzamento alla pagina precedente dopo il login
Ho anche provato questi e fallito:
- Reindirizzamento degli utenti alla pagina di riferimento dopo il login utilizzando un form di login personalizzato
- Reindirizzare l'utente all'URL originale dopo il login?
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!
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().
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
Nota che devi usare wp_redirect prima che vengano inviati gli header HTTP. Potresti voler usare l'azione template_redirect, ad esempio.
birgire
La funzione wp_redirect() è pluggable, ma puoi anche accedere al filtro wp_redirect.
birgire
Puoi sovrascriverla con la tua funzione wp_redirect(), ma non lo consiglio.
birgire
Ottima risposta, ma non sono riuscito a farla funzionare su una pagina di login personalizzata!
Praveen Kumar Purushothaman
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
Il login personalizzato non funziona. L'originale wp-login.php funziona con il reindirizzamento.
Praveen Kumar Purushothaman
Questo non funziona, ma accetto comunque la risposta per il tuo duro lavoro. Continuo la discussione su StackOverflow. Puoi venire lì?
Praveen Kumar Purushothaman
ok grazie, sembra che tu abbia trovato una soluzione Javascript che funziona per te là.
birgire
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 ) ) );
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
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
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
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
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.
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
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
Gentilmente, vorrei verificare la soluzione alla domanda su StackOverflow...
Praveen Kumar Purushothaman
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