0, 'pageviews' => 0]); if (!is_array($stats)) { $stats = ['visitors' => 0, 'pageviews' => 0]; } // 更新统计 $stats['pageviews']++; if ($is_unique) { $stats['visitors']++; setcookie($visitor_cookie, '1', time() + DAY_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN); } update_option($option_key, $stats, false); // 每月1日清理旧数据 if ((int) date('j') === 1 && (int) date('H') === 0 && (int) date('i') < 5) { $this->cleanup_old_stats(); } } /** * 清理30天前的统计数据 */ private function cleanup_old_stats(): void { global $wpdb; $threshold = date('Y-m-d', strtotime('-30 days')); $wpdb->query($wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s AND option_name < %s", $wpdb->esc_like('aksrt_daily_stats_') . '%', 'aksrt_daily_stats_' . $threshold )); } /** * 获取今日统计 */ public static function get_today_stats(): array { $today = current_time('Y-m-d'); $stats = get_option('aksrt_daily_stats_' . $today, ['visitors' => 0, 'pageviews' => 0]); if (!is_array($stats)) { return ['visitors' => 0, 'pageviews' => 0]; } return [ 'visitors' => absint($stats['visitors'] ?? 0), 'pageviews' => absint($stats['pageviews'] ?? 0), ]; } /** * 获取指定日期统计 */ public static function get_daily_stats(string $date): array { $stats = get_option('aksrt_daily_stats_' . $date, ['visitors' => 0, 'pageviews' => 0]); if (!is_array($stats)) { return ['visitors' => 0, 'pageviews' => 0]; } return [ 'visitors' => absint($stats['visitors'] ?? 0), 'pageviews' => absint($stats['pageviews'] ?? 0), ]; } /** * 获取最近N天统计 */ public static function get_period_stats(int $days = 30): array { $total = ['visitors' => 0, 'pageviews' => 0]; for ($i = 0; $i < $days; $i++) { $date = date('Y-m-d', strtotime("-{$i} days")); $stats = self::get_daily_stats($date); $total['visitors'] += $stats['visitors']; $total['pageviews'] += $stats['pageviews']; } return $total; } /** * 获取总浏览量(所有文章) */ public static function get_total_views(): int { global $wpdb; $total = $wpdb->get_var( "SELECT SUM(CAST(meta_value AS UNSIGNED)) FROM {$wpdb->postmeta} WHERE meta_key = 'aksrt_post_views'" ); return max(0, (int) $total); } }