PluginProbe
Online Active Users / 3.4.4
Online Active Users v3.4.4
3.4.4 3.4.3 3.4.2 3.4.1 3.4 trunk 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3
online-active-users / online-active-users.php

online-active-users.php in Online Active Users 3.4.4, at online-active-users.php

294 lines 10.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // phpcs:ignoreFile WordPress.Files.FileName.InvalidClassFileName -- Main plugin bootstrap file; must keep the plugin-slug filename for WordPress to read its header.
3 /**
4 * Plugin Name: Online Active Users
5 * Plugin Title: Online Active Users Plugin
6 * Plugin URI: https://wordpress.org/plugins/online-active-users/
7 * Description: Monitor and display real-time online users and last seen status on your WordPress site with Online Active Users plugin.
8 * Tags: online users, active users, user tracking, user status, user activity
9 * Version: 3.4.4
10 * Requires at least: 6.3
11 * Requires PHP: 8.0
12 * Author: Webizito
13 * Author URI: http://webizito.com/
14 * Contributors: valani9099
15 * License: GPLv3 or later
16 * License URI: https://www.gnu.org/licenses/gpl-3.0.html
17 * Text Domain: online-active-users
18 * Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=APRNBJUZHRP7G
19 *
20 * @package Online_Active_Users
21 */
22
23 // Exit if accessed directly.
24 if ( ! defined( 'ABSPATH' ) ) {
25 exit;
26 }
27
28 if ( ! defined( 'WPOAU_PLUGIN_DIR' ) ) {
29 define( 'WPOAU_PLUGIN_DIR', __DIR__ );
30 }
31
32 if ( ! defined( 'WPOAU_PLUGIN_FILE' ) ) {
33 define( 'WPOAU_PLUGIN_FILE', __FILE__ );
34 }
35
36 if ( ! defined( 'WPOAU_VERSION' ) ) {
37 define( 'WPOAU_VERSION', '3.4.3' );
38 }
39
40 // class-wpoau-active-users.php replaces the old inc/webi-functions.php (removed): both defined the
41 // same Wpoau_Active_Users class, and this one has the escaping/i18n/WPCS fixes applied.
42 require_once WPOAU_PLUGIN_DIR . '/inc/class-wpoau-active-users.php';
43 require_once WPOAU_PLUGIN_DIR . '/class-webi-custom-widget.php';
44
45 if ( ! class_exists( 'Webi_Active_User' ) ) {
46
47 /**
48 * Main plugin bootstrap: wires up hooks for tracking and displaying online users.
49 */
50 class Webi_Active_User {
51
52 /**
53 * Active users tracking helper instance.
54 *
55 * @var Wpoau_Active_Users
56 */
57 public $wpoau;
58
59 /**
60 * Register all plugin hooks.
61 */
62 public function __construct() {
63
64 $this->wpoau = new Wpoau_Active_Users( $this );
65 $GLOBALS['wpoau_users'] = $this->wpoau;
66
67 register_activation_hook( WPOAU_PLUGIN_FILE, array( $this->wpoau, 'wpoau_users_status_init' ) );
68 add_action( 'init', array( $this->wpoau, 'wpoau_users_status_init' ) );
69 add_action( 'init', array( $this->wpoau, 'webi_track_user_activity' ) );
70 add_action( 'clear_auth_cookie', array( $this, 'wpoau_user_logout' ) );
71 add_action( 'wp_loaded', array( $this, 'wpoau_enqueue_script' ) );
72 add_action( 'admin_enqueue_scripts', array( $this, 'webi_enqueue_custom_scripts' ) );
73 add_action( 'admin_init', array( $this->wpoau, 'wpoau_users_status_init' ) );
74 add_action( 'wp_dashboard_setup', array( $this->wpoau, 'wpoau_active_users_metabox' ) );
75 add_filter( 'manage_users_columns', array( $this->wpoau, 'wpoau_user_columns_head' ) );
76 add_filter( 'manage_users_custom_column', array( $this->wpoau, 'wpoau_user_columns_content' ), 10, 3 );
77 add_filter( 'views_users', array( $this, 'wpoau_modify_user_view' ) );
78 add_action( 'admin_bar_menu', array( $this->wpoau, 'wpoau_admin_bar_link' ), 999 );
79 add_filter( 'plugin_row_meta', array( $this, 'wpoau_support_and_faq_links' ), 10, 4 );
80 add_action( 'admin_menu', array( $this, 'wpoau_add_admin_submenu' ) );
81 add_filter( 'plugin_action_links_' . plugin_basename( WPOAU_PLUGIN_FILE ), array( $this, 'wpoau_plugin_by_link' ), 10, 1 );
82 add_action( 'admin_notices', array( $this, 'wpoau_display_notice' ) );
83 register_deactivation_hook( WPOAU_PLUGIN_FILE, array( $this, 'wpoau_display_notice' ) );
84 register_deactivation_hook( WPOAU_PLUGIN_FILE, array( $this, 'wpoau_delete_transient' ) );
85
86 $this->wpoau->wpoau_active_user_shortcode();
87 }
88
89 /**
90 * Enqueue the front-end plugin stylesheet.
91 */
92 public function wpoau_enqueue_script() {
93 wp_enqueue_style( 'style-css', plugin_dir_url( WPOAU_PLUGIN_FILE ) . 'assets/css/style.css', array(), WPOAU_VERSION );
94 }
95
96 /**
97 * Enqueue admin scripts and localize the last-seen timestamp formatting.
98 */
99 public function webi_enqueue_custom_scripts() {
100 wp_enqueue_script( 'webi-plugin-script', plugin_dir_url( WPOAU_PLUGIN_FILE ) . 'assets/js/custom.js', array( 'jquery' ), WPOAU_VERSION, true );
101
102 wp_add_inline_script(
103 'webi-plugin-script',
104 "
105 jQuery(document).ready(function($) {
106 $('.webizito-last-seen').each(function() {
107 var timestamp = $(this).data('timestamp');
108 if (timestamp) {
109 var date = new Date(timestamp * 1000);
110 $(this).text(date.toLocaleString());
111 }
112 });
113 });
114 "
115 );
116 }
117
118 /**
119 * Remove a user from the online list when they log out.
120 */
121 public function wpoau_user_logout() {
122 if ( ! is_user_logged_in() ) {
123 return; // Prevent errors if already logged out.
124 }
125
126 $user_id = get_current_user_id();
127 if ( ! $user_id ) {
128 return;
129 }
130
131 $logged_in_users = get_transient( 'users_status' );
132
133 if ( isset( $logged_in_users[ $user_id ] ) ) {
134 unset( $logged_in_users[ $user_id ] );
135 set_transient( 'users_status', $logged_in_users, 60 );
136 }
137
138 update_user_meta( $user_id, 'last_seen', time() );
139 }
140
141 /**
142 * Get a count of online users, or an array of online user records.
143 *
144 * @param string $type Either 'count' for the online user count, or anything else for the full array.
145 * @return int|array
146 */
147 public function wpoau_online_users( $type = 'count' ) {
148 $logged_in_users = get_transient( 'users_status' );
149
150 // If no users are online.
151 if ( empty( $logged_in_users ) ) {
152 return ( 'count' === $type ) ? 0 : false;
153 }
154
155 $user_online_count = 0;
156 $online_users = array();
157 foreach ( $logged_in_users as $user ) {
158 if ( ! empty( $user['username'] ) && isset( $user['last'] ) && $user['last'] > time() - 50 ) {
159 $online_users[] = $user;
160 ++$user_online_count;
161 }
162 }
163
164 return ( 'count' === $type ) ? $user_online_count : $online_users;
165 }
166
167 /**
168 * Register the "Online Active Users" submenu under Users.
169 */
170 public function wpoau_add_admin_submenu() {
171 add_users_page(
172 __( 'Online Active Users', 'online-active-users' ),
173 __( 'Online Active Users', 'online-active-users' ),
174 'list_users',
175 'wpoau-active-users',
176 array( $this, 'wpoau_active_users_page' )
177 );
178 }
179
180 /**
181 * Render the "Online Active Users" admin submenu page.
182 */
183 public function wpoau_active_users_page() {
184 echo '<div class="wrap"><h1>' . esc_html__( 'Online Users Lists', 'online-active-users' ) . '</h1>';
185
186 $users = $this->wpoau_online_users( 'array' );
187
188 if ( empty( $users ) ) {
189 echo '<p>' . esc_html__( 'No users are online right now.', 'online-active-users' ) . '</p></div>';
190 return;
191 }
192
193 require_once WPOAU_PLUGIN_DIR . '/inc/user-list-table.php';
194 }
195
196 /**
197 * Add an "Online" view/count to the Users list table view links.
198 *
199 * @param array $views Existing view links.
200 * @return array
201 */
202 public function wpoau_modify_user_view( $views ) {
203
204 $logged_in_users = get_transient( 'users_status' );
205 $user = wp_get_current_user();
206
207 $logged_in_users[ $user->ID ] = array(
208 'id' => $user->ID,
209 'username' => $user->user_login,
210 'last' => time(),
211 );
212
213 $view = '<a href="' . esc_url( admin_url( 'users.php?page=wpoau-active-users' ) ) . '">' . sprintf(
214 /* translators: %s: HTML span showing the count of currently online users, e.g. "(3)". */
215 esc_html__( 'User Online %s', 'online-active-users' ),
216 '<span class="count">(' . absint( $this->wpoau_online_users( 'count' ) ) . ')</span>'
217 ) . '</a>';
218
219 $views['status'] = $view;
220 return $views;
221 }
222
223 /**
224 * Add Support and Docs links to the plugin's row meta on the Plugins page.
225 *
226 * @param array $links_array Existing plugin row meta links.
227 * @param string $plugin_file_name Path to the plugin file relative to the plugins directory.
228 * @param array $plugin_data Unused. Required by the plugin_row_meta filter signature.
229 * @param string $status Unused. Required by the plugin_row_meta filter signature.
230 * @return array
231 */
232 public function wpoau_support_and_faq_links( $links_array, $plugin_file_name, $plugin_data, $status ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
233 if ( strpos( $plugin_file_name, basename( WPOAU_PLUGIN_FILE ) ) ) {
234
235 // You can still use `array_unshift()` to add links at the beginning.
236 $links_array[] = '<a href="' . esc_url( 'https://wordpress.org/support/plugin/online-active-users/' ) . '" target="_blank">' . esc_html__( 'Support', 'online-active-users' ) . '</a>';
237 $links_array[] = '<a href="' . esc_url( 'https://webizito.com/wp-online-active-users/' ) . '" target="_blank">' . esc_html__( 'Docs', 'online-active-users' ) . '</a>';
238 $links_array[] = '<strong><a href="' . esc_url( 'https://wordpress.org/support/plugin/online-active-users/reviews/?rate=5#new-post' ) . '" target="_blank">' . esc_html__( 'Rate our plugin', 'online-active-users' ) . ' <span style="color:#ffb900;font-size: 18px;position:relative;top:0.1em;">�
239
240
241
242
243 </span></a></strong>';
244 }
245 return $links_array;
246 }
247
248 /**
249 * Add "Donate" and "By Webizito" links to the plugin's action links.
250 *
251 * @param array $links Existing plugin action links.
252 * @return array
253 */
254 public function wpoau_plugin_by_link( $links ) {
255 $links[] = '<a href="' . esc_url( 'https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=APRNBJUZHRP7G' ) . '" target="_blank"><span>' . esc_html__( 'Donate', 'online-active-users' ) . '</span></a>';
256 return $links;
257 }
258
259 /**
260 * Display a review/donation admin notice.
261 */
262 public function wpoau_display_notice() {
263 $message = sprintf(
264 /* translators: 1: opening review link tag, 2: closing link tag, 3: opening donation link tag. */
265 esc_html__( 'Enjoying our WP Online Active Users plugin? Please consider leaving us a review %1$shere%2$s. Or support with a small donation %3$shere%2$s. We would greatly appreciate it!', 'online-active-users' ),
266 '<a href="' . esc_url( 'https://wordpress.org/support/plugin/online-active-users/reviews/?rate=5#new-post' ) . '" target="_blank">',
267 '</a>',
268 '<a href="' . esc_url( 'https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=APRNBJUZHRP7G' ) . '" target="_blank">'
269 );
270
271 echo '<div class="notice notice-success is-dismissible wp-online-active-users-notice" id="wp-online-active-users-notice">';
272 echo '<p>' . wp_kses_post( $message ) . '</p>';
273 echo '</div>';
274 }
275
276 /**
277 * Delete the plugin's online-users transient on deactivation.
278 */
279 public function wpoau_delete_transient() {
280 delete_transient( 'users_status' );
281 }
282 }
283 }
284
285 $wpoau_plugin = new Webi_Active_User();
286
287 // Register the custom widget.
288 add_action(
289 'widgets_init',
290 function () {
291 register_widget( 'Webi_Custom_Widget' );
292 }
293 );
294