จะตรวจสอบว่าผู้ใช้ (ไม่ใช่ผู้ใช้ปัจจุบัน) เข้าสู่ระบบได้อย่างไร?


22

ฉันต้องแสดงสถานะออนไลน์ (ออนไลน์ / ออฟไลน์) สำหรับแต่ละหน้าผู้แต่ง (เทมเพลตหน้าผู้แต่งกำหนดเอง)

is_user_logged_in () ใช้กับผู้ใช้ปัจจุบันเท่านั้นและฉันไม่พบวิธีการที่เกี่ยวข้องซึ่งกำหนดเป้าหมายไปที่ผู้เขียนปัจจุบันเช่น is_author_logged_in ()

ความคิดใด ๆ

ตอบ

Trick Pony นั้นใจดีมากพอที่จะเตรียมการเขียนโค้ดสำหรับฟังก์ชั่นสองถึงสามรายการโดยใช้ทรานเซสชั่นซึ่งเป็นสิ่งที่ฉันไม่เคยใช้มาก่อน

http://codex.wordpress.org/Transients_API

เพิ่มสิ่งนี้ไปยัง 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);
    }

  }
}

เพิ่มไปยัง author.php (หรือเทมเพลตหน้าอื่น):

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

คำตอบที่สอง (อย่าใช้)

คำตอบนี้มีไว้เพื่ออ้างอิง ตามที่อธิบายไว้โดย One Trick Pony นี่เป็นวิธีที่ไม่สามารถทำได้เนื่องจากฐานข้อมูลจะได้รับการอัปเดตในการโหลดหน้าเว็บแต่ละครั้ง หลังจากตรวจสอบเพิ่มเติมรหัสดูเหมือนจะตรวจสอบสถานะการเข้าสู่ระบบของผู้ใช้ปัจจุบันแทนที่จะจับคู่กับผู้เขียนปัจจุบันเพิ่มเติม

1) ติดตั้งปลั๊กอินนี้: http://wordpress.org/extend/plugins/who-is-online/

2) เพิ่มสิ่งต่อไปนี้ในเทมเพลตหน้าของคุณ:

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

นั่นคือหนึ่งในทางออกที่เลวร้ายที่สุดที่คุณสามารถหาได้ ปลั๊กอินนั้นกำลังอัปเดตฐานข้อมูลในแต่ละหน้าโหลด ...
onetrickpony

ขอบคุณสำหรับการตรวจสอบ ฉันจะคัดท้ายชัดเจน ฉันได้ตอบคำตอบของคุณแล้ว (ด้านล่าง) ฉันติดอยู่กับการสร้างฟังก์ชั่น
Dominor Novus

คำตอบ:


15

ฉันจะใช้ชั่วคราวเพื่อทำสิ่งนี้:

  • สร้างฟังก์ชั่นการใช้งานออนไลน์ปรับปรุงที่คุณเบ็ดบนinit; มันจะมีลักษณะเช่นนี้:

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

    ดังนั้นสิ่งนี้ควรทำงานในการโหลดหน้าแต่ละครั้ง แต่ชั่วคราวจะได้รับการปรับปรุงหากจำเป็นเท่านั้น หากคุณมีผู้ใช้จำนวนมากออนไลน์คุณอาจต้องการเพิ่มกรอบเวลา "กิจกรรมล่าสุด" เพื่อลดการเขียน db แต่ 15 นาทีนั้นเพียงพอสำหรับเว็บไซต์ส่วนใหญ่ ...

  • ตอนนี้เพื่อตรวจสอบว่าผู้ใช้ออนไลน์หรือไม่เพียงดูภายในชั่วคราวนั้นเพื่อดูว่าผู้ใช้บางรายออนไลน์หรือไม่เหมือนกับที่คุณทำด้านบน:

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

ชั่วคราวจะหมดอายุใน 30 นาทีหากไม่มีกิจกรรมเลย แต่ในกรณีที่คุณมีผู้ใช้งานออนไลน์อยู่ตลอดเวลามันจะไม่หมดอายุดังนั้นคุณอาจต้องการล้างข้อมูลชั่วคราวนั้นเป็นระยะโดยการเชื่อมโยงฟังก์ชันอื่นกับเหตุการณ์สองครั้งต่อวันหรืออะไรทำนองนั้น ฟังก์ชั่นนี้จะลบ$logged_in_usersรายการเก่า...


ชั่วคราวเป็นสิ่งใหม่สำหรับฉัน ขอบคุณสำหรับรหัส ฉันไม่สามารถใช้ขั้นตอนแรกได้ ฉันคัดลอกรหัสบล็อกแรกของคุณและวางลงในfunction user_online_update() {[รหัสของคุณ] }add_action('init', 'user_online_update');ในไฟล์ function.php ของฉัน - ฉันได้รับข้อผิดพลาดเซิร์ฟเวอร์ซึ่งแสดงให้เห็นว่ามีบางสิ่งที่ไม่ถูกต้องในการแยกวิเคราะห์หรือฉันตีความคำสั่งของคุณผิด
Dominor Novus

1
+1 สำหรับการแนะนำให้ใช้ชั่วคราว มีคนไม่มากที่รู้เกี่ยวกับพวกเขา
Dwayne Charrington

@Dominor: รหัสที่สมบูรณ์
onetrickpony

@OneTrickPony: ฉันได้เพิ่มการกระทำลงใน functions.php ฉันจะเพิ่มฟังก์ชันที่สองได้ที่ไหน (ดูบรรทัดที่ 27 ของรหัสที่สมบูรณ์ของคุณ) ฉันลองผู้ประพันธ์. php และจากนั้น functions.php แต่ไม่มีประโยชน์ ฉันลองใช้เงื่อนไขในบรรทัดที่ 25 ของรหัสที่สมบูรณ์ของคุณ ทุกครั้งที่เพจส่งคืนข้อผิดพลาดของเซิร์ฟเวอร์มิฉะนั้นจะไม่แยกวิเคราะห์สิ่งใดในเพจของฉันเกินกว่ารหัสของคุณ ฉันได้ลบรหัสเดิมของฉันและปิดการใช้งาน "ใครออนไลน์?" เสียบเข้าไป. ฉันกำลังมองเห็นอะไร
Dominor Novus

แทนที่$time_limitด้วย15และให้แน่ใจว่าคุณเปิดอย่างถูกต้อง / แท็ก PHP ปิด ...
onetrickpony

1

สำหรับความรู้ของฉันไม่มีวิธีการทำเช่นนี้โดยใช้ฟังก์ชั่น WordPressในตัวแต่อย่าปล่อยให้เรื่องนี้ทำให้คุณท้อใจ เขียนปลั๊กอิน!

วิธีหนึ่งที่คุณสามารถทำได้คือการสร้างตารางใหม่ในฐานข้อมูลที่จะติดตามเวลาล่าสุดที่ผู้ใช้อยู่ในไซต์ นอกจากนี้คุณยังสามารถมีหน้าการตั้งค่าสำหรับปลั๊กอินของคุณที่กำหนดระยะเวลาที่คุณจะพิจารณาผู้ใช้ที่ลงทะเบียนว่าเป็น "เข้าสู่ระบบ"

คุณจะดำเนินการนี้โดยใช้เบ็ด WordPress ฉันจะเริ่มด้วยการเชื่อมโยงเข้าสู่ระบบดังนั้นเมื่อผู้ใช้เข้าสู่ระบบปลั๊กอินของคุณจะบันทึกเวลาในฐานข้อมูล จากนั้นคุณสามารถสำรวจสิ่งอื่น ๆ เช่นตั้งค่าสถานะเป็น "ไม่อยู่" หากพวกเขาคลิกออกจากระบบหรือ 'ไม่ได้ใช้งาน' หากเวลาเข้าสู่ระบบของพวกเขามากกว่าสองชั่วโมงที่ผ่านมา

คุณจะพบปัญหาหากพวกเขาเข้าสู่ระบบและใช้งานบนเว็บไซต์ แต่ผ่านหน้าต่างสองชั่วโมงนี้ ในกรณีนี้คุณจะต้องเชื่อมต่อกับส่วน wp-admin เพื่อให้ทุกครั้งที่พวกเขาทำอะไรใน wp-admin และจะอัปเดตฐานข้อมูลของคุณเป็นเวลาปัจจุบัน

จากนั้นในโพสต์คุณจะต้องทำสองสิ่ง: รับผู้เขียนโพสต์ปัจจุบัน:

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

จากนั้นสอบถามฐานข้อมูลของคุณเพื่อตรวจสอบว่าพวกเขาเข้าสู่ระบบ:

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

ตามวิธีการแก้ปัญหาของคุณฉันพบปลั๊กอินที่สร้างตารางและอนุญาตให้กำหนดเวลาผ่านการตั้งค่า หลังจากตรวจสอบไฟล์ปลั๊กอินแล้วฉันไม่แน่ใจว่าจะจัดการรหัสเพื่อส่งออกออนไลน์ / ออฟไลน์ในหน้าเทมเพลตผู้เขียนของฉันได้อย่างไร หากคุณสามารถดูไฟล์ปลั๊กอินและบอกทิศทางที่ถูกต้องฉันขอขอบคุณมัน: wordpress.org/extend/plugins/who-is-online (ใช้คำแนะนำของคุณฉันจะไปให้ไกลที่สุดเท่าที่จะทำได้ ในขณะเดียวกันการใช้เบ็ดในแฟ้ม functions.php ของฉัน)
Dominor Novus

ที่ประสบความสำเร็จ! ฉันสอบถามฐานข้อมูลปลั๊กอินสำหรับ ID ผู้ใช้และ ID ผู้เขียนที่ตรงกัน ฉันวางรหัสในคำถามของฉัน (ด้านบน)
Dominor Novus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.