- Add 26 documentation files including test reports, deployment guides, and troubleshooting documentation - Include 3 CSV data files for trainer imports and user registration tracking - Add 43 JavaScript test files covering mobile optimization, Safari compatibility, and E2E testing - Include 18 PHP utility files for debugging, geocoding, and data analysis - Add 12 shell scripts for deployment verification, user management, and database operations - Update .gitignore with whitelist patterns for development files, documentation, and CSV data 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			228 lines
		
	
	
		
			No EOL
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			No EOL
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Safari Request Debug Log Viewer
 | |
|  * 
 | |
|  * Simple script to view Safari debugging logs
 | |
|  * Access: /debug-safari-logs.php
 | |
|  */
 | |
| 
 | |
| // Security check - only allow if WP_DEBUG is enabled or specific key is provided
 | |
| $debug_key = $_GET['key'] ?? '';
 | |
| $expected_key = 'safari_debug_' . date('Ymd');
 | |
| 
 | |
| if (!defined('WP_DEBUG') || !WP_DEBUG) {
 | |
|     if ($debug_key !== $expected_key) {
 | |
|         http_response_code(404);
 | |
|         exit('Not found');
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Set content type
 | |
| header('Content-Type: text/html; charset=utf-8');
 | |
| 
 | |
| // Get WordPress content directory
 | |
| $wp_content = dirname(__FILE__) . '/../../../wp-content';
 | |
| $log_file = $wp_content . '/safari-debug.log';
 | |
| $wp_debug_log = $wp_content . '/debug.log';
 | |
| 
 | |
| ?>
 | |
| <!DOCTYPE html>
 | |
| <html>
 | |
| <head>
 | |
|     <title>Safari Debug Logs</title>
 | |
|     <meta charset="utf-8">
 | |
|     <meta name="robots" content="noindex, nofollow">
 | |
|     <style>
 | |
|         body {
 | |
|             font-family: monospace;
 | |
|             margin: 20px;
 | |
|             background: #1e1e1e;
 | |
|             color: #d4d4d4;
 | |
|         }
 | |
|         .log-container {
 | |
|             background: #2d2d2d;
 | |
|             padding: 15px;
 | |
|             border-radius: 5px;
 | |
|             margin: 10px 0;
 | |
|             max-height: 500px;
 | |
|             overflow-y: auto;
 | |
|             border: 1px solid #404040;
 | |
|         }
 | |
|         .log-entry {
 | |
|             margin-bottom: 10px;
 | |
|             padding: 8px;
 | |
|             border-left: 3px solid #007acc;
 | |
|             background: #252526;
 | |
|         }
 | |
|         .timestamp {
 | |
|             color: #608b4e;
 | |
|             font-weight: bold;
 | |
|         }
 | |
|         .message {
 | |
|             color: #dcdcaa;
 | |
|             font-weight: bold;
 | |
|             margin: 5px 0;
 | |
|         }
 | |
|         .data {
 | |
|             color: #ce9178;
 | |
|             margin-left: 20px;
 | |
|             white-space: pre-wrap;
 | |
|         }
 | |
|         .error {
 | |
|             border-left-color: #f14c4c;
 | |
|             background: #332222;
 | |
|         }
 | |
|         .error .message {
 | |
|             color: #f14c4c;
 | |
|         }
 | |
|         .clear-logs {
 | |
|             background: #0e639c;
 | |
|             color: white;
 | |
|             border: none;
 | |
|             padding: 10px 20px;
 | |
|             cursor: pointer;
 | |
|             border-radius: 3px;
 | |
|             margin: 10px 5px;
 | |
|         }
 | |
|         .clear-logs:hover {
 | |
|             background: #1177bb;
 | |
|         }
 | |
|         h1, h2 {
 | |
|             color: #4ec9b0;
 | |
|         }
 | |
|         .stats {
 | |
|             background: #0f3460;
 | |
|             padding: 10px;
 | |
|             border-radius: 5px;
 | |
|             margin: 10px 0;
 | |
|             color: #9cdcfe;
 | |
|         }
 | |
|     </style>
 | |
| </head>
 | |
| <body>
 | |
|     <h1>Safari Request Debug Logs</h1>
 | |
|     <p>Generated: <?php echo date('Y-m-d H:i:s'); ?></p>
 | |
|     
 | |
|     <?php if ($debug_key !== $expected_key): ?>
 | |
|     <div class="stats">
 | |
|         <strong>Debug Key:</strong> Use <code>?key=<?php echo htmlspecialchars($expected_key); ?></code> for access without WP_DEBUG
 | |
|     </div>
 | |
|     <?php endif; ?>
 | |
| 
 | |
|     <div>
 | |
|         <button class="clear-logs" onclick="if(confirm('Clear Safari debug logs?')) { window.location.href='?clear=safari&key=<?php echo urlencode($debug_key); ?>'; }">
 | |
|             Clear Safari Logs
 | |
|         </button>
 | |
|         <button class="clear-logs" onclick="if(confirm('Clear WordPress debug logs?')) { window.location.href='?clear=wp&key=<?php echo urlencode($debug_key); ?>'; }">
 | |
|             Clear WP Debug Log
 | |
|         </button>
 | |
|         <button class="clear-logs" onclick="window.location.reload();">Refresh</button>
 | |
|     </div>
 | |
| 
 | |
|     <?php
 | |
|     // Handle log clearing
 | |
|     if (isset($_GET['clear'])) {
 | |
|         if ($_GET['clear'] === 'safari' && file_exists($log_file)) {
 | |
|             file_put_contents($log_file, '');
 | |
|             echo '<div class="stats">Safari debug log cleared.</div>';
 | |
|         } elseif ($_GET['clear'] === 'wp' && file_exists($wp_debug_log)) {
 | |
|             file_put_contents($wp_debug_log, '');
 | |
|             echo '<div class="stats">WordPress debug log cleared.</div>';
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // Display Safari debug log
 | |
|     if (file_exists($log_file)) {
 | |
|         $log_content = file_get_contents($log_file);
 | |
|         $log_entries = array_filter(explode("\n", $log_content));
 | |
|         $total_entries = count($log_entries);
 | |
|         
 | |
|         echo '<h2>Safari Debug Log (' . $total_entries . ' entries)</h2>';
 | |
|         
 | |
|         if ($total_entries > 0) {
 | |
|             // Show recent entries first
 | |
|             $log_entries = array_reverse($log_entries);
 | |
|             $shown_entries = array_slice($log_entries, 0, 50); // Show last 50 entries
 | |
|             
 | |
|             echo '<div class="log-container">';
 | |
|             foreach ($shown_entries as $entry) {
 | |
|                 if (empty(trim($entry))) continue;
 | |
|                 
 | |
|                 // Parse log entry
 | |
|                 if (preg_match('/\[(.*?)\] (.*?) \| (.*)/', $entry, $matches)) {
 | |
|                     $timestamp = $matches[1];
 | |
|                     $message = $matches[2];
 | |
|                     $data = $matches[3];
 | |
|                     
 | |
|                     $is_error = (strpos($message, 'ERROR') !== false || strpos($message, 'FATAL') !== false);
 | |
|                     
 | |
|                     echo '<div class="log-entry' . ($is_error ? ' error' : '') . '">';
 | |
|                     echo '<div class="timestamp">' . htmlspecialchars($timestamp) . '</div>';
 | |
|                     echo '<div class="message">' . htmlspecialchars($message) . '</div>';
 | |
|                     
 | |
|                     // Pretty print JSON data
 | |
|                     $decoded = json_decode($data, true);
 | |
|                     if ($decoded) {
 | |
|                         echo '<div class="data">' . htmlspecialchars(json_encode($decoded, JSON_PRETTY_PRINT)) . '</div>';
 | |
|                     } else {
 | |
|                         echo '<div class="data">' . htmlspecialchars($data) . '</div>';
 | |
|                     }
 | |
|                     echo '</div>';
 | |
|                 }
 | |
|             }
 | |
|             echo '</div>';
 | |
|             
 | |
|             if ($total_entries > 50) {
 | |
|                 echo '<div class="stats">Showing 50 most recent entries of ' . $total_entries . ' total.</div>';
 | |
|             }
 | |
|         } else {
 | |
|             echo '<div class="stats">No Safari debug entries found. Make a request with Safari to generate logs.</div>';
 | |
|         }
 | |
|     } else {
 | |
|         echo '<div class="stats">Safari debug log file not found: ' . htmlspecialchars($log_file) . '</div>';
 | |
|     }
 | |
| 
 | |
|     // Display recent WordPress debug log entries that contain Safari info
 | |
|     if (file_exists($wp_debug_log)) {
 | |
|         $wp_log_content = file_get_contents($wp_debug_log);
 | |
|         $wp_log_lines = array_filter(explode("\n", $wp_log_content));
 | |
|         
 | |
|         // Filter for Safari-related entries
 | |
|         $safari_entries = array_filter($wp_log_lines, function($line) {
 | |
|             return (strpos($line, 'SAFARI') !== false || strpos($line, 'Safari') !== false);
 | |
|         });
 | |
|         
 | |
|         if (!empty($safari_entries)) {
 | |
|             echo '<h2>WordPress Debug Log - Safari Entries (' . count($safari_entries) . ' found)</h2>';
 | |
|             echo '<div class="log-container">';
 | |
|             
 | |
|             // Show recent Safari entries
 | |
|             $recent_safari = array_reverse(array_slice($safari_entries, -20));
 | |
|             foreach ($recent_safari as $entry) {
 | |
|                 echo '<div class="log-entry">';
 | |
|                 echo '<div class="data">' . htmlspecialchars($entry) . '</div>';
 | |
|                 echo '</div>';
 | |
|             }
 | |
|             
 | |
|             echo '</div>';
 | |
|         }
 | |
|     }
 | |
|     ?>
 | |
| 
 | |
|     <div class="stats">
 | |
|         <h3>Instructions:</h3>
 | |
|         <ol>
 | |
|             <li>Visit <a href="https://upskill-staging.measurequick.com/find-a-trainer/" target="_blank" style="color: #4fc1ff;">https://upskill-staging.measurequick.com/find-a-trainer/</a> with Safari</li>
 | |
|             <li>Refresh this page to see debug logs</li>
 | |
|             <li>Look for FATAL ERROR or REQUEST COMPLETED entries</li>
 | |
|             <li>Check memory usage patterns and plugin interactions</li>
 | |
|         </ol>
 | |
|         
 | |
|         <p><strong>Log Locations:</strong></p>
 | |
|         <ul>
 | |
|             <li>Safari Debug: <?php echo htmlspecialchars($log_file); ?></li>
 | |
|             <li>WordPress Debug: <?php echo htmlspecialchars($wp_debug_log); ?></li>
 | |
|         </ul>
 | |
|     </div>
 | |
| </body>
 | |
| </html>
 |