prefix . 'hardware_visitors'; $charset = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, os_name VARCHAR(50) NOT NULL DEFAULT 'unknown', os_version VARCHAR(50) NOT NULL DEFAULT 'unknown', cpu_arch VARCHAR(20) NOT NULL DEFAULT 'unknown', cpu_cores SMALLINT NOT NULL DEFAULT 0, gpu_vendor VARCHAR(50) NOT NULL DEFAULT 'unknown', gpu_model VARCHAR(100) NOT NULL DEFAULT 'unknown', ip VARCHAR(45) NOT NULL DEFAULT '0.0.0.0', timezone VARCHAR(50) NOT NULL DEFAULT 'unknown', user_agent TEXT NOT NULL, browser_name VARCHAR(50) NOT NULL DEFAULT 'unknown', browser_version VARCHAR(50) NOT NULL DEFAULT 'unknown', ua_ch TEXT NOT NULL, country VARCHAR(50) NOT NULL DEFAULT 'unknown', region VARCHAR(50) NOT NULL DEFAULT 'unknown', city VARCHAR(50) NOT NULL DEFAULT 'unknown', district VARCHAR(50) NOT NULL DEFAULT 'unknown', geo_timezone VARCHAR(50) NOT NULL DEFAULT 'unknown', latitude DECIMAL(10,6) NOT NULL DEFAULT 0.0, longitude DECIMAL(10,6) NOT NULL DEFAULT 0.0, created_at DATETIME NOT NULL, PRIMARY KEY (id) ) $charset;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); // 创建数据目录 if (!file_exists(plugin_dir_path(__FILE__) . 'data')) { mkdir(plugin_dir_path(__FILE__) . 'data', 0755, true); } } // ==================== 数据收集处理 ==================== function hardware_tracker_get_client_ip() { $ip = $_SERVER['REMOTE_ADDR']; $proxy_headers = [ 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED' ]; foreach ($proxy_headers as $header) { if (!empty($_SERVER[$header])) { $ip_list = explode(',', $_SERVER[$header]); foreach ($ip_list as $ip_candidate) { $ip_candidate = trim($ip_candidate); if (filter_var($ip_candidate, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)) { return $ip_candidate; } } } } return $ip; } // 数据入库函数 function hardware_tracker_insert_data($data) { global $wpdb; $table = $wpdb->prefix . 'hardware_visitors'; // GeoIP解析 $geo_data = [ 'country' => 'unknown', 'region' => 'unknown', 'city' => 'unknown', 'district' => 'unknown', 'latitude' => 0.0, 'longitude' => 0.0, 'geo_timezone' => 'unknown' ]; if (get_option('hardware_tracker_geoip_enabled', 0)) { $resolver = new Hardware_Tracker_GeoIP_Resolver(); $location = $resolver->resolve_ip($data['ip']); if ($location && is_array($location)) { $geo_data = array_merge($geo_data, $location); // 安全合并 } } if (!get_option('hardware_tracker_ua_ch_enabled', 1)) { $data['ua_ch'] = '{}'; // 关闭时存储空JSON } // 合并所有数据 $insert_data = array_merge($data, $geo_data); $format = [ '%s', '%s', '%s', '%d', // os_name, os_version, cpu_arch, cpu_cores '%s', '%s', // gpu_vendor, gpu_model '%s', '%s', // ip, timezone '%s', // user_agent '%s', '%s', // browser_name, browser_version '%s', // ua_ch '%s', '%s', '%s', '%s', // country, region, city, district '%f', '%f', '%s', // latitude, longitude, geo_timezone '%s' // created_at ]; // 执行数据库插入 return $wpdb->insert($table, $insert_data, $format); } // ==================== AJAX处理 ==================== add_action('wp_ajax_hardware_tracker', 'hardware_tracker_handle'); add_action('wp_ajax_nopriv_hardware_tracker', 'hardware_tracker_handle'); function hardware_tracker_handle() { check_ajax_referer('hardware_tracker_nonce', 'security'); $data = [ 'os_name' => sanitize_text_field($_POST['os_name'] ?? 'unknown'), 'os_version' => sanitize_text_field($_POST['os_version'] ?? 'unknown'), 'cpu_arch' => sanitize_text_field($_POST['cpu_arch'] ?? 'unknown'), 'cpu_cores' => absint($_POST['cpu_cores'] ?? 0), 'gpu_vendor' => sanitize_text_field($_POST['gpu_vendor'] ?? 'unknown'), 'gpu_model' => sanitize_text_field($_POST['gpu_model'] ?? 'unknown'), 'ip' => hardware_tracker_get_client_ip(), 'timezone' => sanitize_text_field($_POST['timezone'] ?? 'unknown'), 'user_agent' => sanitize_textarea_field($_SERVER['HTTP_USER_AGENT'] ?? ''), 'browser_name' => sanitize_text_field($_POST['browser_name'] ?? 'unknown'), 'browser_version'=> sanitize_text_field($_POST['browser_version'] ?? 'unknown'), 'ua_ch' => sanitize_textarea_field($_POST['ua_ch'] ?? '{}'), 'created_at' => current_time('mysql') ]; hardware_tracker_insert_data($data); wp_send_json_success(['message' => '数据记录成功']); } // ==================== 后台设置 ==================== add_action('admin_menu', 'hardware_tracker_add_settings_menu'); function hardware_tracker_add_settings_menu() { add_options_page( '硬件级访客追踪设置', '硬件级访客追踪', 'manage_options', 'hardware-tracker-settings', 'hardware_tracker_settings_page' ); } function hardware_tracker_settings_page() { ?>

硬件级访客追踪设置

功能状态

GeoIP数据库: 已安装 未安装
UA客户端提示: 已启用 已禁用

数据库路径

data/GeoLite2-City.mmdb
'absint'] ); // UA客户端提示设置 register_setting( 'hardware_tracker_options', 'hardware_tracker_ua_ch_enabled', ['sanitize_callback' => 'absint'] ); add_settings_section( 'geoip_settings', '数据收集设置', function() { echo '

控制不同类型数据的收集功能

'; }, 'hardware-tracker-settings' ); // GeoIP字段 add_settings_field( 'geoip_enabled', '地理位置解析', function() { $enabled = get_option('hardware_tracker_geoip_enabled', 0); echo ''; }, 'hardware-tracker-settings', 'geoip_settings' ); // UA客户端提示字段 add_settings_field( 'ua_ch_enabled', '高级浏览器特征', function() { $enabled = get_option('hardware_tracker_ua_ch_enabled', 1); echo ''; }, 'hardware-tracker-settings', 'geoip_settings' ); } // ==================== 前端脚本 ==================== add_action('wp_enqueue_scripts', 'hardware_tracker_scripts'); function hardware_tracker_scripts() { wp_enqueue_script( 'hardware-tracker', plugins_url('/assets/tracker.js', __FILE__), [], '2.0', ['in_footer' => true] ); wp_localize_script('hardware-tracker', 'hardwareTracker', [ 'ajax_url' => admin_url('admin-ajax.php'), 'security' => wp_create_nonce('hardware_tracker_nonce'), 'ua_ch_enabled' => (int)get_option('hardware_tracker_ua_ch_enabled', 1) ]); } // ==================== 卸载处理 ==================== register_uninstall_hook(__FILE__, 'hardware_tracker_uninstall'); function hardware_tracker_uninstall() { global $wpdb; $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}hardware_visitors"); delete_option('hardware_tracker_geoip_enabled'); delete_option('hardware_tracker_ua_ch_enabled'); }