Redirecționează utilizatorul dacă este autentificat

26 apr. 2020, 14:35:39
Vizualizări: 2.83K
Voturi: 0

Acest script funcționează excelent și redirecționează utilizatorii nelogati către pagina de login dacă încearcă să acceseze pagina de cont.

// Redirecționează pagina de cont către pagina de login dacă utilizatorul nu este autentificat
add_action( 'template_redirect', function() {
    
      if ( is_user_logged_in() || ! is_page() ) return;
    
      $logged_in_restricted = array( 5156, 000 ); // toate paginile restricționate dacă utilizatorul nu este autentificat
    
      if ( in_array( get_queried_object_id(), $logged_out_restricted ) ) {
        wp_redirect( site_url( '/login' ) );  // pagina către care se face redirecționarea dacă restricția este îndeplinită
        exit();
      }
    
});

Cum pot folosi aceeași logică de script dar să țintesc utilizatorii autentificați în loc de cei neautentificați ca un script suplimentar? De exemplu, acum vreau să redirecționez utilizatorii autentificați către pagina "contul-meu" dacă încearcă să acceseze paginile de login/înregistrare. Iată un exemplu:

// Redirecționează paginile de login și înregistrare către pagina de cont dacă utilizatorul este autentificat
add_action( 'template_redirect', function() {
    
      if ( !is_user_logged_in() || ! is_page() ) return;
    
      $logged_in_restricted = array( 3156, 4532 ); // toate paginile restricționate dacă utilizatorul este autentificat
    
      if ( in_array( get_queried_object_id(), $logged_in_restricted ) ) {
        wp_redirect( site_url( '/my-account' ) );  // pagina către care se face redirecționarea dacă restricția este îndeplinită
        exit();
      }
    
});

Înțeleg că is_user_logged_out nu există. Ce pot folosi pentru a realiza acest lucru?

1
Comentarii

if ( ! is_user_logged_in() )

fuxia fuxia
26 apr. 2020 15:15:28
Toate răspunsurile la întrebare 2
0

Metoda 1

Poți folosi filtrul login_redirect pentru a adăuga o adresă URL de redirecționare la autentificare.

Filtrul primește 3 argumente

// vezi /wp-login.php
   /**
    * Filtrează URL-ul de redirecționare la autentificare.
    *
    * @since 3.0.0
    *
    * @param string           $redirect_to           URL-ul destinației de redirecționare.
    * @param string           $requested_redirect_to URL-ul solicitat de redirecționare transmis ca parametru.
    * @param WP_User|WP_Error $user                  Obiect WP_User dacă autentificarea a reușit, altfel obiect WP_Error.
    */

Următorul exemplu doar transmite URL-ul, dar poți pasa și argumentul $user și redirecționa în funcție de utilizatori diferiți.

add_filter( 'login_redirect', 'ws365094_logout_redirect_to', 10, 3 );
function ws365094_logout_redirect_to( $redirect_to_url, $requested_redirect_to, $user ) {
  // orice logică suplimentară

  return site_url( '/contul-meu' ); // doar transmite acest URL, după autentificare, va fi redirecționat de rutina originală WordPress
}

Metoda 2

Dacă ai un formular personalizat de autentificare, poți pasa variabila "redirect_to" deoarece wp-login.php va verifica dacă există. Dacă redirecționezi toți către același URL, această metodă este mai simplă decât Metoda 1.

  <input type="hidden" name="redirect_to" value="url_dorit" />

Pentru metoda ta originală de deconectare, poți folosi și filtrul logout_redirect pentru a adăuga un URL de redirecționare la deconectare în loc de acțiunea template_redirect. template_redirect este destul de universal dar are mai multe cazuri de utilizare în redirecționarea către un șablon specific (controlul șabloanelor). Doar o notă suplimentară pentru referință.

Comparație între secvența template_redirect și login_redirect

Conform secvenței de încărcare. Implicit, după autentificare, WordPress redirecționează utilizatorul către o pagină specifică pentru a face cookie-urile funcționale, lucru pe care l-am explicat aici anterior.

Autentificare -> Redirecționare -> Redirecționare Șablon (canonică) care este făcută de obicei de redirect_canonical() dacă slug-ul nu este găsit, merge la 404, dacă se folosește /?p=111, verifică dacă permalink-ul este utilizat, dacă da, direcționează către URL-ul structurat ca permalink și așa mai departe

Dacă folosești template_redirect, înseamnă că pagina este gestionată în template-loader.php. Devine

Autentificare -> Redirecționare -> Redirecționare Șablon (canonică) -> Redirecționare Șablon Personalizat

Deoarece urmează do_action( 'template_redirect' ) în template loader care se va încărca de mai multe ori în acest caz. O modalitate de a optimiza scriptul este folosirea unei priorități mai mari pentru hook-ul personalizat template_include astfel încât să verifice și să redirecționeze mai devreme, funcționând similar cu Login Redirect.

Deoarece atingerea template_redirect este puțin târzie din punct de vedere al timpului de încărcare. Deci încă nu este un loc ideal pentru a verifica autentificarea utilizatorului și redirecționarea către ceva care nu este legat de șabloane.

Așadar, dacă nu este necesar, cum ar fi rescrierea, structura URL personalizată sau pregătirea șabloanelor personalizate. Folosirea lui mai târziu nu este recomandată. De asemenea, dacă redirecționarea este gestionată necorespunzător, ar putea afecta și poziționarea SEO. Asta se bazează pe secvența reală de încărcare, punctul de vedere al optimizării SEO și experiența personală.

26 apr. 2020 14:48:17
0

Am fost foarte mulțumit de logica de mai sus și aveam nevoie doar de o mică modificare. Adăugarea unui ! înainte de is_user_logged_in() a rezolvat complet problema mea și mi-a permis să fac logica invers.

/**********************************START*************************************
********** Redirecționează pagina de cont către pagina de autentificare dacă utilizatorul este conectat *********
****************************************************************************/

add_action( 'template_redirect', function() {

  if ( ! is_user_logged_in() || ! is_page() ) return;

  $restricted = array( 4062, 4066 ); // toate paginile tale restricționate

  if ( in_array( get_queried_object_id(), $restricted ) ) {
    wp_redirect( site_url( '/cont' ) ); 
    exit();
  }

});
27 apr. 2020 01:44:35