tracking_server_url)); ?> query_vars['tracking_endpoint'])) { // Log that we received a tracking request error_log('Simple Tracking Plugin: Tracking request received'); // Log the query parameters error_log('Simple Tracking Plugin: Query params: ' . print_r($_GET, true)); $this->forward_to_tracker(); exit; } } /** * Forward the request to the tracking server */ public function forward_to_tracker() { // Get tracking server URL from settings $tracking_server_url = get_option('simple_tracking_server_url', $this->tracking_server_url); $forward_url = 'https://' . $tracking_server_url . '/spur'; // Log the request (for debugging) error_log('Forwarding tracking request to: ' . $forward_url); error_log('Simple Tracking Plugin: Request method: ' . $_SERVER['REQUEST_METHOD']); // Create a new cURL resource $ch = curl_init(); // Set URL and other appropriate options curl_setopt($ch, CURLOPT_URL, $forward_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $_SERVER['REQUEST_METHOD']); // Get query parameters and add IP $query = $_GET; $query['ip'] = $this->get_real_ip(); // Build query string $query_string = http_build_query($query); curl_setopt($ch, CURLOPT_URL, $forward_url . '?' . $query_string); // Prepare headers $headers = array(); $all_headers = function_exists('getallheaders') ? getallheaders() : $this->get_all_headers(); // Forward all headers, checking for the final destination foreach ($all_headers as $name => $value) { if ($name == 'X-Final-Destination' && !empty($value)) { // If a custom destination is provided in the header, use it $forward_url = 'https://' . $value . '/spur'; curl_setopt($ch, CURLOPT_URL, $forward_url . '?' . $query_string); error_log('Overriding destination with: ' . $value); } $headers[] = "$name: $value"; } curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // Execute request $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if (curl_errno($ch)) { error_log('cURL error: ' . curl_error($ch)); $http_code = 500; } // Close cURL resource curl_close($ch); // Send response http_response_code($http_code); header('Content-Type: application/json'); echo '{}'; exit; } /** * Fallback implementation of getallheaders() for servers that don't have it */ private function get_all_headers() { $headers = []; foreach ($_SERVER as $name => $value) { if (substr($name, 0, 5) == 'HTTP_') { $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; } } return $headers; } /** * Get the real IP address */ private function get_real_ip() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } return $ip; } /** * Add settings page */ public function add_settings_page() { add_options_page( 'Tracking Settings', 'Tracking Settings', 'manage_options', 'simple-tracking-settings', array($this, 'render_settings_page') ); } /** * Register settings */ public function register_settings() { register_setting('simple_tracking_settings', 'simple_tracking_server_url'); add_settings_section( 'simple_tracking_section', 'Tracking Settings', array($this, 'settings_section_callback'), 'simple-tracking-settings' ); add_settings_field( 'simple_tracking_server_url', 'Tracking Server URL', array($this, 'server_url_callback'), 'simple-tracking-settings', 'simple_tracking_section' ); } /** * Settings section callback */ public function settings_section_callback() { echo '

Configure your tracking server settings.

'; } /** * Server URL field callback */ public function server_url_callback() { $value = get_option('simple_tracking_server_url', $this->tracking_server_url); echo ''; echo '

Enter the tracking server URL without https:// (e.g., tracking1.karlbreuer.com)

'; echo '

You will find this in your domain screen in the Palantics app

'; } /** * Render settings page */ public function render_settings_page() { ?>