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
.

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

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

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

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

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.

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

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

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

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?

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.

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.

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

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.

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/');
?>

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

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
