Redirecționează utilizatorul către URL-ul original după autentificare?

30 apr. 2011, 06:35:04
Vizualizări: 65.8K
Voturi: 18

Am o funcție care redirecționează utilizatorii către pagina de autentificare (prima pagină) dacă încearcă să acceseze orice altă pagină fără a fi autentificați. Iată cum funcționează:

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

Este foarte simplu și funcționează bine, problema este că trebuie să îi redirecționez către URL-ul pe care încercau să-l acceseze după ce se autentifică cu succes, exact cum funcționează interfața de administrare WordPress.

Există vreo modalitate de a face acest lucru? Mulțumesc anticipat!

0
Toate răspunsurile la întrebare 7
2
16

Poți face acest lucru cu ușurință. Trebuie doar să specifici un parametru de redirecționare. Dacă folosești un link de autentificare pe pagina principală pentru a accesa pagina de login, atunci soluția lui @sisir este corectă.

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

Dacă folosești un formular personalizat pe pagina principală, atunci în interiorul tag-ului <form>, asigură-te că completezi un câmp ascuns cu URL-ul pentru redirecționare

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

Și dacă folosești wp_login_form() pentru a genera formularul, atunci completează un parametru - 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' => __( 'Nume utilizator' ),
        'label_password' => __( 'Parolă' ),
        'label_remember' => __( 'Ține-mă minte' ),
        'label_log_in' => __( 'Autentificare' ),
        '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 );
?>

Modifică celelalte parametri în funcție de ceea ce ai sau de ce ai nevoie.

30 apr. 2011 13:43:56
Comentarii

Folosesc un formular personalizat și soluția ta cu câmpuri ascunse, dar în cazul meu sunt redirecționat către o adresă URL de genul 'localhost/wordpress/localhost/wordpress/blog/cineva'. Poți să mă ajuți?

rafi rafi
6 feb. 2014 08:15:56

Am rezolvat, foloseam dublă slash. Deci soluția mea arată așa <?php echo '//' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>

rafi rafi
6 feb. 2014 08:19:15
2

Încearcă să transmiți the_permalink() ca argument $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 );

EDITARE:

Scuze, am înțeles greșit întrebarea inițială. Încearcă asta:

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

De asemenea, reține: utilizarea corectă a wp_redirect() necesită de obicei adăugarea exit;, pe care am inclus-o în al doilea exemplu.

30 apr. 2011 06:42:23
Comentarii

Asta nu are niciun sens, redirecționarea trebuie să meargă către pagina principală, asta funcționează bine. Am nevoie de o metodă pentru a prinde URL-ul original și pentru a redirecționa utilizatorul acolo odată ce se autentifică.

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

Îmi cer scuze, am înțeles greșit întrebarea inițial. Am adăugat o modificare care sper că rezolvă cazul tău de utilizare.

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

Mulțumesc tuturor, am folosit un pic din ce a recomandat fiecare, așa că în final codul meu arată astfel:

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

Și pe formularul meu de autentificare (am hardcodat formularul de login în aplicația mea, mulțumesc @Ashfame pentru informația despre wp_login_form, nu știam că există) am adăugat asta când datele de autentificare sunt corecte și utilizatorul este gata să se autentifice:

if (isset($_REQUEST['redirect_to'])){
    wp_redirect($_REQUEST['redirect_to']);
    // wp_redirect() nu se încheie automat și ar trebui să fie urmat aproape întotdeauna de un apel exit;
    exit;

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

Mulțumesc mult pentru ajutor, am votat pozitiv pe toată lumea!

30 apr. 2011 19:41:27
Comentarii

Salut Javier, în ce fișier ai adăugat aceste funcții? Mulțumesc.

Tyler Durden Tyler Durden
24 aug. 2012 13:09:27

În functions.php

Javier Villanueva Javier Villanueva
25 aug. 2012 23:40:09

Ar trebui să apelezi exit() sau die() după wp_redirect(). Altfel, este posibil ca codul de după wp_redirect() să se execute, ceea ce poate duce la bug-uri și vulnerabilități de securitate.

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

Acesta este codul pe care îl folosesc pentru a direcționa utilizatorii către pagina de login WordPress. După autentificare, sunt redirecționați înapoi unde erau. Dar nu către pagina principală, ci către pagina de login WordPress unde am configurat un login personalizat.

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

Poate doriți să cercetați mai mult. De obicei, veți obține URL-ul curent al unui utilizator prin $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

30 apr. 2011 11:43:01
3

Știu că este foarte târziu, dar am făcut un articol despre exact cum să faci acest lucru, în cazul în care viitori cititori ajung aici și au nevoie de informații:

http://www.ryanprejean.com/force-login-with-redirect-and-exceptions/

17 mar. 2016 23:02:27
Comentarii

Deși acest link poate răspunde la întrebare, este mai bine să includeți părțile esențiale ale răspunsului aici și să furnizați linkul ca referință. Răspunsurile care conțin doar link-uri pot deveni invalide dacă pagina la care face referință se modifică. Consultați [răspuns].

Gabriel Gabriel
17 mar. 2016 23:37:09

Link-ul nu funcționează (aprilie 2020).

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

Am reușit să accesez link-ul defect cu ajutorul Wayback machine, în caz că mai are cineva nevoie de informații.

jsmod jsmod
26 oct. 2020 14:13:38
0

Filtrul login_redirect reprezintă o soluție mai completă și eficientă în acest caz. Astfel, poți oferi căi de redirecționare diferite pentru diferite niveluri de utilizatori sau poți menține URL-ul de redirecționare în cazul unei erori la autentificare (de ex. Parolă incorectă).

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 aug. 2014 18:24:16
0

Niciunul dintre răspunsurile voastre nu a funcționat, dar adăugând un mic detaliu, a mers! Iată codul meu:

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

Singurul lucru pe care l-am adăugat a fost /wp-login.php în comparație cu răspunsul lui @Matt, dar pentru mine a fost cheia. Sper că vă ajută! :)

**EDIT:

Am detectat o EROARE atunci când FORȚAȚI WordPress să navigheze în HTTPS. Această metodă nu funcționează deoarece redirecționarea este în HTTP. Pentru a rezolva problema, am modificat funcția. Iată rezultatul:

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

Am verificat protocolul și apoi am eliminat 'esc_url' și am adăugat protocolul corect: $protocol://. De asemenea, am schimbat "".

M-am bazat pe această pagină.

22 aug. 2014 15:11:08