Làm cách nào để kiểm tra xem người dùng (không phải người dùng hiện tại) đã đăng nhập chưa?


22

Tôi cần hiển thị trạng thái trực tuyến (trực tuyến / ngoại tuyến) cho mỗi trang tác giả (mẫu trang tác giả tùy chỉnh).

is_user_logged_in () chỉ áp dụng cho người dùng hiện tại và tôi không thể tìm thấy một cách tiếp cận phù hợp nhắm mục tiêu đến tác giả hiện tại, ví dụ: is_ mượt_logged_in ()

Có ý kiến ​​gì không?

Câu trả lời

One Trick Pony rất tốt bụng khi chuẩn bị mã hóa cho hai đến ba chức năng bằng cách sử dụng tạm thời, điều mà trước đây tôi chưa từng sử dụng.

http://codex.wordpress.org/Transrons_API

Thêm phần này vào hàm.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);
    }

  }
}

Thêm phần này vào Author.php (hoặc một mẫu trang khác):

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

Câu trả lời thứ hai (không sử dụng)

Câu trả lời này được bao gồm để tham khảo. Như One Trick Pony đã chỉ ra, đây là cách tiếp cận không thể chấp nhận được vì cơ sở dữ liệu được cập nhật trên mỗi lần tải trang. Sau khi xem xét kỹ hơn, mã dường như chỉ phát hiện trạng thái đăng nhập của người dùng hiện tại thay vì khớp với mã tác giả hiện tại.

1) Cài đặt plugin này: http://wordpress.org/extend/plugins/who-is-online/

2) Thêm phần sau vào mẫu trang của bạn:

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

Đó là một trong những giải pháp tồi tệ nhất bạn có thể tìm thấy. Plugin đó đang cập nhật db trên mỗi lần tải trang ...
onetrickpony

Cảm ơn đã xem xét nó. Tôi sẽ chỉ đạo rõ ràng. Tôi đã trả lời câu trả lời của bạn (bên dưới). Tôi bị mắc kẹt trong việc tạo chức năng.
Thống đốc Novus

Câu trả lời:


15

Tôi sẽ sử dụng tạm thời để làm điều này:

  • tạo chức năng cập nhật trực tuyến cho người dùng mà bạn kết nối init; nó sẽ trông giống như thế này:

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

    Vì vậy, điều này sẽ chạy trên mỗi tải trang, nhưng thoáng qua sẽ chỉ được cập nhật nếu được yêu cầu. Nếu bạn có số lượng người dùng trực tuyến lớn, bạn có thể muốn tăng khung thời gian "hoạt động cuối cùng" để giảm ghi db, nhưng 15 phút là quá đủ cho hầu hết các trang web ...

  • ngay bây giờ để kiểm tra xem người dùng có trực tuyến hay không, chỉ cần nhìn vào bên trong thoáng qua để xem liệu một người dùng nào đó đang trực tuyến, giống như bạn đã làm ở trê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)));

Tạm thời hết hạn sau 30 phút nếu không có hoạt động nào cả. Nhưng trong trường hợp bạn có người dùng trực tuyến mọi lúc, nó sẽ không hết hạn, vì vậy bạn có thể muốn dọn dẹp tạm thời theo định kỳ bằng cách nối một chức năng khác vào một sự kiện hai lần một ngày hoặc đại loại như thế. Chức năng này sẽ xóa $logged_in_userscác mục cũ ...


Transents là mới đối với tôi. Cảm ơn mã. Tôi không thể thực hiện bước đầu tiên. Tôi đã sao chép khối mã đầu tiên của bạn và dán nó vào function user_online_update() {[MÃ CỦA BẠN] }add_action('init', 'user_online_update');trong tệp tin.php của tôi - Tôi đang gặp lỗi máy chủ cho thấy có gì đó không phân tích đúng hoặc tôi đã hiểu sai hướng dẫn của bạn.
Thống đốc Novus

1
+1 để đề xuất sử dụng tạm thời. Không nhiều người biết về họ.
Dwayne Charrington


@OneTrickPony: Tôi đã thêm hành động vào hàm.php. Tôi phải thêm chức năng thứ hai ở đâu (xem dòng 27 của mã hoàn chỉnh của bạn)? Tôi đã thử tác giả.php và sau đó hàm.php nhưng không có kết quả. Tôi đã thử sử dụng điều kiện trên dòng 25 của mã hoàn chỉnh của bạn. Mỗi lần, trang trả về lỗi máy chủ hoặc người nào khác không phân tích bất cứ điều gì trong trang của tôi ngoài mã của bạn. Tôi đã xóa mã gốc của mình và hủy kích hoạt "Ai đang trực tuyến?" cắm vào. Tôi đang nhìn cái gì?
Thống đốc Novus

thay thế $time_limitbằng 15và đảm bảo bạn đã mở / đóng các thẻ php chính xác ...
onetrickpony

1

Theo hiểu biết của tôi, không có cách nào để làm điều này bằng cách sử dụng các chức năng WordPress tích hợp , nhưng đừng để điều đó làm bạn nản lòng; viết một plugin!

Một cách bạn có thể làm là bằng cách tạo một bảng mới trong cơ sở dữ liệu chỉ cần theo dõi lần cuối cùng người dùng hoạt động trên trang web. Bạn cũng có thể có một trang cài đặt cho plugin của mình để xác định thời gian bạn sẽ coi người dùng đã đăng ký là "Đăng nhập".

Bạn sẽ thực hiện điều này bằng cách sử dụng hook WordPress . Tôi sẽ bắt đầu bằng cách nối vào đăng nhập, để một khi người dùng đăng nhập, plugin của bạn sẽ ghi lại thời gian trong cơ sở dữ liệu. Sau đó, bạn có thể khám phá những thứ khác như đặt trạng thái của họ thành 'đi' nếu họ nhấp vào đăng xuất hoặc 'không hoạt động' nếu thời gian đăng nhập của họ hơn hai giờ trước.

Bạn sẽ gặp phải một vấn đề nếu họ đăng nhập và hoạt động trên trang web, nhưng qua cửa sổ hai giờ này. Trong trường hợp này, bạn cần được nối vào phần wp-admin để bất cứ khi nào họ làm bất cứ điều gì trong wp-admin, nó sẽ cập nhật cơ sở dữ liệu của bạn về thời điểm hiện tại.

Sau đó, trên các bài đăng, bạn sẽ cần phải làm hai điều: lấy tác giả của bài viết hiện tại:

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

sau đó truy vấn cơ sở dữ liệu của bạn để xác định xem chúng có được đăng nhập không:

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

Dựa trên giải pháp của bạn, tôi đã tìm thấy một plugin tạo bảng và cho phép xác định thời gian mất hiệu lực thông qua các cài đặt. Sau khi xem xét các tệp plugin, tôi không chắc chắn cách thao tác mã để xuất trực tuyến / ngoại tuyến trong trang mẫu tác giả của tôi. Nếu bạn có thể lướt qua các tệp plugin và chỉ cho tôi đi đúng hướng, tôi sẽ đánh giá cao nó: wordpress.org/extend/plugins/who-is-online (Sử dụng hướng dẫn của bạn, tôi sẽ đi xa nhất có thể trong khi chờ đợi bằng cách sử dụng một hook trong tệp
tin.php

Sự thành công! Tôi đã truy vấn cơ sở dữ liệu plugin cho ID người dùng và ID tác giả phù hợp. Tôi đã dán mã trong câu hỏi của tôi (ở trên).
Thống đốc Novus
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.