Vérifiez si l'utilisateur est connecté à l'aide de JQuery

17

Je veux exécuter un code jquery personnalisé qui affiche la boîte de dialogue de connexion à l'utilisateur s'il clique sur un bouton et qu'il n'est pas connecté. Comment pourrais-je faire cela?

Feras Odeh
la source

Réponses:

26

Dans le cas où vous souhaitez savoir si l'utilisateur est connecté au moment actuel. Les autres réponses vérifient si l'utilisateur est connecté ou non lorsque la page est chargée, pas au moment où vous exécutez le javascript. L'utilisateur aurait pu se connecter dans un onglet séparé par exemple

Mettez ceci dans votre 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
    }
});

mettez ceci dans vos fonctions.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');
Mridul Aggarwal
la source
Quelle est la valeur de ajaxurl?
Feras Odeh
wordpress le définit sur «yoursite.com/wp-admin/admin-ajax.php». C'est l'url sur laquelle toutes les demandes ajax sont censées être envoyées
Mridul Aggarwal
J'ai mis jQuery.post dans le gestionnaire de clics jquery mais cela ne fonctionne pas. avez-vous une idée de comment le résoudre?
Feras Odeh
J'ai vu que ajaxurl n'est pas défini dans la console.
Feras Odeh
1
[codex] (codex.wordpress.org/AJAX_in_Plugins) a déclaré que dans les dernières versions de wordpress, cela était déjà défini. Vous pouvez peut-être définir votre propre version d'ajaxurl avec wp_localize_script
Mridul Aggarwal
32

Vérifiez l' classattribut pour body: Si le thème utilise body_class()le corps a une classe nommée logged-inpour les utilisateurs qui sont connectés. Soyez conscient que la fonction peut également être utilisée sur l'élément html.

Exemple

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

Vous pouvez également simplement l'utiliser is_user_logged_in()comme condition pour mettre en file d'attente ou imprimer le script.

fuxia
la source
meilleures notes pour cette réponse - simple et efficace.
Q Studio
J'aime l'idée de simplement vérifier le corps pour les logged-incours. Il suffit de s'assurer que les thèmes utilisent body_class();ou get_body_class();sinon, ce n'est pas une solution super fiable. Bien que j'utilise ces fonctions dans mes thèmes, c'est donc une bonne solution pour moi. Merci pour l'idée simple.
Michael Ecklund
18

Veuillez ajouter body_class () à votre corps html

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

Cela ajoutera logged-inpour l'utilisateur connecté, vous pouvez utiliser le code jquery suivant pour exécuter votre code juqery personnalisé uniquement pour l'utilisateur connecté.

if ($('body').hasClass('logged-in')) {
       //execute your jquery code.
}
Monirul Islam
la source
Je ne sais pas pourquoi celui-ci a été rejeté. L'approche est pleinement valable. +1
kaiser
Je ne sais pas. J'ai la même question. La réponse est valable mais pourquoi voter contre.
Monirul Islam
Hm. Peut-être parce qu'il utilise jQuery au lieu de la bonne façon (en utilisant un filtre et le rappel). Certaines personnes sont allergiques à jQuery.
kaiser
1
bon, mais il ne dirait pas l'état de connexion réel si vous utilisez un plug-in de cache avec le cache de page activé.
Janos Szabo
6

Un autre exemple, au cas où vous voudriez l'utiliser pour des appels 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(),
            )
         )

    }
}
kaiser
la source
À noter, cette approche ne fonctionne pas derrière CDN. : D
Brian Fegter
@BrianFegter Pourrait vouloir expliquer (ou le modifier ) pourquoi? :)
kaiser
Étant donné que le CDN ne s'authentifie pas avec WordPress, is_user_logged_insera mis en cache comme faux dans le DOM lorsque l'origine est atteinte. L'état utilisateur doit être extrait d'un thread sans cache via XHR lors de l'utilisation d'un CDN. L'approche de @Mridul Aggarwal fonctionne mais avec des en-têtes sans cache dans la réponse.
Brian Fegter
@BrianFegter Bonne prise. Correction de ça ... je pense. A également voté pour d'autres réponses.
kaiser
2

Veuillez noter qu'aucun des exemples ci-dessus n'est fiable si vous utilisez un plugin de mise en cache de page, alors le code dans la balise body sera statique. Il existe également un moyen simple de le faire (sans requête supplémentaire pour ajax, ce qui n'est pas optimal)

Si vous souhaitez tester l'état de connexion de l'utilisateur avec javascript, vous pouvez utiliser ce code pour définir un cookie lorsque l'utilisateur se connecte et supprimer le cookie lorsque l'utilisateur se déconnecte. Ajoutez ceci par exemple. à votre thème functions.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');

Ensuite, c'est un simple test de cookie en javascript.

if (document.cookie.indexOf('wp_user_logged_in') !== -1) {
    //do something when user logged in
} else {
    //do something when user logged out
}
Janos Szabo
la source
C'est en effet assez simple, fiable et dans le pire des cas, il s'exécute presque instantanément après le chargement de la page (si chargement du script dans le pied de page sans blocage de rendu) contrairement aux autres réponses. Ajax est lent et s'appuyer sur des classes de corps échouera lors de la mise en cache. Vous devez ajouter ce cookie au texte de la politique en matière de cookies. Merci Janos.
Ryszard Jędraszyk
À titre de suivi, il y a un problème avec la synchronisation des cookies WordPress par défaut et du cookie accessible par script nouvellement créé, mais j'ai reçu une réponse simple et intéressante sur la façon de le résoudre: stackoverflow.com/questions/56208574/…
Ryszard Jędraszyk