Controlla se l'utente ha effettuato l'accesso utilizzando JQuery


17

Voglio eseguire il codice jquery personalizzato che mostra la finestra di dialogo di accesso all'utente se fa clic su un pulsante e non è connesso. Come potrei farlo?

Risposte:


26

Nel caso in cui desideri sapere se l'utente ha effettuato l'accesso al momento attuale. Le altre risposte controllano se l'utente ha effettuato l'accesso o meno quando la pagina non è stata caricata quando è in esecuzione il javascript. Ad esempio, l'utente potrebbe aver effettuato l'accesso in una scheda separata

Metti questo nel tuo javascript

var data = {
    action: 'is_user_logged_in'
};

jQuery.post(ajaxurl, data, function(response) {
    if(response == 'yes') {
        // user is logged in, do your stuff here
    } else {
        // user is not logged in, show login form here
    }
});

inseriscilo nelle tue funzioni.php

function ajax_check_user_logged_in() {
    echo is_user_logged_in()?'yes':'no';
    die();
}
add_action('wp_ajax_is_user_logged_in', 'ajax_check_user_logged_in');
add_action('wp_ajax_nopriv_is_user_logged_in', 'ajax_check_user_logged_in');

Qual è il valore di ajaxurl?
Feras Odeh,

wordpress lo imposta su 'yoursite.com/wp-admin/admin-ajax.php'. Questo è l'URL su cui dovrebbero essere inviate tutte le richieste
Ajax

Ho inserito jQuery.post nel gestore dei clic di jquery ma questo non funziona. hai idea di come risolverlo?
Feras Odeh,

Ho visto che ajaxurl non è definito nella console.
Feras Odeh,

1
[codex] (codex.wordpress.org/AJAX_in_Plugins) ha affermato che nelle ultime versioni di wordpress questo è già definito. Forse puoi definire la tua versione di ajaxurl con wp_localize_script
Mridul Aggarwal

32

Controlla l' classattributo per body: Se il tema utilizza body_class()il corpo ha una classe denominata logged-inper gli utenti che hanno effettuato l'accesso. Ricorda che la funzione può essere utilizzata htmlanche sull'elemento .

Esempio

if(jQuery('body').hasClass('logged-in')){
    // Do something
}

Puoi anche usare solo is_user_logged_in()una condizione per accodare o stampare lo script.


il massimo dei voti per questa risposta - semplice ed efficace.
Q Studio,

Mi piace l'idea di controllare il corpo per logged-inclasse. Devi solo essere sicuro che i temi utilizzino body_class();o get_body_class();Altrimenti, non è una soluzione super affidabile. Anche se uso queste funzioni nei miei temi, quindi questa è una buona soluzione per me. Grazie per l'idea semplice.
Michael Ecklund,

18

Aggiungi body_class () al tuo corpo html

<body <?php body_class(); ?>>
   //your html code
</body>

Ciò verrà aggiunto logged-inper l'utente registrato, quindi è possibile utilizzare il seguente codice jquery per eseguire il codice juqery personalizzato solo per l'utente registrato.

if ($('body').hasClass('logged-in')) {
       //execute your jquery code.
}

Non so perché questo sia stato votato in negativo. L'approccio è pienamente valido. +1
kaiser

Non lo so. Ho la stessa domanda La risposta è valida, ma perché votare in giù.
Monirul Islam

Hm. Forse perché usa jQuery invece che nel modo giusto (usando un filtro e il callback). Alcune persone sono allergiche a jQuery.
Kaiser

1
buono, ma non direbbe lo stato di accesso effettivo se si utilizza un plug-in di cache con cache di pagina abilitata.
Janos Szabo,

6

Un altro esempio, nel caso in cui si desideri utilizzarlo per le chiamate AJAX.

// Simplified... please note, that all names/vars/etc. in my class got unique names.
// ...the same goes for the script handler.
class wpse69814_example
{
    public $response;

    public function __construct()
    {
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue' ) );
        add_action( 'wp_enqueue_scripts', array( $this, 'localize' ), 20 );
    }

    public function enqueue()
    {
        wp_enqueue_script(
            'wpse69814_handler',
            plugins_url( 'url/to/file.js', __FILE__ ),
            array( 'jquery' ),
            filemtime( plugins_dir_path( __FILE__ ).'/path/to/file.js' ),
            true
        );
    }

    public function localize()
    {
        wp_localize_script( 'wpse69814_handler, 'wpse69814_object', array(
            'ajaxurl'    => admin_url( 'admin-ajax.php' ),
            'ajax_nonce' => wp_create_nonce( 'wpse69814_nonce' ),
            'action'     => 'wpse69814-handler-action',
            'data'       => array(
               'is_user_logged_in' => is_user_logged_in(),
            )
         )

    }
}

Da notare, questo approccio non funziona dietro CDN. : D
Brian Fegter,

@BrianFegter Potrebbe voler spiegare (o modificarlo in) perché? :)
Kaiser

Poiché la CDN non si autentica con WordPress, is_user_logged_inverrà memorizzata nella cache come falsa nel DOM quando viene colpita l'origine Lo stato utente deve essere estratto su un thread senza cache tramite XHR quando si utilizza una CDN. L'approccio di @Mridul Aggarwal funziona ma con le intestazioni senza cache nella risposta.
Brian Fegter,

@BrianFegter Buona cattura. Risolto questo ... penso. Ha valutato anche altre risposte.
Kaiser

2

Si noti che nessuno degli esempi precedenti è affidabile nel caso in cui si utilizzi un plug-in di cache della pagina, quindi il codice nel tag body sarà statico. Inoltre c'è un modo semplice per farlo (senza query extra su Ajax che non è ottimale)

Se si desidera verificare lo stato di accesso dell'utente con JavaScript, è possibile utilizzare questo codice per impostare i cookie quando l'utente ha effettuato l'accesso ed eliminare i cookie quando l'utente si è disconnesso. Aggiungi questo ad es. al tuo tema funzioni.php

function login_function() {
    setcookie('wp_user_logged_in', 1, time() + 31556926, '/');
    $_COOKIE['wp_user_logged_in'] = 1;
}
add_action('wp_login', 'login_function');

function logout_function() {
    unset($_COOKIE['wp_user_logged_in']);
    setcookie('wp_user_logged_in', null, -1, '/');
}
add_action('wp_logout', 'logout_function');

Quindi è un semplice test di cookie in JavaScript.

if (document.cookie.indexOf('wp_user_logged_in') !== -1) {
    //do something when user logged in
} else {
    //do something when user logged out
}

Questo è davvero piuttosto semplice, affidabile e nel peggiore dei casi si esegue quasi istantaneamente dopo il caricamento della pagina (se si carica lo script nel piè di pagina senza bloccare il rendering) a differenza di altre risposte. L'Ajax è lento e fare affidamento sulle classi del corpo fallirà nella memorizzazione nella cache. È necessario aggiungere questo cookie al testo della Politica sui cookie. Grazie Janos.
Ryszard Jędraszyk,

Come follow-up, c'è un problema con la sincronizzazione dei cookie WordPress predefiniti e dei cookie accessibili da script appena creati, ma ho ricevuto una risposta semplice e ottima su come risolverlo: stackoverflow.com/questions/56208574/…
Ryszard Jędraszyk
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.