Reindirizzare l'utente all'URL originale dopo il login?
Ho una funzione che reindirizza gli utenti alla pagina di login (home) se stanno cercando di accedere a qualsiasi altra pagina senza essere loggati, ecco come funziona:
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
wp_redirect( get_option('home') );
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
Molto semplice e funziona bene, il problema è che ho bisogno di reindirizzarli all'URL che stavano cercando di visitare dopo che hanno effettuato l'accesso con successo, esattamente come funziona il backend di WordPress.
C'è un modo per farlo? Grazie in anticipo!

Puoi farlo facilmente. Devi solo specificare un parametro di reindirizzamento. Se stai usando un link di login nella homepage per accedere alla pagina di accesso, allora la soluzione di @sisir è corretta.
<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] ); ?>
Se stai usando un modulo personalizzato nella pagina principale, assicurati di inserire all'interno del tag <form>
un campo nascosto con l'URL per il reindirizzamento
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>" />
E se stai usando wp_login_form()
per generare il modulo, inserisci un parametro - http://codex.wordpress.org/Function_Reference/wp_login_form
<?php
$args = array(
'echo' => true,
'redirect' => site_url( $_SERVER['REQUEST_URI'] ),
'form_id' => 'loginform',
'label_username' => __( 'Username' ),
'label_password' => __( 'Password' ),
'label_remember' => __( 'Remember Me' ),
'label_log_in' => __( 'Log In' ),
'id_username' => 'user_login',
'id_password' => 'user_pass',
'id_remember' => 'rememberme',
'id_submit' => 'wp-submit',
'remember' => true,
'value_username' => NULL,
'value_remember' => false );
wp_login_form( $args );
?>
Modifica gli altri parametri in base a ciò che hai o di cui hai bisogno.

sto utilizzando un modulo personalizzato e sto usando la tua soluzione con il campo nascosto fornito, ma nel mio caso vengo reindirizzato a un URL come questo 'localhost/wordpress/localhost/wordpress/blog/someone'. Qualche aiuto?

Prova a passare the_permalink()
come argomento $redirect
:
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
wp_redirect( the_permalink() );
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
MODIFICA:
Scusa, inizialmente ho frainteso la tua domanda. Prova questo:
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
$redirect = home_url() . '/wp-login.php?redirect_to=' . urlencode( $_SERVER['REQUEST_URI'] );
wp_redirect( $redirect );
exit;
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
Nota inoltre: l'uso corretto di wp_redirect()
generalmente richiede l'aggiunta di exit;
, che ho inserito nel mio secondo esempio.

Non ha alcun senso, il reindirizzamento deve andare alla home, quello funziona bene. Ho bisogno di un modo per catturare l'URL originale e reindirizzare l'utente lì una volta effettuato il login.

Grazie a tutti, ho utilizzato un po' di ciò che ognuno ha consigliato, quindi alla fine il mio codice è risultato così:
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) );
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
E sul mio modulo di login (sto hardcodando il modulo di login nella mia applicazione, grazie @Ashfame per avermi fatto scoprire wp_login_form, non sapevo esistesse) ho aggiunto questo quando le credenziali dell'utente sono corrette e sono pronti per il login:
if (isset($_REQUEST['redirect_to'])){
wp_redirect($_REQUEST['redirect_to']);
// wp_redirect() non termina automaticamente, e dovrebbe quasi sempre essere seguito da una chiamata a exit;
exit;
} else {
wp_redirect(get_bloginfo('url') . '/groups/');
exit;
}
Grazie mille per il vostro aiuto, ho votato positivamente tutti!

Questo è il mio codice che uso per indirizzare le persone alla pagina di login di WordPress. Poi, una volta effettuato l'accesso, vengono reindirizzati alla pagina da cui provenivano. Ma non è la homepage bensì la pagina di login di WordPress dove ho configurato un login personalizzato.
<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) ?>
Potresti voler fare delle ricerche in merito. Tipicamente otterrai l'URL corrente di un utente con $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

So che è molto in ritardo, ma ho scritto un post che spiega esattamente come fare questo se qualcuno in futuro lo troverà e ne avrà bisogno:
http://www.ryanprejean.com/force-login-with-redirect-and-exceptions/

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte costituite solo da collegamenti possono diventare non valide se la pagina collegata cambia. Vedi [risposta].

Sono riuscito ad accedere al collegamento rotto con la Wayback machine, nel caso qualcun altro abbia bisogno delle informazioni.

Il login_redirect
filter hook è una soluzione più completa ed efficace in questo caso. In questo modo, puoi offrire percorsi di reindirizzamento diversi per diversi livelli di utenti, o mantenere l'URL di reindirizzamento in caso di errore durante il login (ad esempio Password Errata).
function login_redirect( $redirect_to, $request, $user ){
if(isset($_REQUEST['redirect_to'])){
return $_REQUEST['redirect_to'];
}
return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
$redirect = home_url() . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
wp_redirect( $redirect );
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

Nessuna delle vostre risposte ha funzionato, ma aggiungendo solo una piccola cosa, ha funzionato! Ecco il mio codice:
function login_redirect( $redirect_to, $request, $user ){
if(isset($_REQUEST['redirect_to'])){
return $_REQUEST['redirect_to'];
}
return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
$redirect = home_url() . '/wp-login.php?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]));
wp_redirect( $redirect );
exit;
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
Ho solo aggiunto /wp-login.php
rispetto alla risposta di @Matt, ma per me è stata la chiave. Spero che aiuti! :)
**MODIFICA:
Ho rilevato un ERRORE quando si FORZA WordPress a navigare in HTTPS. Questo metodo non funziona perché il reindirizzamento è in HTTP. Per risolvere il problema ho modificato la funzione. Questo è il risultato:
function restrict_access_if_logged_out(){
global $wp;
$protocol='http';
if (isset($_SERVER['HTTPS']))
if (strtoupper($_SERVER['HTTPS'])=='ON')
$protocol='https';
if (!is_user_logged_in() && !is_home() && ($wp->query_vars['pagename'] != 'downloads') ){
$redirect = home_url() . "/wp-login.php?redirect_to= $protocol://" . $_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]);
wp_redirect( $redirect );
exit;
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
Controllo il protocollo e poi ho rimosso 'esc_url
' e aggiunto il protocollo corretto: $protocol://
. Ho anche cambiato le ""
.
Mi sono basato su questa pagina.
