카테고리 보관물: wordpress

wordpress

현재 사용자가 아닌 사용자가 로그인했는지 확인하는 방법 $logged_in_users[$current_user] = $current_time;

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

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


답변

나는 이것을하기 위해 과도 를 사용할 것이다 .

  • 연결하는 사용자 온라인 업데이트 기능을 작성하십시오 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항목을 제거 합니다 …


답변

내 지식으로는 내장 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...

답변