Bagaimana cara memeriksa apakah pengguna (bukan pengguna saat ini) masuk?

22

Saya perlu menampilkan status online (online / offline) untuk setiap halaman penulis (template halaman penulis kustom).

is_user_logged_in () hanya berlaku untuk pengguna saat ini dan saya tidak dapat menemukan pendekatan yang relevan dengan menargetkan penulis saat ini misalnya is_author_logged_in ()

Ada ide?

Menjawab

One Trick Pony berbaik hati untuk mempersiapkan pengkodean untuk dua hingga tiga fungsi menggunakan transien, sesuatu yang belum pernah saya gunakan sebelumnya.

http://codex.wordpress.org/Transients_API

Tambahkan ini ke functions.php:

add_action('wp', 'update_online_users_status');
function update_online_users_status(){

  if(is_user_logged_in()){

    // get the online users list
    if(($logged_in_users = get_transient('users_online')) === false) $logged_in_users = array();

    $current_user = wp_get_current_user();
    $current_user = $current_user->ID;  
    $current_time = current_time('timestamp');

    if(!isset($logged_in_users[$current_user]) || ($logged_in_users[$current_user] < ($current_time - (15 * 60)))){
      $logged_in_users[$current_user] = $current_time;
      set_transient('users_online', $logged_in_users, 30 * 60);
    }

  }
}

Tambahkan ini ke author.php (atau templat halaman lain):

function is_user_online($user_id) {

  // get the online users list
  $logged_in_users = get_transient('users_online');

  // online, if (s)he is in the list and last activity was less than 15 minutes ago
  return isset($logged_in_users[$user_id]) && ($logged_in_users[$user_id] > (current_time('timestamp') - (15 * 60)));
}

$passthis_id = $curauth->ID;
if(is_user_online($passthis_id)){
echo 'User is online.';}
else {
echo'User is not online.';}

Jawaban Kedua (jangan gunakan)

Jawaban ini termasuk untuk referensi. Seperti yang ditunjukkan oleh One Trick Pony, ini adalah pendekatan yang tidak diinginkan karena database diperbarui pada setiap halaman memuat. Setelah diteliti lebih lanjut, kode tersebut tampaknya hanya mendeteksi status login pengguna saat ini daripada mencocokkannya dengan penulis saat ini.

1) Instal plugin ini: http://wordpress.org/extend/plugins/who-is-online/

2) Tambahkan yang berikut ke templat halaman Anda:

//Set the $curauth variable
if(isset($_GET['author_name'])) :
$curauth = get_userdatabylogin($author_name);
else :
$curauth = get_userdata(intval($author));
endif;

// Define the ID of whatever authors page is being viewed.
$authortemplate_id = $curauth->ID;

// Connect to database.
global $wpdb;
// Define table as variable.
$who_is_online_table = $wpdb->prefix . 'who_is_online';
// Query: Count the number of user_id's (plugin) that match the author id (author template page).
$onlinestatus_check = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM ".$who_is_online_table." WHERE user_id = '".$authortemplate_id."';" ) );

// If a match is found...
if ($onlinestatus_check == "1"){
echo "<p>User is <strong>online</strong> now!</p>";
}
else{
echo "<p>User is currently <strong>offline</strong>.</p>";
}
Dominor Novus
sumber
Itu adalah salah satu solusi terburuk yang bisa Anda temukan. Plugin itu memperbarui db pada setiap pemuatan halaman ...
onetrickpony
Terima kasih telah mengulasnya. Saya akan menghindari. Saya sudah membalas jawaban Anda (di bawah). Saya terjebak membuat fungsi.
Dominor Novus

Jawaban:

15

Saya akan menggunakan transien untuk melakukan ini:

  • buat fungsi pembaruan pengguna online yang Anda kaitkan init; akan terlihat seperti ini:

    // get the user activity the list
    $logged_in_users = get_transient('online_status');
    
    // get current user ID
    $user = wp_get_current_user();
    
    // check if the current user needs to update his online status;
    // he does if he doesn't exist in the list
    $no_need_to_update = isset($logged_in_users[$user->ID])
    
        // and if his "last activity" was less than let's say ...15 minutes ago          
        && $logged_in_users[$user->ID] >  (time() - (15 * 60));
    
    // update the list if needed
    if(!$no_need_to_update){
      $logged_in_users[$user->ID] = time();
      set_transient('online_status', $logged_in_users, $expire_in = (30*60)); // 30 mins 
    }

    Jadi ini harus dijalankan pada setiap halaman memuat, tetapi sementara hanya akan diperbarui jika diperlukan. Jika Anda memiliki banyak pengguna daring, Anda mungkin ingin menambah kerangka waktu "aktivitas terakhir" untuk mengurangi penulisan db, tetapi 15 menit lebih dari cukup untuk sebagian besar situs ...

  • sekarang untuk memeriksa apakah pengguna sedang online, cukup melihat ke dalam sementara untuk melihat apakah pengguna tertentu sedang online, seperti yang Anda lakukan di atas:

    // get the user activity the list
    $logged_in_users = get_transient('online_status');
    
    // for eg. on author page
    $user_to_check = get_query_var('author'); 
    
    $online = isset($logged_in_users[$user_to_check])
       && ($logged_in_users[$user_to_check] >  (time() - (15 * 60)));

Transien berakhir dalam 30 menit jika tidak ada aktivitas sama sekali. Tetapi jika Anda memiliki pengguna online setiap saat itu tidak akan berakhir, jadi Anda mungkin ingin membersihkan transien itu secara berkala dengan mengaitkan fungsi lain pada acara dua kali sehari atau sesuatu seperti itu. Fungsi ini akan menghapus $logged_in_usersentri lama ...

onetrickpony
sumber
Transien baru bagi saya. Terima kasih untuk kodenya. Saya tidak bisa mengimplementasikan langkah pertama. Saya menyalin blok kode pertama Anda dan menempelkannya ke function user_online_update() {[KODE ANDA] }add_action('init', 'user_online_update');dalam file functions.php saya - Saya menerima kesalahan server yang menunjukkan bahwa ada sesuatu yang tidak benar, atau saya salah mengartikan instruksi Anda.
Dominor Novus
1
+1 untuk menyarankan untuk menggunakan transien. Tidak banyak orang tahu tentang mereka.
Dwayne Charrington
@Dominor: kode lengkap .
onetrickpony
@OneTrickPony: Saya menambahkan aksi ke functions.php. Di mana saya menambahkan fungsi kedua (lihat baris 27 dari kode lengkap Anda)? Saya mencoba author.php dan kemudian functions.php tetapi tidak berhasil. Saya mencoba menggunakan kondisi pada baris 25 dari kode lengkap Anda. Setiap kali, halaman mengembalikan kesalahan server atau yang lain tidak mengurai apa pun di halaman saya di luar kode Anda. Saya telah menghapus kode asli saya dan menonaktifkan "Siapa yang online?" plugin. Apa yang saya abaikan?
Dominor Novus
ganti $time_limitdengan 15dan pastikan Anda membuka / menutup tag php dengan benar ...
onetrickpony
1

Sepengetahuan saya tidak ada cara untuk melakukan ini menggunakan fungsi WordPress bawaan , tapi jangan biarkan itu membuat Anda patah semangat; tulis sebuah plugin!

Salah satu cara Anda bisa melakukan ini adalah dengan membuat tabel baru dalam database yang hanya melacak kapan terakhir kali pengguna aktif di situs. Anda juga dapat memiliki halaman pengaturan untuk plugin Anda yang menentukan berapa lama Anda akan menganggap pengguna terdaftar sebagai "Masuk".

Anda akan menerapkan ini menggunakan pengait WordPress . Saya akan mulai dengan menghubungkan ke login, sehingga begitu pengguna login, plugin Anda mencatat waktu dalam database. Anda kemudian dapat menjelajahi hal-hal lain seperti mengatur status mereka untuk 'pergi' jika mereka mengklik logout, atau 'menganggur' jika waktu login mereka lebih dari dua jam yang lalu.

Anda akan mengalami masalah jika mereka masuk dan aktif di situs, tetapi melewati jendela dua jam ini. Dalam hal ini, Anda harus terhubung ke bagian wp-admin sehingga kapan pun mereka melakukan apa pun di wp-admin memperbarui database Anda ke waktu saat ini.

Kemudian, pada posting, Anda perlu melakukan dua hal: dapatkan pembuat posting saat ini:

<?php $user_login = the_author_meta( $user_login ); ?>

kemudian permintaan database Anda untuk menentukan apakah mereka masuk:

<?php if your_plugin_function($user_login)... ?>
...display something...
bangsat
sumber
Berdasarkan solusi Anda, saya telah menemukan plugin yang membuat tabel dan memungkinkan waktu yang lewat untuk ditentukan melalui pengaturan. Setelah meninjau file plugin, saya tidak yakin bagaimana memanipulasi kode untuk menghasilkan online / offline di halaman template penulis saya. Jika Anda dapat melirik file plugin dan mengarahkan saya ke arah yang benar, saya akan menghargainya: wordpress.org/extend/plugins/who-is-online (Menggunakan instruksi Anda, saya akan bertindak sejauh yang saya bisa. Sementara itu menggunakan hook di file functions.php saya)
Dominor Novus
Keberhasilan! Saya menanyakan basis data plugin untuk ID pengguna dan kecocokan ID penulis. Saya telah menempelkan kode pada pertanyaan saya (di atas).
Dominor Novus