Reindirizzare l'utente all'URL originale dopo il login?

30 apr 2011, 06:35:04
Visualizzazioni: 65.8K
Voti: 18

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!

0
Tutte le risposte alla domanda 7
2
16

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.

30 apr 2011 13:43:56
Commenti

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?

rafi rafi
6 feb 2014 08:15:56

ho capito il problema, sto usando il doppio slash. quindi la mia soluzione è questa <?php echo '//' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>

rafi rafi
6 feb 2014 08:19:15
2

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.

30 apr 2011 06:42:23
Commenti

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.

Javier Villanueva Javier Villanueva
30 apr 2011 08:12:44

Scusa, avevo frainteso la tua domanda inizialmente. Ho aggiunto una modifica che spero risolva il tuo caso d'uso.

Chip Bennett Chip Bennett
30 apr 2011 15:34:20
3

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!

30 apr 2011 19:41:27
Commenti

Ciao Javier, in quale file hai aggiunto queste funzioni? Grazie.

Tyler Durden Tyler Durden
24 ago 2012 13:09:27

In functions.php

Javier Villanueva Javier Villanueva
25 ago 2012 23:40:09

Dovresti chiamare exit() o die() dopo wp_redirect(). Altrimenti è possibile che il codice dopo wp_redirect() venga eseguito, il che può portare a bug e vulnerabilità di sicurezza.

Ian Dunn Ian Dunn
6 nov 2012 19:21:38
0

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"]

30 apr 2011 11:43:01
3

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/

17 mar 2016 23:02:27
Commenti

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].

Gabriel Gabriel
17 mar 2016 23:37:09

Il collegamento non funziona (aprile 2020).

Philip Jones Philip Jones
22 apr 2020 16:01:55

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

jsmod jsmod
26 ott 2020 14:13:38
0

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 );
12 ago 2014 18:24:16
0

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.

22 ago 2014 15:11:08