ユーザー(現在のユーザーではない)がログインしているかどうかを確認する方法


22

各著者ページ(カスタム著者ページテンプレート)のオンラインステータス(オンライン/オフライン)を表示する必要があります。

is_user_logged_in()は現在のユーザーにのみ適用され、現在の著者を対象とする関連するアプローチが見つかりません。例:is_author_logged_in()

何か案は?

回答

あるTrick Ponyは、以前は使用したことがなかった、トランジェントを使用して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.';}

2番目の回答(使用しないでください)

この回答は参照用に含まれています。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

レビューしていただきありがとうございます。明確に操縦します。私はあなたの答えに答えました(下記)。関数の作成にこだわっています。
ドミノノーバス

回答:


15

私はこれを行うためにトランジェントを使用します:

  • フックするuser-online-update関数を作成します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 
    }

    したがって、これは各ページのロードで実行する必要がありますが、必要な場合にのみトランジェントが更新されます。多くのユーザーがオンラインにいる場合、「最後のアクティビティ」の時間枠を増やしてデータベースへの書き込みを減らしたいかもしれませんが、ほとんどのサイトでは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分で期限切れになります。ただし、ユーザーが期限切れになることなく常にオンラインになっている場合は、1日2回のイベントなどで別の関数をフックすることで、一時的にそのトランジェントをクリーンアップすることができます。この関数は古い$logged_in_usersエントリを削除します...


トランジェントは私にとって新しいものです。コードをありがとう。最初のステップを実装できません。最初のコードブロックをコピーして、functions.phpファイルのfunction user_online_update() {[YOUR CODE] }add_action('init', 'user_online_update');に貼り付けました。サーバーエラーが表示され、何かが正しく解析されていないか、指示を誤って解釈していることがわかります。
ドミノノーバス

1
トランジェントの使用を提案するための+1。多くの人はそれらについて知りません。
ドウェインチャーリントン


@OneTrickPony:functions.phpにアクションを追加しました。2番目の関数はどこに追加しますか(完全なコードの27行目を参照)?authors.phpを試し、次にfunctions.phpを試しましたが、役に立ちませんでした。完全なコードの25行目の条件を使用してみました。毎回、ページからサーバーエラーが返されるか、コード以外のページの内容が解析されません。元のコードを削除し、「誰がオンラインですか?」を無効にしました。プラグイン。私は何を見落としていますか?
ドミノノーバス

に置き換え$time_limit15、phpタグを正しく開いた/閉じたことを確認してください...
onetrickpony

1

私の知る限り、組み込みのWordPress機能を使用してこれを行う方法はありませんが、それであなたを落胆させないでください。プラグインを書く!

これを行う1つの方法は、ユーザーがサイトで最後にアクティブだった時間を単に追跡する新しいテーブルをデータベースに作成することです。また、プラグインの設定ページを使用して、登録ユーザーが「ログイン」しているとみなす期間を決定することもできます。

WordPressフックを使用してこれを実装します。ログインにフックすることから始めて、ユーザーがログインすると、プラグインがデータベースに時間を記録するようにします。その後、ログアウトをクリックするとステータスを「アウェイ」に設定したり、ログイン時間が2時間以上前であれば「アイドル」に設定したりすることもできます。

サイトにログインしてアクティブになっているが、この2時間のウィンドウを過ぎると、問題が発生します。この場合、wp-adminセクションにフックして、wp-adminで何かを行うと、データベースが現在の時刻に更新されるようにする必要があります。

次に、投稿で、2つのことを行う必要があります。現在の投稿の作成者を取得します。

<?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ファイルでフックを使用しています)
ドミノノーバス

成功!ユーザーIDと作成者IDの一致について、プラグインデータベースを照会しました。質問にコードを貼り付けました(上記)。
ドミノノーバス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.