Reindirizzare l'utente all'URL originale dopo l'accesso?


16

Ho una funzione che reindirizza gli utenti alla pagina di accesso (home) se stanno tentando di accedere a qualsiasi altra pagina senza essere connessi, 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 );

Davvero semplice e funziona bene, il problema è che ho bisogno di reindirizzarli all'URL a cui stavano cercando di accedere dopo aver effettuato correttamente l'accesso, esattamente come funziona il backend di WordPress.

C'è un modo per fare questo? Grazie in anticipo!

Risposte:


16

Puoi farlo facilmente. Devi solo specificare un parametro di reindirizzamento. Se si utilizza un collegamento di accesso sulla home page per accedere alla pagina di accesso, la soluzione di @ sisir è corretta.

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] ); ?>

Se stai utilizzando un modulo personalizzato in prima pagina, quindi all'interno di <form>, assicurati di compilare un campo nascosto con l'URL per reindirizzare

<input type="hidden" name="redirect_to" value="<?php echo $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>" />

E se stai utilizzando wp_login_form()per generare il modulo, compila 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 altri parametri in base a ciò che hai o di cui hai bisogno.


sto usando un modulo personalizzato e sto usando la soluzione di campo nascosto fornita, ma nel mio caso vengo reindirizzato a un URL come questo "localhost / wordpress / localhost / wordpress / blog / qualcuno". qualsiasi aiuto?
rafi,

ho capito, sto usando una doppia barra. quindi la mia soluzione è come questa <? php echo '//'. $ _SERVER ["HTTP_HOST"]. $ _SERVER [ "REQUEST_URI"]; ?>
rafi

6

Prova a passare the_permalink()come $redirectargomento:

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

MODIFICARE:

Siamo spiacenti, ho capito male la tua domanda in origine. 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 anche: l'uso corretto di wp_redirect()generalmente richiede l'aggiunta exit;, che ho aggiunto al mio secondo esempio.


Non ha alcun senso, il reindirizzamento deve andare a casa, funziona benissimo Ho bisogno di un modo per catturare l'URL originale e reindirizzare l'utente lì una volta effettuato l'accesso.
Javier Villanueva

Siamo spiacenti, ho capito male la tua domanda in origine. Ho aggiunto una modifica che si spera risolva il tuo caso d'uso.
Chip Bennett,

4

Grazie a tutti, ho usato un po 'di quello che tutti hanno raccomandato, quindi alla fine il mio codice è simile al seguente:

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 accesso (sto codificando il mio modulo di accesso nella mia domanda grazie a @Ashfame per avermi informato di wp_login_form non avevo idea che esistesse) l'ho aggiunto quando le credenziali dell'utente vanno bene e sono pronte per il login:

if (isset($_REQUEST['redirect_to'])){
    wp_redirect($_REQUEST['redirect_to']);
    // wp_redirect() does not exit automatically, and should almost always be followed by a call to exit;
    exit;

} else {
    wp_redirect(get_bloginfo('url') . '/groups/');
    exit;
}

Grazie mille per il tuo aiuto, ho votato tutti!


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

Infunctions.php
Javier Villanueva,

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

2

questo è il mio codice che uso le persone per indirizzare alla pagina di accesso di wp. Quindi, una volta effettuato l'accesso, sono tornati dove erano. Ma non è la home page ma la pagina di accesso di wordpress in cui ho impostato l'accesso personalizzato.

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) ?>

Potresti voler fare ricerche con. In genere otterrai l'URL corrente di un utente da$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]


0

Il login_redirectgancio del filtro è una soluzione più completa ed efficace qui. 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 l'accesso (ad es. 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 );

0

Non ha funzionato nessuna delle tue risposte ma solo aggiungendo 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 possa aiutare! :)

**MODIFICARE:

Ho rilevato un ERRORE quando sei FORCE wordpress a navegate in HTTPS. Questo metodo non funziona perché il reindirizzamento è in HTTP. Per risolvere il problema ho cambiato 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 );

Posso controllare il protocollo e poi ho cancellato ' esc_url' e ha aggiunto il protocollo corretto: $protocol://. Inoltre ho cambiato il"" .

Sono basato su questa pagina .


0

So che questo è super in ritardo, ma ho pubblicato un post su come fare esattamente questo se qualcuno in futuro lo trova e ne ha 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 di solo collegamento possono diventare non valide se la pagina collegata cambia. Vedi come rispondere .
Gabriel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.