কোনও ব্যবহারকারী (বর্তমান ব্যবহারকারী নয়) লগ ইন হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


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

  }
}

এটিকে লেখক.এফপি (অথবা অন্য কোনও পৃষ্ঠা টেম্পলেট) এ যুক্ত করুন:

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

এটি হ'ল সবচেয়ে খারাপ সমাধানগুলির মধ্যে একটি। এই প্লাগইন প্রতিটি পৃষ্ঠার লোডে ডিবি আপডেট করছে ...
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 
    }

    সুতরাং এটি প্রতিটি পৃষ্ঠার লোডে চলতে হবে তবে প্রয়োজনে ক্ষণস্থায়ীটি আপডেট করা হবে। আপনার যদি অনলাইনে প্রচুর ব্যবহারকারী থাকে তবে আপনি ডিবি রাইটিং হ্রাস করতে "শেষ ক্রিয়াকলাপ" সময়সীমা বাড়াতে চাইতে পারেন, তবে বেশিরভাগ সাইটের পক্ষে 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() {[আপনার কোড] }add_action('init', 'user_online_update');এ আটকালাম - আমি একটি সার্ভার ত্রুটি পেয়েছি যা থেকে বোঝা যায় যে কিছু ঠিকভাবে পার্স করছে না বা আমি আপনার নির্দেশাবলীর ভুল ব্যাখ্যা করেছি pre
ডোমিনর নভাস

1
স্থানান্তরকারীদের ব্যবহারের পরামর্শ দেওয়ার জন্য +1। তাদের সম্পর্কে অনেকেই জানেন না।
ডোয়াইন চারিংটন


@ অ্যানট্রিকপনি: আমি ফাংশন.এফপিতে ক্রিয়াটি যুক্ত করেছি। আমি দ্বিতীয় ফাংশনটি কোথায় যুক্ত করব (আপনার সম্পূর্ণ কোডের লাইন 27 দেখুন)? আমি লেখক.পিএফপি এবং তারপরে ফাংশন.এফপি চেষ্টা করেছিলাম কিন্তু কোন ফল হয় নি। আমি আপনার সম্পূর্ণ কোডের 25 লাইনে শর্তটি ব্যবহার করার চেষ্টা করেছি। প্রতিবার, পৃষ্ঠাটি একটি সার্ভার ত্রুটি দেয় বা অন্যথায় আপনার কোডের বাইরে আমার পৃষ্ঠাতে কোনও কিছুকে বিশ্লেষণ করে না। আমি আমার আসল কোডটি সরিয়ে ফেলেছি এবং "অনলাইনে কে?" প্লাগ লাগানো. আমি কি উপেক্ষা করছি?
ডোমিনর নোভাস

প্রতিস্থাপন $time_limitসঙ্গে 15এবং আপনি সঠিকভাবে খোলা / বন্ধ পিএইচপি ট্যাগ করুন ...
onetrickpony

1

আমার জ্ঞানের কাছে অন্তর্নির্মিত ওয়ার্ডপ্রেস ফাংশনগুলি ব্যবহার করে এটি করার কোনও উপায় নেই , তবে এটি আপনাকে নিরুৎসাহিত করবেন না; একটি প্লাগইন লিখুন!

আপনি এটি করার একটি উপায় হ'ল ডেটাবেজে একটি নতুন টেবিল তৈরি করা যা ব্যবহারকারীর সাইটে সর্বশেষ সময় সক্রিয় থাকা শেষ সময়টিকে ট্র্যাক করে। আপনার প্লাগইনের জন্য একটি সেটিংস পৃষ্ঠাও থাকতে পারে যা নির্ধারণ করে যে আপনি নিবন্ধিত ব্যবহারকারীকে কতক্ষণ "লগ ইন" হিসাবে বিবেচনা করবেন।

আপনি এটি একটি ওয়ার্ডপ্রেস হুক ব্যবহার করে প্রয়োগ করবেন । আমি লগইনটি হুক করে শুরু করব, যাতে কোনও ব্যবহারকারী একবার লগ ইন করে ফেললে আপনার প্লাগইন ডেটাবেজে সময় লগ করে। তারপরে আপনি অন্যান্য জিনিসগুলি যেমন লগআউটে ক্লিক করে তাদের স্থিতি 'দূরে' সেট করার মতো, বা তাদের লগইন সময়টি যদি দুই ঘণ্টারও বেশি সময় আগে 'অলস' রাখে তেমন এক্সপ্লোর করতে পারেন।

তারা যদি লগইন হয়ে থাকে এবং সাইটে সক্রিয় থাকে তবে আপনি এই সমস্যার সমাধান করতে পারেন তবে এই দুই ঘন্টা উইন্ডোটি পেরিয়ে গেছে। এই ক্ষেত্রে, আপনাকে ডাব্লুপি-অ্যাডমিন বিভাগে আবদ্ধ করা দরকার যাতে তারা ডাব্লুপি-অ্যাডমিনে যে কোনও কিছু করতে পারে এটি আপনার ডাটাবেসটিকে বর্তমান সময়ে আপডেট করে।

তারপরে, পোস্টগুলিতে আপনাকে দুটি জিনিস করতে হবে: বর্তমান পোস্টটির লেখক পান:

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

তারপরে আপনার ডাটাবেসটি জিজ্ঞাসা করুন যে তারা লগ ইন করেছে কিনা তা নির্ধারণ করতে:

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

আপনার সমাধানের ভিত্তিতে আমি একটি প্লাগইন পেয়েছি যা টেবিলটি তৈরি করে এবং অবিরাম সময়টিকে সেটিংসের মাধ্যমে সংজ্ঞায়িত করতে দেয়। প্লাগইন ফাইলগুলি পর্যালোচনা করার পরে, আমি কীভাবে আমার লেখকের টেমপ্লেট পৃষ্ঠাতে অনলাইনে / অফলাইন আউটপুট কোডটি ম্যানিপুলেট করব তা নিশ্চিত নই। আপনি যদি প্লাগইন ফাইলগুলিতে এক নজরে নজর রাখতে পারেন এবং আমাকে সঠিক দিকে নির্দেশ করতে পারেন তবে আমি এটির প্রশংসা করব: wordpress.org/extend/plugins/ WHo-is-online (আপনার নির্দেশাবলী ব্যবহার করে আমি যতদূর যেতে পারব ইতিমধ্যে আমার
ফাংশন.এফপি

সফল! আমি ব্যবহারকারী আইডি এবং লেখক আইডি ম্যাচের জন্য প্লাগইন ডাটাবেসটি জিজ্ঞাসা করেছি। আমি আমার প্রশ্নের কোডটি পেস্ট করেছি (উপরে)।
ডমিনর নোভাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.