현재 사용자가 아닌 사용자가 로그인했는지 확인하는 방법


22

각 작성자 페이지 (사용자 정의 작성자 페이지 템플릿)의 온라인 상태 (온라인 / 오프라인)를 표시해야합니다.

is_user_logged_in ()은 현재 사용자에게만 적용되며 현재 저자를 대상으로하는 관련 방법을 찾을 수 없습니다. 예 : is_author_logged_in ()

어떤 아이디어?

대답

하나의 트릭 포니는 이전에 사용하지 않았던 과도를 사용하여 2 ~ 3 개의 함수에 대한 코딩을 준비하기에 충분히 친절했습니다.

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

그것은 당신이 찾을 수있는 최악의 솔루션 중 하나입니다. 그 플러그인은 각 페이지로드에서 DB를 업데이트하고 있습니다 ...
onetrickpony

검토해 주셔서 감사합니다. 나는 분명히 조종 할 것이다. 나는 당신의 대답에 대답했습니다 (아래). 함수 작성에 붙어 있습니다.
도미노 르 노부스

답변:


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항목을 제거 합니다 ...


과도는 나에게 새로운 것입니다. 코드 주셔서 감사합니다. 첫 번째 단계를 구현할 수 없습니다. 첫 번째 코드 블록을 복사하여 functions.php 파일의 function user_online_update() {[YOUR CODE] }add_action('init', 'user_online_update');에 붙여 넣었습니다 . 서버 오류가 발생하여 구문 분석이 잘못되었거나 지침을 잘못 해석했습니다.
Dominor Novus

1
과도를 사용하도록 제안하면 +1입니다. 많은 사람들이 그들에 대해 알지 못합니다.
드웨인 채 링턴


@OneTrickPony : functions.php에 액션을 추가했습니다. 두 번째 함수를 어디에 추가합니까 (전체 코드의 27 행 참조)? authors.php를 시도한 다음 functions.php를 시도했지만 아무 소용이 없습니다. 완전한 코드의 25 번째 줄에서 조건을 사용해 보았습니다. 매번 페이지가 서버 오류를 반환하거나 코드를 넘어서 내 페이지의 내용을 구문 분석하지 않습니다. 원본 코드를 삭제하고 "온라인 상태는 누구입니까?"를 비활성화했습니다. 플러그인. 내가 무엇을 간과하고 있습니까?
Dominor Novus

로 교체 $time_limit하고 15PHP 태그를 올바르게 열고 닫았는지 확인하십시오.
onetrickpony

1

내 지식으로는 내장 WordPress 기능을 사용 하여이 작업을 수행 할 수있는 방법이 없지만 낙심하지 마십시오. 플러그인을 작성하십시오!

이를 수행 할 수있는 한 가지 방법은 데이터베이스에서 사용자가 마지막으로 사이트에서 활동 한 시간을 추적하는 새 테이블을 작성하는 것입니다. 또한 등록 된 사용자가 "로그인"된 시간을 결정하는 플러그인 설정 페이지가있을 수 있습니다.

WordPress hook을 사용하여이를 구현할 수 있습니다. 사용자가 로그인하면 플러그인이 데이터베이스에 시간을 기록하도록 로그인에 연결하여 시작합니다. 그런 다음 로그 아웃을 클릭하면 상태를 '멀리'로 설정하거나 로그인 시간이 2 시간 이상인 경우 '유휴'로 설정하는 것과 같은 다른 것을 탐색 할 수 있습니다.

사이트에 로그인되어 있고이 2 시간 동안 지나면 문제가 발생합니다. 이 경우 wp-admin 섹션에 연결하여 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.