Periksa apakah pengguna masuk menggunakan JQuery

17

Saya ingin mengeksekusi kode jquery khusus yang menampilkan dialog masuk ke pengguna jika dia mengklik tombol dan dia tidak masuk. Bagaimana saya bisa melakukannya?

Feras Odeh
sumber

Jawaban:

26

Jika Anda ingin tahu apakah pengguna masuk saat ini. Jawaban lainnya memeriksa apakah pengguna masuk atau tidak ketika halaman dimuat bukan waktu ketika Anda menjalankan javascript. Pengguna bisa masuk di tab terpisah misalnya

Letakkan ini di javascript Anda

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

letakkan ini di functions.php Anda

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
sumber
Apa nilai ajaxurl?
Feras Odeh
wordpress menyetelnya ke 'yoursite.com/wp-admin/admin-ajax.php'. Itulah url tempat semua permintaan ajax seharusnya dikirim
Mridul Aggarwal
Saya meletakkan jQuery.post di dalam handler klik jquery tetapi ini tidak berhasil. apakah Anda punya ide bagaimana menyelesaikannya?
Feras Odeh
Saya melihat bahwa ajaxurl tidak didefinisikan di konsol.
Feras Odeh
1
[codex] (codex.wordpress.org/AJAX_in_Plugins) mengatakan bahwa dalam versi wordpress terbaru ini sudah ditentukan. Mungkin Anda dapat mendefinisikan versi ajaxurl Anda sendiri dengan wp_localize_script
Mridul Aggarwal
32

Periksa classatribut untuk body: Jika tema menggunakan body_class()tubuh memiliki kelas yang dinamai logged-inuntuk pengguna yang masuk. Waspadai fungsi tersebut dapat digunakan pada elemen htmljuga.

Contoh

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

Anda juga dapat menggunakan is_user_logged_in()sebagai syarat untuk meminta atau mencetak skrip.

fuxia
sumber
nilai tertinggi untuk jawaban ini - sederhana dan efektif.
Q Studio
Saya suka ide hanya memeriksa tubuh untuk logged-inkelas. Hanya harus memastikan bahwa tema menggunakan body_class();atau get_body_class();Jika tidak, itu bukan solusi yang sangat andal. Meskipun, saya menggunakan fungsi-fungsi itu di tema saya, jadi itu solusi yang baik untuk saya. Terima kasih atas ide sederhana.
Michael Ecklund
18

Silakan tambahkan body_class () ke tubuh html Anda

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

Ini akan menambah logged-inuntuk pengguna yang dicatat maka Anda dapat menggunakan kode jquery berikut untuk mengeksekusi kode kustom Anda hanya untuk pengguna yang dicatat.

if ($('body').hasClass('logged-in')) {
       //execute your jquery code.
}
Islam Monirul
sumber
Saya tidak tahu mengapa yang satu ini terpilih. Pendekatan sepenuhnya valid. +1
kaiser
Saya tidak tahu Saya punya pertanyaan yang sama. Jawaban itu valid tetapi mengapa turun memilih.
Monirul Islam
Hm Mungkin karena menggunakan jQuery bukan dengan cara yang benar (menggunakan filter dan panggilan balik). Beberapa orang alergi terhadap jQuery.
kaiser
1
bagus, tapi itu tidak akan memberitahu status login yang sebenarnya jika Anda menggunakan plugin cache dengan cache halaman diaktifkan.
Janos Szabo
6

Contoh lain, jika Anda ingin menggunakannya untuk panggilan 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(),
            )
         )

    }
}
kaisar
sumber
Untuk dicatat, pendekatan ini tidak bekerja di belakang CDN. : D
Brian Fegter
@BrianFegter Mungkin ingin menjelaskan (atau mengeditnya ) mengapa? :)
kaiser
Karena CDN tidak diautentikasi dengan WordPress, is_user_logged_inakan di-cache sebagai salah di DOM ketika asal terkena. Status pengguna harus diabstraksi ke utas tanpa-cache melalui XHR saat menggunakan CDN. Pendekatan @Mridul Aggarwal berfungsi tetapi tanpa header cache dalam respons.
Brian Fegter
@BrianFegter Tangkapan yang bagus. Memperbaiki itu ... saya pikir. Diputuskan jawaban lain juga.
kaiser
2

Harap perhatikan bahwa tidak ada contoh di atas yang dapat diandalkan jika Anda menggunakan plugin cache halaman, maka kode dalam tag tubuh akan menjadi statis. Juga ada cara sederhana untuk melakukan ini (tanpa permintaan tambahan untuk ajax yang tidak optimal)

Jika Anda ingin menguji status login pengguna dengan javascript, Anda dapat menggunakan kode ini untuk mengatur cookie ketika pengguna login dan menghapus cookie ketika pengguna keluar. Tambahkan ini mis. ke functions.php tema Anda

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

Kemudian ini merupakan tes cookie sederhana dalam 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
sumber
Ini memang cukup sederhana, dapat diandalkan dan dalam kasus terburuk dijalankan hampir seketika setelah memuat halaman (jika memuat skrip di footer tanpa membuat render) tidak seperti jawaban lain. Ajax lambat dan mengandalkan kelas tubuh akan gagal pada caching. Perlu menambahkan cookie ini ke teks Kebijakan Cookie. Janos terima kasih.
Ryszard Jędraszyk
Sebagai tindak lanjut, ada masalah dengan sinkronisasi cookie WordPress default dan cookie yang dapat diakses skrip yang baru dibuat, tetapi saya telah menerima jawaban yang bagus dan sederhana tentang bagaimana mengatasinya: stackoverflow.com/questions/56208574/…
Ryszard Jędraszyk