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.