esc_html__('Failed Logins', 'activity-log-pro'), 'value' => $security_stats['failed_logins'], 'icon' => '', 'color' => '#d32f2f', 'type' => 'security', 'link_url' => add_query_arg( array( 'alp_event_type' => 'security' ), $logs_base_url ), ), array( 'label' => esc_html__('Successful Logins', 'activity-log-pro'), 'value' => $security_stats['successful_logins'], 'icon' => '', 'color' => '#388e3c', 'type' => 'security', 'link_url' => add_query_arg( array( 'alp_event_type' => 'user', 'alp_action' => 'login' ), $logs_base_url ), ), array( 'label' => esc_html__('New User Registrations', 'activity-log-pro'), 'value' => $security_stats['new_users'], 'icon' => '', 'color' => '#1976d2', 'type' => 'security', 'link_url' => add_query_arg( array( 'alp_event_type' => 'user', 'alp_action' => 'registered' ), $logs_base_url ), ), array( 'label' => esc_html__('Password Changes', 'activity-log-pro'), 'value' => $security_stats['password_changes'], 'icon' => '', 'color' => '#f57c00', 'type' => 'security', 'link_url' => add_query_arg( array( 'alp_event_type' => 'user', 'alp_action' => 'password_reset' ), $logs_base_url ), ), ); } /** * Get business activity statistics configuration for today's panel. * * @param string $date Date in Y-m-d format. * @return array Array of business statistics configuration. */ public static function get_business_stats_config($date) { $business_stats = ACTLOGPRO_Database::get_business_daily_stats($date); $logs_base_url = admin_url('admin.php?page=activity-log-pro'); return array( array( 'label' => esc_html__('Publishing Activity', 'activity-log-pro'), 'value' => $business_stats['content_changes'], 'icon' => '', 'color' => '#388e3c', 'type' => 'business', 'link_url' => add_query_arg( array( 'alp_event_type' => 'post' ), $logs_base_url ), ), array( 'label' => esc_html__('Plugin/Theme Activities', 'activity-log-pro'), 'value' => $business_stats['plugin_theme_activities'], 'icon' => '', 'color' => '#7b1fa2', 'type' => 'business', 'link_url' => add_query_arg( array( 'alp_event_type' => 'plugin' ), $logs_base_url ), ), array( 'label' => esc_html__('Admin Setting Changes', 'activity-log-pro'), 'value' => $business_stats['admin_changes'], 'icon' => '', 'color' => '#f57c00', 'type' => 'business', 'link_url' => add_query_arg( array( 'alp_event_type' => 'option' ), $logs_base_url ), ), array( 'label' => esc_html__('Media Activity', 'activity-log-pro'), 'value' => $business_stats['file_changes'], 'icon' => '', 'color' => '#00796b', 'type' => 'business', 'link_url' => add_query_arg( array( 'alp_event_type' => 'media' ), $logs_base_url ), ), ); } /** * Get additional insights for security panel. * * @param string $date Date in Y-m-d format. * @return array Array of insights. */ public static function get_security_insights($date) { $security_stats = ACTLOGPRO_Database::get_security_daily_stats($date); $most_active_user = ACTLOGPRO_Database::get_most_active_user_by_date($date); $insights = array(); // Security ratio insight $total_logins = $security_stats['successful_logins'] + $security_stats['failed_logins']; if ($total_logins > 0) { $success_rate = round(($security_stats['successful_logins'] / $total_logins) * 100); $insights[] = sprintf( /* translators: %d: Login success rate percentage */ esc_html__('Login success rate: %d%%', 'activity-log-pro'), $success_rate ); } // Failed login warning if ($security_stats['failed_logins'] > 5) { $insights[] = sprintf( /* translators: %d: Number of failed logins */ esc_html__('⚠️ High number of failed logins detected: %d', 'activity-log-pro'), $security_stats['failed_logins'] ); } // Most active user if ($most_active_user && isset($most_active_user['user_display_name'])) { $insights[] = sprintf( /* translators: %1$s: User display name, %2$d: Activity count */ esc_html__('Most active user: %1$s (%2$d activities)', 'activity-log-pro'), $most_active_user['user_display_name'], $most_active_user['activity_count'] ); } return $insights; } /** * Get additional insights for business panel. * * @param string $date Date in Y-m-d format. * @return array Array of insights. */ public static function get_business_insights($date) { $business_stats = ACTLOGPRO_Database::get_business_daily_stats($date); $peak_hour = ACTLOGPRO_Database::get_peak_activity_hour_by_date($date); $insights = array(); // Content activity insight if ($business_stats['content_changes'] > 0) { $insights[] = sprintf( /* translators: %d: Number of content changes */ esc_html__('📝 %d content modifications made today', 'activity-log-pro'), $business_stats['content_changes'] ); } // System changes insight $system_changes = $business_stats['plugin_theme_activities'] + $business_stats['admin_changes']; if ($system_changes > 0) { $insights[] = sprintf( /* translators: %d: Number of system changes */ esc_html__('⚙️ %d system configuration changes', 'activity-log-pro'), $system_changes ); } // Peak activity hour if ($peak_hour && isset($peak_hour['hour'])) { $formatted_hour = sprintf('%02d:00', $peak_hour['hour']); $insights[] = sprintf( /* translators: %1$s: Hour in HH:MM format, %2$d: Activity count */ esc_html__('📊 Peak activity time: %1$s (%2$d events)', 'activity-log-pro'), $formatted_hour, $peak_hour['activity_count'] ); } return $insights; } /** * Get user's preferred stats view type. * * @return string 'security' or 'business' */ public static function get_user_preferred_view() { $user_id = get_current_user_id(); $preference = get_user_meta($user_id, 'actlogpro_stats_view_preference', true); // Default to security view if no preference set return !empty($preference) ? $preference : 'security'; } /** * Set user's preferred stats view type. * * @param string $view_type 'security' or 'business' * @return bool True on success, false on failure. */ public static function set_user_preferred_view($view_type) { if (!in_array($view_type, array('security', 'business'), true)) { return false; } $user_id = get_current_user_id(); if (!$user_id) { return false; } return update_user_meta($user_id, 'actlogpro_stats_view_preference', $view_type); } /** * Get CSS color value for stat card. * * @param string $color Color value. * @return string CSS color string. */ public static function get_stat_card_css($color) { $safe_color = self::sanitize_color($color); return sprintf( '--stat-color: %s; --stat-color-light: %s20; --stat-color-border: %s40;', $safe_color, $safe_color, $safe_color ); } /** * Sanitize color value. * * @param string $color Color value. * @return string Sanitized color. */ public static function sanitize_color($color) { // Simple hex color validation return preg_match('/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/', $color) ? $color : '#000000'; } /** * Refresh statistics cache manually. * * @since 1.0.0 */ public static function refresh_stats_cache() { // Invalidate all log-related caches ACTLOGPRO_Database::invalidate_log_caches(); // Get today's date $today = current_time('Y-m-d'); // Pre-warm the cache by getting fresh stats $security_stats = ACTLOGPRO_Database::get_security_daily_stats($today); $business_stats = ACTLOGPRO_Database::get_business_daily_stats($today); $most_active_user = ACTLOGPRO_Database::get_most_active_user_by_date($today); $peak_hour = ACTLOGPRO_Database::get_peak_activity_hour_by_date($today); return true; } }