Sprawdź, czy użytkownik jest zalogowany przy użyciu JQuery

18

Chcę wykonać niestandardowy kod jquery, który pokazuje użytkownikowi okno logowania, jeśli kliknie przycisk i nie będzie zalogowany. Jak to zrobić?

Feras Odeh
źródło

Odpowiedzi:

27

Jeśli chcesz wiedzieć, czy użytkownik jest zalogowany w danym momencie. Inne odpowiedzi sprawdzają, czy użytkownik jest zalogowany, czy nie, gdy strona jest ładowana, a nie czas, w którym uruchamiany jest JavaScript. Użytkownik mógł na przykład zalogować się w osobnej zakładce

Umieść to w swoim 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
    }
});

umieść to w pliku functions.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
źródło
Jaka jest wartość ajaxurl?
Feras Odeh
wordpress ustawia go na „twoja strona.com/wp-admin/admin-ajax.php”. To jest adres URL, na który mają być wysyłane wszystkie żądania ajax
Mridul Aggarwal
Umieszczam plik jQuery.post w module obsługi kliknięć jquery, ale to nie działa. masz pomysł jak to rozwiązać?
Feras Odeh
Widziałem, że ajaxurl nie jest zdefiniowany w konsoli.
Feras Odeh
1
[codex] (codex.wordpress.org/AJAX_in_Plugins) powiedział, że w najnowszych wersjach wordpressa jest to już zdefiniowane. Może możesz zdefiniować własną wersję ajaxurl za pomocą wp_localize_script
Mridul Aggarwal
32

Sprawdź, czy classdla atrybutu body: jeśli kompozycja korzysta body_class()z treści, ma klasę nazwaną logged-indla zalogowanych użytkowników. Pamiętaj, że funkcji można również użyć w elemencie html.

Przykład

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

Możesz także użyć is_user_logged_in()jako warunku do kolejkowania lub drukowania skryptu.

fuxia
źródło
najwyższe oceny w tej odpowiedzi - proste i skuteczne.
Q Studio
Podoba mi się pomysł sprawdzania ciała pod kątem logged-inklasy. Musisz tylko upewnić się, że motywy używają body_class();lub get_body_class();W przeciwnym razie, to nie jest super niezawodne rozwiązanie. Chociaż używam tych funkcji w moich motywach, więc jest to dla mnie dobre rozwiązanie. Dzięki za prosty pomysł.
Michael Ecklund
18

Dodaj body_class () do treści HTML

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

Spowoduje to dodanie logged-inzalogowanego użytkownika, a następnie można użyć następującego kodu jquery do wykonania niestandardowego kodu użytkownika tylko dla zalogowanego użytkownika.

if ($('body').hasClass('logged-in')) {
       //execute your jquery code.
}
Monirul Islam
źródło
Nie wiem, dlaczego ten głos został odrzucony. Podejście jest w pełni ważne. +1
kaiser
Nie wiem. Mam to samo pytanie Odpowiedź jest prawidłowa, ale dlaczego głosować w dół.
Monirul Islam
Hm Może dlatego, że używa jQuery zamiast we właściwy sposób (używając filtra i wywołania zwrotnego). Niektóre osoby są uczulone na jQuery.
kaiser
1
dobrze, ale nie informowałby o aktualnym stanie logowania, jeśli użyjesz wtyczki buforującej z włączoną pamięcią podręczną strony.
Janos Szabo
6

Kolejny przykład, na wypadek gdybyś chciał użyć go do wywołań 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(),
            )
         )

    }
}
kajzer
źródło
Należy zauważyć, że to podejście nie działa za CDN. : D
Brian Fegter,
@BrianFegter Może chcesz wyjaśnić (lub edytować ) dlaczego? :)
kaiser
Ponieważ CDN nie uwierzytelnia się za pomocą WordPressa, is_user_logged_inw DOM będzie buforowany jako fałsz po uderzeniu pochodzenia. Stan użytkownika powinien zostać wyodrębniony do wątku bez pamięci podręcznej przez XHR podczas korzystania z CDN. Podejście @Mridul Aggarwal działa, ale w odpowiedzi zawiera nagłówki bez pamięci podręcznej.
Brian Fegter,
@BrianFegter Dobry połów. Naprawiłem to ... tak myślę. Poprosił również inne odpowiedzi.
kaiser
2

Pamiętaj, że żaden z powyższych przykładów nie jest wiarygodny, jeśli używasz wtyczki buforującej strony, kod w tagu body będzie statyczny. Jest też prosty sposób, aby to zrobić (bez dodatkowego zapytania do ajax, które nie jest optymalne)

Jeśli chcesz przetestować stan zalogowanego użytkownika za pomocą javascript, możesz użyć tego kodu, aby ustawić plik cookie podczas logowania użytkownika i usunąć plik cookie, gdy użytkownik się wylogował. Dodaj to np. do motywu funkcji.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');

To jest prosty test ciasteczka w 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
źródło
Jest to rzeczywiście dość proste, niezawodne iw najgorszym przypadku wykonuje się niemal natychmiast po załadowaniu strony (jeśli ładuje skrypt w stopce bez blokowania renderowania), w przeciwieństwie do innych odpowiedzi. Ajax jest powolny i poleganie na klasach ciała zawiedzie w buforowaniu. Musisz dodać ten plik cookie do tekstu Polityki dotyczącej plików cookie. Dziękuję Janos.
Ryszard Jędraszyk
W następstwie występuje problem z synchronizacją domyślnych plików cookie WordPress i nowo utworzonego pliku cookie dostępnego w skrypcie, ale otrzymałem świetną i prostą odpowiedź na to, jak go rozwiązać: stackoverflow.com/questions/56208574/…
Ryszard Jędraszyk