Bir kullanıcının (mevcut kullanıcı değil) giriş yapıp yapmadığı nasıl kontrol edilir?


22

Her yazar sayfası için (özel yazar sayfası şablonu) çevrimiçi durumunu (çevrimiçi / çevrimdışı) görüntülemem gerekiyor.

is_user_logged_in () yalnızca geçerli kullanıcı için geçerlidir ve geçerli yazarı hedefleyen ilgili bir yaklaşım bulamıyorum, örneğin is_author_logged_in ()

Herhangi bir fikir?

Cevap

One Trick Pony, daha önce kullanmadığım bir şeyi geçici olarak kullanarak kodlamayı iki ila üç fonksiyona hazırlamak için kibardı.

http://codex.wordpress.org/Transients_API

Bunu functions.php dosyasına ekleyin:

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

  }
}

Bunu author.php (veya başka bir sayfa şablonuna) ekleyin:

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.';}

İkinci Cevap (kullanmayın)

Bu cevap referans için dahil edilmiştir. One Trick Pony tarafından belirtildiği gibi, bu her zaman yüklendiğinde veritabanı güncellendiğinden, bu istenmeyen bir yaklaşımdır. Daha fazla incelemeden sonra, kodun, mevcut yazara eklenmesi yerine yalnızca geçerli kullanıcının oturum açma durumunu algıladığı görülüyordu.

1) Bu eklentiyi yükleyin: http://wordpress.org/extend/plugins/who-is-online/

2) Aşağıdakileri sayfa şablonunuza ekleyin:

//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>";
}

Bu bulabileceğiniz en kötü çözümlerden biri. Bu eklenti db her sayfa yükünde güncelleniyor ...
onetrickpony

Bunu incelediğiniz için teşekkür ederiz. Berraklaşacağım. Cevabınıza cevap verdim (aşağıda). Fonksiyonu yaratmada sıkıştım.
Hakim Novus,

Yanıtlar:


15

Bunu yapmak için geçici olayları kullanırdım:

  • bağlı olduğunuz bir kullanıcı-çevrimiçi güncelleme fonksiyonu yaratın init; şuna benzer bir şey olurdu:

    // 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 
    }

    Bu nedenle, her sayfa yüklendiğinde bu çalışmalıdır, ancak geçici yalnızca gerektiğinde güncellenir. Çevrimiçi olarak çok sayıda kullanıcınız varsa, db yazmalarını azaltmak için "son etkinlik" zaman dilimini artırmak isteyebilirsiniz, ancak çoğu site için 15 dakika yeterlidir ...

  • Şimdi kullanıcının çevrimiçi olup olmadığını kontrol etmek için, sadece yukarıda da yaptığınız gibi belirli bir kullanıcının çevrimiçi olup olmadığını görmek için bu geçici sürenin içine bakın:

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

Hiç bir faaliyet yoksa, geçici 30 dakika sonra sona erer. Ancak, kullanıcıların çevrimiçi kullanım süreleri her zaman sona ermeyecek olması durumunda, günde iki kez bir olaya veya başka bir şeye başka bir işlevi takıp bu geçici olayı temizlemek isteyebilirsiniz . Bu işlev eski $logged_in_usersgirdileri kaldırır ...


Geçiciler benim için yeni. Kod için teşekkürler. İlk adımı uygulayamıyorum. İlk kod bloğunuzu kopyaladım ve dosyamdaki function user_online_update() {[KODUNUZ] üzerine yapıştırdım - bir kodun }add_action('init', 'user_online_update');doğru ayrıştırmadığını veya talimatlarınızı yanlış yorumladığımı öneren bir sunucu hatası alıyorum.
Hakim Novus

1
Geçici kullanımları önermek için +1. Onları pek kimse bilmiyor.
Dwayne Charrington


@OneTrickPony: Eylemi functions.php dosyasına ekledim. İkinci işlevi nereye eklerim (kodun tamamının 27. satırına bakın)? Authors.php ve sonra functions.php denedim ama boşuna. Bu koşulu tam kodunuzun 25. Satırında kullanmayı denedim. Sayfa her defasında bir sunucu hatası veriyor veya sayfamda kodunuzun ötesinde hiçbir şey ayrıştırmıyor. Orijinal kodumu kaldırdım ve "Kim çevrimiçi?" Eklenti. Neye bakıyorum?
Hakim Novus,

yerine $time_limitsahip 15ve emin doğru açılan / kapalı php etiketleri yapmak ...
onetrickpony

1

Bildiğim kadarıyla , yerleşik WordPress işlevlerini kullanarak bunu yapmanın bir yolu yoktur , ancak bunun sizi cesaretlendirmesine izin vermeyin; bir eklenti yaz!

Bunu yapmanın bir yolu, veritabanında kullanıcının sitede en son ne zaman etkin olduğunu izleyen yeni bir tablo oluşturmaktır. Eklentiniz için kayıtlı bir kullanıcının ne kadar süreyle "Giriş yaptığını" düşündüğünüzü belirleyen bir ayarlar sayfanız da olabilir.

Bunu bir WordPress kancası kullanarak uygularsınız . Girişe bağlanarak başlarım, böylece bir kullanıcı giriş yaptıktan sonra eklentiniz veritabanındaki zamanı kaydeder. Ardından, oturumu kapattıklarında durumlarını 'uzakta' olarak ayarlamak veya oturum açma süreleri iki saatten fazla ise 'boşta' gibi diğer şeyleri keşfedebilirsiniz.

Siteye giriş yapmış ve aktif olmuşsa, ancak bu iki saatlik pencereyi geçtiyseniz, bir sorunla karşılaşırsınız. Bu durumda, wp-admin bölümüne bağlanmanız gerekir, böylece wp-admin'de herhangi bir şey yaptıklarında, veritabanınızı mevcut zamana göre günceller.

Ardından, yayınlarda iki şey yapmanız gerekir: geçerli yazının yazarını alın:

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

sonra giriş yapıp yapmadıklarını belirlemek için veritabanınızı sorgulayın:

<?php if your_plugin_function($user_login)... ?>
...display something...

Çözümünüze göre, tabloyu oluşturan ve geçen sürenin ayarlar yoluyla tanımlanmasına izin veren bir eklenti buldum. Eklenti dosyalarını inceledikten sonra, yazar şablon sayfamda çevrim içi / çevrim dışı çıktı kodunu nasıl değiştireceğimi bilmiyorum. Eklenti dosyalarına göz atıp beni doğru yöne işaret edebiliyorsanız, minnettar olurum: wordpress.org/extend/plugins/who-is-online (Talimatlarınızı kullanarak gidebildiğim kadar giderim Bu arada benim
dosyamda

Başarı! Eklenti veritabanını kullanıcı kimliği ve yazar kimliği eşleşmeleri için sorguladım. Sorumu üstündeki kodu yapıştırdım (yukarıda).
Hakim Novus,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.