Redirecționare către pagina anterioară după autentificare
Nu folosesc niciun plugin de autentificare personalizat sau cod special. Câteva dintre paginile mele au acest cod la început.
<?php
if(!is_user_logged_in())
wp_redirect('/login/');
?>
Deci, acest cod nu permite utilizatorilor să vadă pagina când nu sunt autentificați. Am aceste pagini care conțin acest cod:
/wp-content/my-theme/my-account/
/wp-content/my-theme/my-account/world.php
/wp-content/my-theme/my-account/subscription.php
/wp-content/my-theme/my-dashboard.php
/wp-content/my-theme/my-files.php
Acum, când un utilizator accesează oricare dintre paginile de mai sus fără să fie autentificat, este redirecționat către pagina de autentificare, iar după autentificare ajunge pe pagina my-account/
.
Vreau să modific scenariul actual pentru a redirecționa utilizatorul către pagina de unde a venit. Am încercat următoarele lucruri, care nu au funcționat.
Folosind HTTP_REFERRER
În formularul login/
, am pus acest cod:
<input type="hidden" name="redirect" value="<?php echo $_SERVER['HTTP_REFERER']; ?>" />
Modificarea functions.php
În functions.php
, am pus acest cod:
if ( (isset($_GET['action']) && $_GET['action'] != 'logout') || (isset($_POST['login_location']) && !empty($_POST['login_location'])) ) {
add_filter('login_redirect', 'my_login_redirect', 10, 3);
function my_login_redirect() {
$location = $_SERVER['HTTP_REFERER'];
wp_safe_redirect($location);
exit();
}
}
Referințe:
- Redirecționare WordPress înapoi la pagina de referință după autentificare
- Sfat WordPress: Redirecționare către pagina anterioară după autentificare
Am încercat și acestea fără succes:
- Redirecționarea utilizatorilor către pagina de referință după autentificare folosind formular personalizat
- Redirecționare utilizator către URL-ul original după autentificare?
Nimic nu a funcționat. Sunt dispus să ofer mai multe detalii dacă este necesar. Mulțumesc anticipat. :)
Actualizare
Am modificat codul în acest fel:
<?php
if(!is_user_logged_in())
wp_redirect('/login/?redirect_to=' . $_SERVER["REQUEST_URI"]);
?>
Aceasta redă pagina de autentificare astfel:
/login.php?redirect_to=/my-account/subscription.php
Acest lucru ar fi suficient pentru autentificare și redirecționare. Dar trebuie să găsesc partea unde are loc redirecționarea efectivă și vreau să redirecționez folosind parametrul redirect_to
!

Nu sunt sigur că înțeleg configurația ta, dar iată câteva idei:
A) Afișează un link de login cu parametrul redirect_to
setat:
Poți adăuga următoarele în paginile tale cu șabloane personalizate:
if( ! is_user_logged_in() )
{
printf( '<a href="%s">%s</a>',
wp_login_url( get_permalink() ),
__( 'Trebuie să te autentifici pentru a vizualiza această pagină!', 'textdomain' )
);
}
Aceasta va genera un link de autentificare pentru vizitatorii anonimi, cu pagina curentă în parametrul GET redirect_to
.
B) Redirecționează către wp-login.php
cu parametrul redirect_to
setat:
Reține că apelul către wp_redirect()
trebuie să se întâmple înainte de trimiterea antetelor HTTP.
Putem folosi hook-ul template_redirect
:
add_action( 'template_redirect',
function()
{
if( ! is_user_logged_in()
&& is_page( array( 'member-page-1', 'member-page-2' ) )
)
{
wp_safe_redirect( wp_login_url( get_permalink() ) );
exit();
}
}
);
unde restricționăm accesul la paginile cu slug-urile member-page-1
și member-page-2
.
C) Formularul nativ de login (încorporat direct):
O altă opțiune ar fi să includeți formularul nativ de autentificare direct în conținutul paginii:
add_filter( 'the_content', function( $content ) {
if( ! is_user_logged_in()
&& is_page( array( 'member-page-1', 'member-page-2' ) )
)
$content = wp_login_form( array( 'echo' => 0 ) );
return $content;
}, PHP_INT_MAX );
unde restricționăm accesul la paginile cu slug-urile member-page-1
și member-page-2
.
Notă: Va trebui să te ocupi și de paginile de arhivă/index/căutare.
Actualizare: Am simplificat codul folosind funcția wp_login_url()
.

Am dat deja redirect_to
către login.php
. Verifică răspunsul actualizat. Dar după logare, se duce doar la my-account
, care trebuie înlocuit cu redirect_to
.

Reține că trebuie să folosești wp_redirect
înainte de trimiterea antetelor HTTP. Poți să utilizezi acțiunea template_redirect
, de exemplu.

Funcția wp_redirect()
este "pluggable", dar poți accesa și filtrul wp_redirect
.

Poți să o suprascrii cu propria ta funcție wp_redirect()
, dar nu recomand asta.

Răspuns bun, dar nu am reușit să funcționeze pe o pagină de login personalizată!

Dacă login.php
-ul tău personalizat funcționează cu parametrul redirect_to
, atunci cred că ar trebui să poți pur și simplu să înlocuiești wp-login.php
cu login.php
în fragmentul de cod de mai sus. PS: Presupun că folosești pagini WordPress și nu fișiere PHP simple.

Doar pagina de login personalizată nu funcționează. Originalul wp-login.php
funcționează cu redirecționare.

Acest lucru nu funcționează, dar accept răspunsul pentru munca ta depusă. Voi continua această discuție pe StackOverflow. Poți veni și acolo?

OK, mulțumesc, se pare că ai găsit o soluție în JavaScript care funcționează pentru tine acolo.

Folosind get_permalink()
, așa cum este sugerat în răspunsul acceptat, va funcționa doar dacă vă aflați într-un articol (de orice tip), dar nu va funcționa, de exemplu, dacă vă aflați într-o arhivă de categorii. Pentru a funcționa oriunde, este nevoie de URL-ul curent, indiferent de tipul de conținut pe care îl vizualizăm.
Pentru a obține URL-ul curent în WordPress, putem prelua cererea curentă din obiectul global $wp
și să o atașăm la URL-ul site-ului folosind add_query_arg()
. Putem folosi rezultatul în parametrul redirect_to
al funcției wp_login_url()
:
wp_login_url( site_url( add_query_arg( array(), $wp->request ) ) );
Aceeași abordare poate fi utilizată și cu wp_logout_url()
dacă este necesar:
wp_logout_url( site_url( add_query_arg( array(), $wp->request ) ) );

Proiectul a murit acum un an. Ei bine, care este rostul să răspundem acum? Pentru că ai citit măcar răspunsul anterior acceptat?

Da, am citit răspunsul anterior și cred că aș putea oferi un răspuns mai bun, poate nu pentru tine, dar pentru alții. Reține că acest site (și oricare dintre site-urile StackExchange în general) este folosit ca referință de mii de oameni și ei pot primi răspunsuri învechite; de aceea oferirea de răspunsuri noi sau actualizarea celor vechi este întotdeauna binevenită. Ține minte că ajutorul pe care îl primești aici nu este doar pentru tine.

Ha ha... Omule, am 62k pe StackOverflow. Înțeleg ce vrei să spui. Este un cod personalizat care a mers prost și nu sunt sigur că va ajuta? Oare va ajuta? Dacă da, îți mulțumesc foarte mult.

Nu am nicio îndoială că poate ajuta. De exemplu, această altă întrebare a fost marcată acum câteva minute ca fiind duplicat a celei pe care o discutăm.

De asemenea, puteți utiliza acest cod în pagina personalizată de autentificare
if ( ! is_user_logged_in() ) { // Afișează formularul WordPress de autentificare:
$args = array(
'redirect' => esc_url($_SERVER['HTTP_REFERER']),
'form_id' => 'loginform-custom',
'label_username' => __( 'Email' ),
'label_password' => __( 'Parolă' ),
'label_log_in' => __( 'Autentificare' ),
'remember' => false
);
wp_login_form($args);
echo '<p><a href="' . wp_lostpassword_url($redirect) .'">Parolă pierdută</a></p>';
}
Acest cod va redirecționa utilizatorul către pagina de referință după autentificare.

Aceasta a fost postată ca un răspuns, dar nu încearcă să răspundă la întrebare. Ar trebui probabil să fie o editare, un comentariu, altă întrebare sau ștearsă cu totul.

Acesta răspunde la întrebare. Puteți vedea că utilizatorul este redirecționat către pagina de login personalizată <?php
if(!is_user_logged_in())
wp_redirect('/login/');
?>

V-aș ruga să verific soluția întrebării pe StackOverflow...

Știu că e târziu, dar postez soluția pentru a putea ajuta pe cineva care are nevoie acum.
Iată ce fac eu și funcționează perfect.
function redirect_user_tologin(){
global $post;
$post_slug = $post->post_name;
if(!is_user_logged_in()){
if($post_slug == 'my-account') { //pot fi adăugate multiple condiții
//creează link dinamic pentru redirecționare
$redirect = urlencode(site_url().'/'.$post_slug);
//redirecționare
wp_safe_redirect(site_url().'/wp-login.php/?redirect_to=' .$redirect);
exit;
}
}
}
add_action('wp', 'redirect_to_login');
Explicație
Dacă utilizatorul nu este autentificat, atunci wp_safe_redirect
îl va redirecționa către pagina de login.
Pentru a redirecționa utilizatorul după autentificare, vom pasa link-ul paginii ca valoare în parametrul redirect_to
, astfel încât să fie redirecționat către acea pagină specifică.
URL-ul paginii de login: site_url().'/wp-login.php/'
Link-ul pentru redirecționare: redirect_to=' .$redirect
