यदि कोई उपयोगकर्ता (वर्तमान उपयोगकर्ता नहीं) लॉग इन है, तो कैसे जांचें?


22

मुझे प्रत्येक लेखक पृष्ठ (कस्टम लेखक पृष्ठ टेम्पलेट) के लिए ऑनलाइन स्थिति (ऑनलाइन / ऑफ़लाइन) प्रदर्शित करने की आवश्यकता है।

is_user_logged_in () केवल वर्तमान उपयोगकर्ता पर लागू होता है और मुझे वर्तमान लेखक को लक्षित करने वाला एक प्रासंगिक दृष्टिकोण नहीं मिल सकता है, जैसे is_author_logged_in ()

कोई विचार?

उत्तर

एक ट्रिक टट्टे का उपयोग करने के लिए पर्याप्त था, दो से तीन कार्यों के लिए कोडिंग तैयार करने के लिए, कुछ ऐसा जो मैंने पहले इस्तेमाल नहीं किया था।

http://codex.wordpress.org/Transients_API

इसे कार्यों में जोड़ें।

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

दूसरा उत्तर (उपयोग न करें)

यह उत्तर संदर्भ के लिए शामिल है। जैसा कि वन ट्रिक पोनी द्वारा बताया गया है, यह अवांछनीय दृष्टिकोण है क्योंकि डेटाबेस प्रत्येक पृष्ठ लोड पर अपडेट किया जाता है। आगे की जांच के बाद कोड केवल वर्तमान उपयोगकर्ता के लॉग-इन स्थिति का पता लगाने के बजाय वर्तमान लेखक के साथ मिलान करने के लिए लग रहा था।

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

इसकी समीक्षा करने के लिए धन्यवाद। मैं साफ कर दूंगा। मैंने आपके उत्तर (नीचे) का उत्तर दिया है। मैं फंक्शन बनाने पर अड़ा हुआ हूं।
डोमिनर 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() {[Your CODE] }add_action('init', 'user_online_update');में पेस्ट किया। फाइल - मुझे एक सर्वर त्रुटि प्राप्त हो रही है जो बताती है कि कुछ सही नहीं है या मैंने आपके निर्देशों का गलत अर्थ निकाला है।
डोमिनर नोवस

1
ग्राहकों का उपयोग करने का सुझाव देने के लिए +1। बहुत से लोग उनके बारे में नहीं जानते हैं।
ड्वेन चारिंगटन

@ प्रमुख: पूरा कोड
onetrickpony

@OneTrickPony: मैंने क्रियाओं को functions.php में जोड़ा। मैं दूसरा फ़ंक्शन कहाँ जोड़ूँ (आपके पूर्ण कोड की पंक्ति 27 देखें)? मैंने लेखकों की कोशिश की। पीपी और फिर फ़ंक्शन। एफपी लेकिन कोई फायदा नहीं हुआ। मैंने आपके पूर्ण कोड की लाइन 25 पर स्थिति का उपयोग करने की कोशिश की। हर बार, पृष्ठ एक सर्वर त्रुटि देता है या फिर आपके कोड से परे मेरे पृष्ठ में कुछ भी पार्स नहीं करता है। मैंने अपना मूल कोड हटा दिया है और "कौन ऑनलाइन है?" लगाना। मैं क्या देख रहा हूँ?
डोमिनर नोवस

के $time_limitसाथ बदलें 15और सुनिश्चित करें कि आपने सही तरीके से खोले / बंद किए गए php टैग ...
onetrickpony

1

मेरे ज्ञान के लिए बिल्ट-इन वर्डप्रेस फ़ंक्शन का उपयोग करने का एक तरीका नहीं है , लेकिन आपको निराश न करें; एक प्लगइन लिखें!

ऐसा करने का एक तरीका यह है कि डेटाबेस में एक नई तालिका बनाकर, जो अंतिम बार उपयोगकर्ता द्वारा साइट पर सक्रिय होने पर नज़र रखता है। आपके पास अपने प्लगइन के लिए एक सेटिंग पृष्ठ भी हो सकता है जो निर्धारित करता है कि आप कितने समय तक एक पंजीकृत उपयोगकर्ता को "लॉग इन" मानते हैं।

आप एक वर्डप्रेस हुक का उपयोग करके इसे लागू करेंगे । मैं लॉगिन में हुक करके शुरू करूँगा, ताकि उपयोगकर्ता द्वारा लॉग इन करने के बाद, आपका प्लगइन डेटाबेस में समय जमा कर सके। यदि आप लॉगआउट, या 'निष्क्रिय' पर क्लिक करते हैं तो उनका स्टेटस 'सेट' करने के लिए दूसरी चीज़ों का पता लगा सकते हैं यदि दो घंटे पहले उनका लॉगिन समय अधिक था।

यदि वे लॉग इन हैं और साइट पर सक्रिय हैं, तो आप एक समस्या में भाग लेंगे, लेकिन इस दो घंटे की खिड़की से बाहर रहें। इस स्थिति में, आपको 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 (आपके निर्देशों का उपयोग करते हुए, मैं जहां तक ​​जा सकता हूं, मैं जाऊंगा इस दौरान मेरे फंक्शन्स में। हुक फ़ाइल का उपयोग करते हुए)
डोमिनर नोवस

सफलता! मैंने यूजर आईडी और लेखक आईडी मैचों के लिए प्लगइन डेटाबेस को क्वेर किया। मैंने अपने प्रश्न (ऊपर) में कोड चिपकाया है।
डोमिनर नोवस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.