Kiểm tra xem người dùng đã đăng nhập bằng JQuery chưa


17

Tôi muốn thực thi mã jquery tùy chỉnh hiển thị hộp thoại đăng nhập cho người dùng nếu anh ta nhấp vào nút và anh ta chưa đăng nhập. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


26

Trong trường hợp bạn muốn biết nếu người dùng đăng nhập tại thời điểm hiện tại. Các câu trả lời khác kiểm tra xem người dùng có đăng nhập hay không khi trang được tải không phải là lúc bạn đang chạy javascript. Người dùng có thể đã đăng nhập vào một tab riêng biệt chẳng hạn

Đặt cái này vào javascript của bạn

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
    }
});

đặt cái này trong hàm của bạn.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');

Giá trị của ajaxurl là gì?
Odeh

wordpress đặt nó thành 'yoursite.com/wp-admin/admin-ajax.php'. Đó là url mà tất cả các yêu cầu ajax sẽ được gửi
Mridul Aggarwal

Tôi đặt jQuery.post bên trong trình xử lý nhấp chuột jquery nhưng điều này không hoạt động. Bạn có biết làm thế nào để giải quyết nó?
Odeh

Tôi thấy rằng ajaxurl không được xác định trong giao diện điều khiển.
Odeh

1
[codex] (codex.wordpress.org/AJAX_in_Plugins) nói rằng trong các phiên bản wordpress mới nhất, điều này đã được xác định. Có lẽ bạn có thể xác định phiên bản ajaxurl của riêng mình với wp_localize_script
Mridul Aggarwal

32

Kiểm tra classthuộc tính cho body: Nếu chủ đề đang sử dụng body_class()phần thân có một lớp được đặt tên logged-incho người dùng đã đăng nhập. Hãy lưu ý chức năng cũng có thể được sử dụng trên phần tử html.

Thí dụ

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

Bạn cũng có thể chỉ sử dụng is_user_logged_in()như một điều kiện để ghi danh hoặc in tập lệnh.


điểm hàng đầu cho câu trả lời này - đơn giản và hiệu quả.
Q Studio

Tôi thích ý tưởng chỉ kiểm tra cơ thể cho logged-inlớp học. Chỉ cần chắc chắn rằng các chủ đề sử dụng body_class();hoặc get_body_class();nếu không, đó không phải là một giải pháp siêu đáng tin cậy. Mặc dù, tôi sử dụng các chức năng đó trong các chủ đề của mình, vì vậy đó là một giải pháp tốt cho tôi. Cảm ơn ý tưởng đơn giản.
Michael Ecklund

18

Vui lòng thêm body_group () vào cơ thể html của bạn

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

Điều này sẽ thêm logged-incho người dùng đã đăng nhập, sau đó bạn có thể sử dụng mã jquery sau để thực thi mã juqery tùy chỉnh của mình cho người dùng đã đăng nhập.

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

Tôi không biết tại sao cái này lại được bình chọn. Cách tiếp cận là hoàn toàn hợp lệ. +1
kaiser

Tôi không biết. Tôi có cùng một câu hỏi. Trả lời là hợp lệ nhưng tại sao lại bỏ phiếu.
Hồi giáo Monirul

Hừm. Có thể bởi vì nó sử dụng jQuery thay vì đúng cách (sử dụng bộ lọc và gọi lại). Một số người bị dị ứng với jQuery.
kaiser

1
tốt, nhưng nó sẽ không cho biết trạng thái đăng nhập thực tế nếu bạn sử dụng plugin bộ đệm với kích hoạt bộ đệm trang.
Janos Szabo

6

Một ví dụ khác, trong trường hợp bạn muốn sử dụng nó cho các cuộc gọi 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(),
            )
         )

    }
}

Lưu ý, phương pháp này không hoạt động đằng sau CDN. : D
Brian Fegter

@BrianFegter Có thể muốn giải thích (hoặc chỉnh sửa nó) tại sao? :)
kaiser

Vì CDN không xác thực với WordPress, nên is_user_logged_insẽ được lưu vào bộ đệm là sai trong DOM khi nguồn gốc được nhấn Trạng thái người dùng nên được tóm tắt thành luồng không có bộ đệm thông qua XHR khi sử dụng CDN. Cách tiếp cận của @Mridul Aggarwal hoạt động nhưng với các tiêu đề không có bộ đệm trong phản hồi.
Brian Fegter

@BrianFegter Bắt tốt. Đã sửa nó ... tôi nghĩ. Nâng cao các câu trả lời khác là tốt.
kaiser

2

Xin lưu ý rằng không có ví dụ nào ở trên là đáng tin cậy trong trường hợp bạn sử dụng plugin bộ đệm trang, thì mã trong thẻ body sẽ là tĩnh. Ngoài ra có một cách đơn giản để làm điều này (không có truy vấn thêm vào ajax không tối ưu)

Nếu bạn muốn kiểm tra người dùng đã đăng nhập trạng thái bằng javascript, bạn có thể sử dụng mã này để đặt cookie khi người dùng đăng nhập và xóa cookie khi người dùng đăng xuất. Thêm ví dụ này. chức năng chủ đề của bạn.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');

Sau đó, nó là một thử nghiệm đơn giản của cookie trong javascript.

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

Điều này thực sự khá đơn giản, đáng tin cậy và trong trường hợp xấu nhất sẽ thực thi gần như ngay lập tức sau khi tải trang (nếu tải tập lệnh ở chân trang mà không chặn kết xuất) không giống như các câu trả lời khác. Ajax chậm và dựa vào các lớp cơ thể sẽ thất bại trong bộ nhớ đệm. Cần thêm cookie này vào văn bản Chính sách cookie. Cảm ơn bạn Janos.
Ryszard Jędras Hot

Theo dõi, có một vấn đề với việc đồng bộ hóa các cookie WordPress mặc định và cookie có thể truy cập tập lệnh mới được tạo, nhưng tôi đã nhận được một câu trả lời đơn giản và tuyệt vời về cách giải quyết: stackoverflow.com/questions/56208574/
Ryszard Jędras Hot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.