Cum să verifici dacă un utilizator (nu cel curent) este autentificat?

22 nov. 2011, 00:28:06
Vizualizări: 19.3K
Voturi: 24

Am nevoie să afișez statusul online (online/offline) pentru fiecare pagină de autor (șablon personalizat pentru paginile de autor).

is_user_logged_in() se aplică doar pentru utilizatorul curent și nu găsesc o abordare relevantă pentru autorul curent, de exemplu is_author_logged_in().

Idei?

Răspuns

One Trick Pony a fost suficient de amabil să pregătească codul pentru două-trei funcții folosind transiente, ceva ce nu folosisem până acum.

http://codex.wordpress.org/Transients_API

Adaugă asta în functions.php:

add_action('wp', 'update_online_users_status');
function update_online_users_status(){

  if(is_user_logged_in()){

    // obține lista utilizatorilor online
    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);
    }

  }
}

Adaugă asta în author.php (sau alt șablon de pagină):

function is_user_online($user_id) {

  // obține lista utilizatorilor online
  $logged_in_users = get_transient('users_online');

  // online, dacă se află în listă și ultima activitate a fost în ultimele 15 minute
  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 'Utilizatorul este online.';}
else {
echo'Utilizatorul nu este online.';}

Al doilea răspuns (nu folosi)

Acest răspuns este inclus pentru referință. După cum a menționat One Trick Pony, aceasta este o abordare nedorită deoarece baza de date este actualizată la fiecare încărcare de pagină. După o analiză mai atentă, codul părea să detecteze doar statusul de autentificare al utilizatorului curent, fără a-l potrivi cu autorul curent.

1) Instalează acest plugin: http://wordpress.org/extend/plugins/who-is-online/

2) Adaugă următoarele în șablonul tău de pagină:

//Setează variabila $curauth
if(isset($_GET['author_name'])) :
$curauth = get_userdatabylogin($author_name);
else :
$curauth = get_userdata(intval($author));
endif;

// Definește ID-ul paginii autorului vizualizate.
$authortemplate_id = $curauth->ID;

// Conectează-te la baza de date.
global $wpdb;
// Definește tabela ca variabilă.
$who_is_online_table = $wpdb->prefix . 'who_is_online';
// Interogare: Numără câte user_id (plugin) se potrivesc cu id-ul autorului (pagina șablon autor).
$onlinestatus_check = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM ".$who_is_online_table." WHERE user_id = '".$authortemplate_id."';" ) );

// Dacă se găsește o potrivire...
if ($onlinestatus_check == "1"){
echo "<p>Utilizatorul este <strong>online</strong> acum!</p>";
}
else{
echo "<p>Utilizatorul este momentan <strong>offline</strong>.</p>";
}
2
Comentarii

Aceasta este una dintre cele mai proaste soluții pe care le-ai putea găsi. Acel plugin actualizează baza de date la fiecare încărcare de pagină...

onetrickpony onetrickpony
22 nov. 2011 03:42:13

Mulțumesc pentru recenzie. O să o evit. Am răspuns la soluția ta (mai jos). Sunt blocat la crearea funcției.

Dominor Novus Dominor Novus
22 nov. 2011 04:11:48
Toate răspunsurile la întrebare 3
6
16

Aș folosi transiente pentru a face asta:

  • creează o funcție de actualizare a stării utilizatorilor online pe care o atașezi la init; ar arăta cam așa:

    // obține lista de activitate a utilizatorilor
    $logged_in_users = get_transient('online_status');
    
    // obține ID-ul utilizatorului curent
    $user = wp_get_current_user();
    
    // verifică dacă utilizatorul curent trebuie să-și actualizeze starea online;
    // trebuie să o facă dacă nu există în listă
    $no_need_to_update = isset($logged_in_users[$user->ID])
    
        // și dacă ultima lui „activitate” a fost acum mai puțin de... să zicem 15 minute          
        && $logged_in_users[$user->ID] >  (time() - (15 * 60));
    
    // actualizează lista dacă este necesar
    if(!$no_need_to_update){
      $logged_in_users[$user->ID] = time();
      set_transient('online_status', $logged_in_users, $expire_in = (30*60)); // 30 de minute 
    }
    

    Așadar, acest cod ar trebui să ruleze la fiecare încărcare de pagină, dar transienta va fi actualizată doar dacă este necesar. Dacă ai un număr mare de utilizatori online, poți dori să crești intervalul de „ultimă activitate” pentru a reduce scrierile în baza de date, dar 15 minute sunt suficiente pentru majoritatea site-urilor...

  • acum, pentru a verifica dacă un utilizator este online, pur și simplu verifici în transientă dacă acel utilizator este online, exact cum ai făcut mai sus:

    // obține lista de activitate a utilizatorilor
    $logged_in_users = get_transient('online_status');
    
    // de exemplu, pe pagina de autor
    $user_to_check = get_query_var('author'); 
    
    $online = isset($logged_in_users[$user_to_check])
       && ($logged_in_users[$user_to_check] >  (time() - (15 * 60)));
    

Transienta expiră în 30 de minute dacă nu există nicio activitate. Dar în cazul în care ai utilizatori online tot timpul, nu va expira, așa că poți dori să cureți periodic transienta prin atașarea unei alte funcții la un eveniment de două ori pe zi sau ceva similar. Această funcție ar elimina intrările vechi din $logged_in_users...

22 nov. 2011 02:52:04
Comentarii

Transienții sunt noi pentru mine. Mulțumesc pentru cod. Nu pot implementa primul pas. Am copiat primul bloc de cod al tău și l-am lipit în function user_online_update() { [CODUL TĂU] }add_action('init', 'user_online_update'); în fișierul meu functions.php - primesc o eroare de server care sugerează că ceva nu se parsează corect sau am interpretat greșit instrucțiunile tale.

Dominor Novus Dominor Novus
22 nov. 2011 04:01:32

+1 pentru sugestia de a folosi transienți. Nu mulți oameni știu despre ei.

Dwayne Charrington Dwayne Charrington
22 nov. 2011 04:52:50

@Dominor: codul complet.

onetrickpony onetrickpony
22 nov. 2011 13:28:05

@OneTrickPony: Am adăugat acțiunea în functions.php. Unde trebuie să adaug a doua funcție (vezi linia 27 din codul tău complet)? Am încercat în authors.php și apoi în functions.php, dar fără succes. Am încercat să folosesc condiția de la linia 25 din codul tău complet. De fiecare dată, pagina returnează o eroare de server sau nu parsează nimic din pagina mea dincolo de codul tău. Am eliminat codul original și am dezactivat plugin-ul "Who is online?". Ce am omis?

Dominor Novus Dominor Novus
22 nov. 2011 17:36:23

înlocuiește $time_limit cu 15 și asigură-te că ai deschis/închis corect tag-urile php...

onetrickpony onetrickpony
23 nov. 2011 14:09:30

Mulțumesc, în sfârșit am reușit să rezolv. Am înlocuit variabila $time_limit. Codul din PASTEBIN, la linia 27, părea să necesite o paranteză rotundă și una pătrată pentru a funcționa. Am testat logându-mă din trei până la patru conturi folosind browsere separate pentru fiecare. Pare să funcționeze perfect. Mulțumesc! Am adăugat codul final la întrebare (mai sus).

Dominor Novus Dominor Novus
28 nov. 2011 13:41:13
Arată celelalte 1 comentarii
2

Din câte știu, nu există o modalitate de a face acest lucru folosind funcțiile încorporate ale WordPress, dar nu lăsa asta să te descurajeze; scrie un plugin!

O modalitate prin care ai putea realiza acest lucru este prin crearea unei tabele noi în baza de date care să urmărească pur și simplu ultima dată când utilizatorul a fost activ pe site. De asemenea, ai putea avea o pagină de setări pentru pluginul tău care să determine pentru cât timp consideri că un utilizator înregistrat este "Autentificat".

Ai implementa acest lucru folosind un hook WordPress. Aș începe prin a conecta la autentificare, astfel încât, odată ce un utilizator se autentifică, pluginul tău să înregistreze ora în baza de date. Apoi, ai putea explora alte opțiuni, cum ar fi setarea stării lor la 'absent' dacă dau click pe deconectare sau 'inactiv' dacă timpul de autentificare a fost acum mai mult de două ore.

Ai întâmpina o problemă dacă sunt autentificați și activi pe site, dar au depășit această fereastră de două ore. În acest caz, ar trebui să te conectezi la secțiunea wp-admin, astfel încât ori de câte ori fac ceva în wp-admin, să actualizezi baza ta de date cu ora curentă.

Apoi, pe postări, ar trebui să faci două lucruri: să obții autorul postării curente:

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

apoi să interoghezi baza ta de date pentru a determina dacă sunt autentificați:

<?php if your_plugin_function($user_login)... ?>
...afișează ceva...
22 nov. 2011 01:21:20
Comentarii

Bazat pe soluția ta, am găsit un plugin care creează tabelul și permite definirea timpului scurs prin setări. După ce am analizat fișierele pluginului, nu sunt sigur cum să manipulez codul pentru a afișa online/offline în pagina mea de șablon de autor. Dacă ai putea arunca o privire peste fișierele pluginului și să mă îndrumi în direcția corectă, aș aprecia: http://wordpress.org/extend/plugins/who-is-online/ (Folosind instrucțiunile tale, voi merge cât de departe pot în acest timp folosind un hook în fișierul meu functions.php)

Dominor Novus Dominor Novus
22 nov. 2011 01:58:16

Succes! Am interogat baza de date a pluginului pentru potriviri între ID-ul utilizatorului și ID-ul autorului. Am inserat codul în întrebarea mea (mai sus).

Dominor Novus Dominor Novus
22 nov. 2011 03:30:27
0

Am decis să revizuiesc răspunsul dat și să îl ajustez pentru a se potrivi cu comentariile.

Un lucru despre care s-a discutat în comentarii a fost un fel de curățător zilnic de transient. După cum a subliniat @onetrickpony, putem folosi wp_schedule_event() pentru a configura o resetare zilnică.

Am decis să implementez o modalitate ușoară de a obține toți utilizatorii care sunt online în prezent și recent offline.

Totul este bazat pe programare orientată pe obiecte, împachetat într-o clasă.

Cuprins
Obține starea de activitate a unui anumit utilizator pe baza ID-ului său.
Obține un array cu toți utilizatorii care sunt online în prezent.
Obține un array cu toți utilizatorii care au fost recent offline.
Programează un eveniment recurent zilnic pentru a șterge transientul de activitate a utilizatorilor.
Împachetează totul într-un plugin frumos.

if ( ! class_exists( 'WPC_User_Activity_Monitoring' ) ) {

    class WPC_User_Activity_Monitoring {

        /**
         * @var Integer Marja de inactivitate a utilizatorului în minute.
         */
        private const USER_INACTIVITY_MARGIN = 10 * MINUTE_IN_SECONDS;

        /**
         * @var Integer Marja de auto-curățare a transientului în minute.
         */
        private const TRANSIENT_SELF_CLEAR = 30 * MINUTE_IN_SECONDS;

        /**
         * Agăță metodele pe un set de acțiuni.
         *
         * @since 1.0.0
         */
        public function __construct() {

            add_action( 'init', array( $this, 'wpc_user_activity_monitoring_transient' ) );

        }
        
        /**
         * Setează și actualizează transientul de monitorizare a activității utilizatorilor WPC la interacțiunile cu serverul.
         *
         * @since 1.0.0
         *
         * @param Integer $user_id ID-ul utilizatorului.
         *
         * @return Bool Adevarat pentru online.
         */
        public function wpc_user_activity_monitoring_transient() {
        
            if ( is_user_logged_in() ) {

                $wpc_user_activity_monitoring_transient = get_transient( 'wpc_user_activity_monitoring_transient' );
        
                if ( empty( $wpc_user_activity_monitoring_transient ) ) {
    
                    $wpc_user_activity_monitoring_transient = array();
    
                };
            
                $user_id = get_current_user_id();
                
                $timestamp = current_time( 'timestamp' );
    
                if ( empty( $wpc_user_activity_monitoring_transient[$user_id] ) || ( $wpc_user_activity_monitoring_transient[$user_id] < ( $timestamp - self::USER_INACTIVITY_MARGIN ) ) ) {
    
                    $wpc_user_activity_monitoring_transient[$user_id] = $timestamp;
    
                    set_transient( 'wpc_user_activity_monitoring_transient', $wpc_user_activity_monitoring_transient, self::TRANSIENT_SELF_CLEAR );
    
                };
        
            };
        
        }
        
        /**
         * Obține starea de activitate a unui anumit utilizator pe baza ID-ului său.
         *
         * @since 1.0.0
         *
         * @param Integer $user_id ID-ul utilizatorului.
         *
         * @return Bool Adevarat pentru online.
         */
        public function is_user_currently_online( $user_id ) {
        
            $wpc_user_activity_monitoring_transient = get_transient( 'wpc_user_activity_monitoring_transient' );

            if ( ! isset( $wpc_user_activity_monitoring_transient[$user_id] ) ) {
                return;
            };

            if ( $wpc_user_activity_monitoring_transient[$user_id] > ( current_time( 'timestamp' ) - self::USER_INACTIVITY_MARGIN ) ) {
    
                return isset( $wpc_user_activity_monitoring_transient[$user_id] );
    
            };

        }
        
        /**
         * Obține un array cu toți utilizatorii care sunt online în prezent.
         *
         * @since 1.0.0
         *
         * @param Integer $nusers Numărul de utilizatori online de returnat.
         *
         * @return Array Un array cu ID-urile utilizatorilor online.
         */
        public function get_currently_online_nusers() {
        
            $wpc_user_activity_monitoring_transient = array_reverse( get_transient( 'wpc_user_activity_monitoring_transient' ), true );
            
            $currently_online_nusers = array();
    
            foreach ( $wpc_user_activity_monitoring_transient as $user_id => $timestamp ) {
    
                if ( $timestamp > ( current_time( 'timestamp' ) - self::USER_INACTIVITY_MARGIN ) ) {
    
                    array_push( $currently_online_nusers, $user_id );
    
                };
    
            };
    
            return $currently_online_nusers;
        
        }

        /**
         * Obține un array cu toți utilizatorii care au fost recent offline.
         *
         * @since 1.0.0
         *
         * @param Integer $nusers Numărul de utilizatori offline de returnat.
         *
         * @return Array Un array cu ID-urile utilizatorilor offline.
         */
        public function get_recently_offline_nusers() {
        
            $wpc_user_activity_monitoring_transient = array_reverse( get_transient( 'wpc_user_activity_monitoring_transient' ), true );
            
            $recently_offline_nusers = array();
    
            foreach ( $wpc_user_activity_monitoring_transient as $user_id => $timestamp ) {
    
                if ( $timestamp < ( current_time( 'timestamp' ) - self::USER_INACTIVITY_MARGIN ) ) {
    
                    array_push( $recently_offline_nusers, $user_id );
    
                };
    
            };

            return $recently_offline_nusers;

        }        

    };

    $wpc_user_activity_monitoring = new WPC_User_Activity_Monitoring();

};

/**
 * Programează un eveniment recurent zilnic, care se declanșează la 23:59:00 pentru a șterge transientul de monitorizare a activității utilizatorilor WPC.
 *
 * @since 1.0.0
 */
if ( ! wp_next_scheduled ( 'schedule_event_delete_wpc_user_activity_monitoring_transient' ) ) {

    wp_schedule_event( strtotime( '23:59:00' ), 'daily', 'schedule_event_delete_wpc_user_activity_monitoring_transient' );

};

/**
 * Șterge transientul de monitorizare a activității utilizatorilor WPC.
 *
 * @since 1.0.0
 */
add_action( 'schedule_event_delete_wpc_user_activity_monitoring_transient', 'delete_wpc_user_activity_monitoring_transient' );

if ( ! function_exists( 'delete_wpc_user_activity_monitoring_transient' ) ) {

    function delete_wpc_user_activity_monitoring_transient() {

        delete_transient( 'wpc_user_activity_monitoring_transient' );

    };

};

Împachetează totul într-un plugin frumos.

Am creat și un plugin pentru o implementare ușoară. Este open source pe GitHub la https://github.com/amarinediary/WPC-User-Activity-Monitoring. Există documentații și funcționalități suplimentare.

1 apr. 2021 04:00:32