prefix . 'hardware_visitors'; // 分页参数 $per_page = 20; $current_page = isset($_GET['paged']) ? max(1, intval($_GET['paged'])) : 1; $offset = ($current_page - 1) * $per_page; // 搜索逻辑 $search = isset($_GET['s']) ? sanitize_text_field($_GET['s']) : ''; $where_clause = '1=1'; $query_params = []; if (!empty($search)) { $like = '%' . $wpdb->esc_like($search) . '%'; $where_clause .= $wpdb->prepare(" AND (ip LIKE %s OR os_name LIKE %s OR browser_name LIKE %s)", $like, $like, $like); } // 获取数据 $total_items = $wpdb->get_var("SELECT COUNT(*) FROM $table WHERE $where_clause"); $results = $wpdb->get_results($wpdb->prepare( "SELECT * FROM $table WHERE $where_clause ORDER BY created_at DESC LIMIT %d OFFSET %d", $per_page, $offset )); // 界面输出 echo '

访客追踪

'; // 搜索框 echo '
'; // 数据表格 echo ''; if ($results) { foreach ($results as $row) { // 服务器时间(上海时区) $server_time = date('Y-m-d H:i:s', strtotime($row->created_at)); // ============== 用户时间(浏览器时区) ============== $user_time = '未知'; $user_timezone = null; if (!empty($row->timezone)) { try { $user_timezone = new DateTimeZone($row->timezone); $user_time = (new DateTime($row->created_at, new DateTimeZone('Asia/Shanghai'))) ->setTimezone($user_timezone) ->format('Y-m-d H:i:s'); } catch (Exception $e) { $user_time = '时区无效'; } } // ============== IP地区时间(GeoIP时区) ============== $ip_time = '未知'; $geo_timezone = $row->geo_timezone ?? 'unknown'; if (!empty($geo_timezone) && $geo_timezone !== 'unknown') { try { $ip_timezone = new DateTimeZone($geo_timezone); $ip_time = (new DateTime($row->created_at, new DateTimeZone('Asia/Shanghai'))) ->setTimezone($ip_timezone) ->format('Y-m-d H:i:s'); } catch (Exception $e) { $ip_time = '时区无效: ' . esc_html($geo_timezone); } } // ============== 时区不一致警告 ============== $timezone_warning = ''; if ($user_timezone && $geo_timezone !== 'unknown') { $time_diff = $this->calculate_timezone_diff($user_timezone, new DateTimeZone($geo_timezone)); if ($time_diff !== 0) { $timezone_warning = '
⚠️ 时区偏移: ' . $time_diff . ' 小时
'; } } // 输出表格行 echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } } else { echo ''; } echo '
时间 操作系统 浏览器 IP地址 地理位置 硬件配置 用户代理
🕒 服务器: ' . esc_html($server_time) . '
👤 用户: ' . esc_html($user_time) . '
🌍 IP地区: ' . esc_html($ip_time) . '
' . $timezone_warning . '
' . esc_html("{$row->os_name} {$row->os_version}") . '' . esc_html("{$row->browser_name} {$row->browser_version}") . '' . esc_html($row->ip) . '
🏳️ ' . esc_html($row->country) . '
📍 ' . esc_html("{$row->region} · {$row->city}") . '
⏰ ' . esc_html($geo_timezone) . '
💻 ' . esc_html("{$row->cpu_arch} · {$row->cpu_cores}核") . '
😢 暂无追踪数据
'; // 分页导航 if ($total_items > $per_page) { echo '
' . paginate_links([ 'base' => add_query_arg('paged', '%#%'), 'format' => '', 'current' => $current_page, 'total' => ceil($total_items / $per_page) ]) . '
'; } echo '
'; // 结束 .wrap } /** * 计算两个时区的小时差 */ private function calculate_timezone_diff(DateTimeZone $tz1, DateTimeZone $tz2): int { $date = new DateTime('now', $tz1); $offset1 = $tz1->getOffset($date); $offset2 = $tz2->getOffset($date); return (int) round(($offset2 - $offset1) / 3600); } }