Redirecționează utilizatorul către URL-ul original după autentificare?
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!

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.

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?

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

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

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!

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

Ș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/

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

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

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

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