Reindirizzare l'utente se è loggato | WordPress

26 apr 2020, 14:35:39
Visualizzazioni: 2.83K
Voti: 0

Questo script funziona perfettamente e reindirizza gli utenti non loggati alla pagina di login se cercano di accedere alla pagina my-account

// Reindirizza alla pagina di login se l'utente non è loggato
add_action( 'template_redirect', function() {
    
      if ( is_user_logged_in() || ! is_page() ) return;
    
      $logged_in_restricted = array( 5156, 000 ); // tutte le pagine ristrette se l'utente non è loggato
    
      if ( in_array( get_queried_object_id(), $logged_out_restricted ) ) {
        wp_redirect( site_url( '/login' ) );  // pagina di reindirizzamento se la restrizione è soddisfatta
        exit();
      }
    
});

Come posso utilizzare la stessa logica dello script ma indirizzare gli utenti loggati invece di quelli non loggati come script aggiuntivo? Ad esempio ora voglio reindirizzare gli utenti loggati alla pagina "my-account" se provano ad accedere alle pagine di login/registrazione. Ecco un esempio:

// Reindirizza le pagine di login e registrazione alla pagina account se l'utente è loggato 
add_action( 'template_redirect', function() {
    
      if ( is_user_logged_out() || ! is_page() ) return;
    
      $logged_in_restricted = array( 3156, 4532 ); // tutte le pagine ristrette se l'utente è loggato
    
      if ( in_array( get_queried_object_id(), $logged_in_restricted ) ) {
        wp_redirect( site_url( '/my-account' ) );  // pagina di reindirizzamento se la restrizione è soddisfatta
        exit();
      }
    
});

Capisco che is_user_logged_out non esiste. Cosa posso usare per ottenere questo risultato?

1
Commenti

if ( ! is_user_logged_in() )

fuxia fuxia
26 apr 2020 15:15:28
Tutte le risposte alla domanda 2
0

Metodo 1

Puoi utilizzare il filtro login_redirect per aggiungere un URL di reindirizzamento al login.

Il filtro passa 3 argomenti

// riferimento a /wp-login.php
   /**
    * Filtra l'URL di reindirizzamento al login.
    *
    * @since 3.0.0
    *
    * @param string           $redirect_to           L'URL di destinazione del reindirizzamento.
    * @param string           $requested_redirect_to L'URL di destinazione del reindirizzamento richiesto passato come parametro.
    * @param WP_User|WP_Error $user                  Oggetto WP_User se il login ha avuto successo, oggetto WP_Error altrimenti.
    */

Il seguente esempio passa semplicemente l'URL, puoi anche passare l'argomento $user e reindirizzare in base a diversi utenti.

add_filter( 'login_redirect', 'ws365094_logout_redirect_to', 10, 3 );
function ws365094_logout_redirect_to( $redirect_to_url, $requested_redirect_to, $user ) {
  // eventuale logica aggiuntiva

  return site_url( '/my-account' ); // passa semplicemente questo URL, dopo il login, verrà reindirizzato dalla routine di login originale di WordPress
}

Metodo 2

Se hai un modulo di login personalizzato, puoi passare la variabile "redirect_to" perché wp-login.php verificherà se è presente. Se reindirizzi tutti allo stesso URL, questo metodo è più semplice del metodo 1.

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

Per il tuo metodo di logout originale, potresti anche utilizzare il filtro logout_redirect per aggiungere un URL di reindirizzamento al logout invece dell'azione template_redirect. template_redirect è abbastanza universale ma ha più casi d'uso nel reindirizzamento a template specifici (controllo del template). Solo un'annotazione aggiuntiva per riferimento.

Confronto di sequenza tra template_redirect e login_redirect

Secondo la sequenza di caricamento. Di default, dopo il login, WordPress reindirizza l'utente a una pagina specifica per far funzionare il cookie, come ho spiegato qui in precedenza.

Login -> Reindirizzamento -> Reindirizzamento Template (canonico) che normalmente viene gestito da redirect_canonical() se lo slug non viene trovato, va alla 404, se si usa /?p=111, verifica se il permalink è in uso, in tal caso, reindirizza all'URL strutturato con permalink e così via

Se si usa template_redirect, significa che la pagina viene gestita in template-loader.php. Diventa quindi:

Login -> Reindirizzamento -> Reindirizzamento Template (canonico) -> Reindirizzamento Template Personalizzato

Perché segue do_action( 'template_redirect' ) nel template loader che verrà caricato più volte in questo caso. Un modo per ottimizzare lo script è utilizzare una priorità più alta per l'hook personalizzato template_include in modo che controlli e reindirizzi prima, funzionando in modo simile a Login Redirect.

Poiché raggiungere template_redirect è un po' tardivo nel tempo di caricamento. Quindi non è ancora il posto ideale per fare un controllo del login utente e reindirizzare da qualche parte che non riguardi i template.

Quindi, a meno che non sia necessario, come fare rewrite, struttura URL personalizzata o preparazione di template personalizzati. Usarlo in un secondo momento non è raccomandato. Inoltre, se il reindirizzamento viene gestito in modo poco abile, potrebbe anche influenzare il ranking SEO. Questo si basa sulla sequenza di caricamento effettiva, il punto di vista dell'ottimizzazione SEO e l'esperienza personale.

26 apr 2020 14:48:17
0

Ero molto soddisfatto della logica precedente e avevo solo bisogno di una piccola modifica. Aggiungere un ! prima di is_user_logged_in() ha risolto completamente il mio problema e mi ha permesso di invertire la logica.

/**********************************INIZIO************************************
********** Reindirizza la pagina dell'account alla pagina di login se l'utente è loggato *********
****************************************************************************/

add_action( 'template_redirect', function() {

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

  $restricted = array( 4062, 4066 ); // tutte le tue pagine con restrizioni

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

});
27 apr 2020 01:44:35