## Major Enhancements ### 🏗️ Architecture & Infrastructure - Implement comprehensive Docker testing infrastructure with hermetic environment - Add Forgejo Actions CI/CD pipeline for automated deployments - Create Page Object Model (POM) testing architecture reducing test duplication by 90% - Establish security-first development patterns with input validation and output escaping ### 🧪 Testing Framework Modernization - Migrate 146+ tests from 80 duplicate files to centralized architecture - Add comprehensive E2E test suites for all user roles and workflows - Implement WordPress error detection with automatic site health monitoring - Create robust browser lifecycle management with proper cleanup ### 📚 Documentation & Guides - Add comprehensive development best practices guide - Create detailed administrator setup documentation - Establish user guides for trainers and master trainers - Document security incident reports and migration guides ### 🔧 Core Plugin Features - Enhance trainer profile management with certification system - Improve find trainer functionality with advanced filtering - Strengthen master trainer area with content management - Add comprehensive venue and organizer management ### 🛡️ Security & Reliability - Implement security-first patterns throughout codebase - Add comprehensive input validation and output escaping - Create secure credential management system - Establish proper WordPress role-based access control ### 🎯 WordPress Integration - Strengthen singleton pattern implementation across all classes - Enhance template hierarchy with proper WordPress integration - Improve page manager with hierarchical URL structure - Add comprehensive shortcode and menu system ### 🔍 Developer Experience - Add extensive debugging and troubleshooting tools - Create comprehensive test data seeding scripts - Implement proper error handling and logging - Establish consistent code patterns and standards ### 📊 Performance & Optimization - Optimize database queries and caching strategies - Improve asset loading and script management - Enhance template rendering performance - Streamline user experience across all interfaces 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			225 lines
		
	
	
		
			No EOL
		
	
	
		
			8.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			No EOL
		
	
	
		
			8.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Debug script for MapGeo integration
 | |
|  * Tests filter registration and plugin connectivity
 | |
|  */
 | |
| 
 | |
| // Ensure we're in WordPress context
 | |
| if (!defined('ABSPATH')) {
 | |
|     // Set up WordPress environment
 | |
|     require_once '/var/www/html/wp-config.php';
 | |
| }
 | |
| 
 | |
| // Set up basic debugging
 | |
| define('WP_DEBUG', true);
 | |
| define('WP_DEBUG_LOG', true);
 | |
| 
 | |
| echo "<h2>HVAC MapGeo Integration Debugging</h2>\n";
 | |
| 
 | |
| // 1. Check if Interactive Geo Maps plugin is active
 | |
| echo "<h3>1. Interactive Geo Maps Plugin Status</h3>\n";
 | |
| $igm_plugin_file = 'interactive-geo-maps/interactive-geo-maps.php';
 | |
| if (is_plugin_active($igm_plugin_file)) {
 | |
|     echo "✅ Interactive Geo Maps plugin is ACTIVE<br>\n";
 | |
| } else {
 | |
|     echo "❌ Interactive Geo Maps plugin is NOT ACTIVE<br>\n";
 | |
|     echo "Plugin path checked: {$igm_plugin_file}<br>\n";
 | |
|     
 | |
|     // Check if plugin exists but is inactive
 | |
|     $all_plugins = get_plugins();
 | |
|     echo "All available plugins:<br>\n";
 | |
|     foreach ($all_plugins as $plugin_path => $plugin_data) {
 | |
|         if (stripos($plugin_path, 'interactive') !== false || stripos($plugin_path, 'geo') !== false || stripos($plugin_path, 'map') !== false) {
 | |
|             echo "- {$plugin_path}: {$plugin_data['Name']} (Version: {$plugin_data['Version']})<br>\n";
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| // 2. Check if our integration class exists and is loaded
 | |
| echo "<h3>2. HVAC MapGeo Integration Class Status</h3>\n";
 | |
| if (class_exists('HVAC_MapGeo_Integration')) {
 | |
|     echo "✅ HVAC_MapGeo_Integration class EXISTS<br>\n";
 | |
|     
 | |
|     // Check if instance was created
 | |
|     $reflection = new ReflectionClass('HVAC_MapGeo_Integration');
 | |
|     $instance_property = $reflection->getProperty('instance');
 | |
|     $instance_property->setAccessible(true);
 | |
|     $instance = $instance_property->getValue();
 | |
|     
 | |
|     if ($instance !== null) {
 | |
|         echo "✅ MapGeo Integration instance is CREATED<br>\n";
 | |
|     } else {
 | |
|         echo "❌ MapGeo Integration instance is NOT created<br>\n";
 | |
|         echo "Attempting to create instance...<br>\n";
 | |
|         $instance = HVAC_MapGeo_Integration::get_instance();
 | |
|         echo "✅ Instance created successfully<br>\n";
 | |
|     }
 | |
| } else {
 | |
|     echo "❌ HVAC_MapGeo_Integration class does NOT exist<br>\n";
 | |
|     
 | |
|     // Check if the file exists
 | |
|     $integration_file = '/home/ben/dev/upskill-event-manager/includes/find-trainer/class-hvac-mapgeo-integration.php';
 | |
|     if (file_exists($integration_file)) {
 | |
|         echo "✅ Integration file exists: {$integration_file}<br>\n";
 | |
|         echo "Attempting to load it manually...<br>\n";
 | |
|         require_once $integration_file;
 | |
|         
 | |
|         if (class_exists('HVAC_MapGeo_Integration')) {
 | |
|             echo "✅ Class loaded successfully<br>\n";
 | |
|             $instance = HVAC_MapGeo_Integration::get_instance();
 | |
|             echo "✅ Instance created<br>\n";
 | |
|         } else {
 | |
|             echo "❌ Class still not available after manual load<br>\n";
 | |
|         }
 | |
|     } else {
 | |
|         echo "❌ Integration file does NOT exist<br>\n";
 | |
|     }
 | |
| }
 | |
| 
 | |
| // 3. Check filter registration
 | |
| echo "<h3>3. WordPress Filter Registration Status</h3>\n";
 | |
| global $wp_filter;
 | |
| 
 | |
| $filters_to_check = ['igm_add_meta', 'igm_marker_data'];
 | |
| foreach ($filters_to_check as $filter_name) {
 | |
|     if (isset($wp_filter[$filter_name])) {
 | |
|         echo "✅ Filter '{$filter_name}' is REGISTERED<br>\n";
 | |
|         echo "Callbacks registered:<br>\n";
 | |
|         foreach ($wp_filter[$filter_name]->callbacks as $priority => $callbacks) {
 | |
|             foreach ($callbacks as $callback_id => $callback_data) {
 | |
|                 $callback_name = 'Unknown';
 | |
|                 if (is_array($callback_data['function'])) {
 | |
|                     if (is_object($callback_data['function'][0])) {
 | |
|                         $callback_name = get_class($callback_data['function'][0]) . '::' . $callback_data['function'][1];
 | |
|                     } elseif (is_string($callback_data['function'][0])) {
 | |
|                         $callback_name = $callback_data['function'][0] . '::' . $callback_data['function'][1];
 | |
|                     }
 | |
|                 } elseif (is_string($callback_data['function'])) {
 | |
|                     $callback_name = $callback_data['function'];
 | |
|                 }
 | |
|                 echo "  Priority {$priority}: {$callback_name}<br>\n";
 | |
|             }
 | |
|         }
 | |
|     } else {
 | |
|         echo "❌ Filter '{$filter_name}' is NOT registered<br>\n";
 | |
|     }
 | |
| }
 | |
| 
 | |
| // 4. Test filter execution
 | |
| echo "<h3>4. Test Filter Execution</h3>\n";
 | |
| $test_meta = [
 | |
|     'test_key' => 'test_value',
 | |
|     'roundMarkers' => [],
 | |
|     'map_id' => '5872'
 | |
| ];
 | |
| 
 | |
| echo "Testing igm_add_meta filter...<br>\n";
 | |
| $filtered_meta = apply_filters('igm_add_meta', $test_meta, 5872);
 | |
| 
 | |
| if ($filtered_meta !== $test_meta) {
 | |
|     echo "✅ Filter WAS executed - meta was modified<br>\n";
 | |
|     echo "Original keys: " . implode(', ', array_keys($test_meta)) . "<br>\n";
 | |
|     echo "Filtered keys: " . implode(', ', array_keys($filtered_meta)) . "<br>\n";
 | |
| } else {
 | |
|     echo "❌ Filter was NOT executed - no changes made<br>\n";
 | |
| }
 | |
| 
 | |
| // 5. Check for Interactive Geo Maps functions/classes
 | |
| echo "<h3>5. Interactive Geo Maps Functions/Classes</h3>\n";
 | |
| $igm_functions_to_check = [
 | |
|     'igm_add_meta_filter',
 | |
|     'igm_get_map_data',
 | |
|     'interactive_geo_maps_init',
 | |
| ];
 | |
| 
 | |
| $igm_classes_to_check = [
 | |
|     'Interactive_Geo_Maps',
 | |
|     'IGM_Core',
 | |
|     'IGM_Map',
 | |
|     'IGM_Admin'
 | |
| ];
 | |
| 
 | |
| foreach ($igm_functions_to_check as $function_name) {
 | |
|     if (function_exists($function_name)) {
 | |
|         echo "✅ Function '{$function_name}' EXISTS<br>\n";
 | |
|     } else {
 | |
|         echo "❌ Function '{$function_name}' does NOT exist<br>\n";
 | |
|     }
 | |
| }
 | |
| 
 | |
| foreach ($igm_classes_to_check as $class_name) {
 | |
|     if (class_exists($class_name)) {
 | |
|         echo "✅ Class '{$class_name}' EXISTS<br>\n";
 | |
|     } else {
 | |
|         echo "❌ Class '{$class_name}' does NOT exist<br>\n";
 | |
|     }
 | |
| }
 | |
| 
 | |
| // 6. Check for map shortcode in page content
 | |
| echo "<h3>6. Map Shortcode in Page Content</h3>\n";
 | |
| $find_trainer_page = get_page_by_path('find-a-trainer');
 | |
| if ($find_trainer_page) {
 | |
|     $page_content = $find_trainer_page->post_content;
 | |
|     echo "Find-a-trainer page content length: " . strlen($page_content) . " characters<br>\n";
 | |
|     
 | |
|     if (strpos($page_content, '[display-map') !== false) {
 | |
|         echo "✅ Found [display-map shortcode in page content<br>\n";
 | |
|         preg_match('/\[display-map[^]]*\]/', $page_content, $matches);
 | |
|         if ($matches) {
 | |
|             echo "Shortcode: {$matches[0]}<br>\n";
 | |
|         }
 | |
|     } else {
 | |
|         echo "❌ No [display-map shortcode found in page content<br>\n";
 | |
|     }
 | |
| } else {
 | |
|     echo "❌ Find-a-trainer page not found<br>\n";
 | |
| }
 | |
| 
 | |
| // 7. Check WordPress hook timing
 | |
| echo "<h3>7. WordPress Hook Timing</h3>\n";
 | |
| $current_hook = current_action();
 | |
| echo "Current action: " . ($current_hook ?: 'None') . "<br>\n";
 | |
| 
 | |
| $hooks_fired = [
 | |
|     'init' => did_action('init'),
 | |
|     'wp_loaded' => did_action('wp_loaded'),
 | |
|     'plugins_loaded' => did_action('plugins_loaded'),
 | |
|     'wp_footer' => did_action('wp_footer'),
 | |
|     'wp_head' => did_action('wp_head')
 | |
| ];
 | |
| 
 | |
| foreach ($hooks_fired as $hook_name => $times_fired) {
 | |
|     echo "Hook '{$hook_name}' fired {$times_fired} times<br>\n";
 | |
| }
 | |
| 
 | |
| // 8. Manual filter test with logging
 | |
| echo "<h3>8. Manual Filter Test with Logging</h3>\n";
 | |
| if (class_exists('HVAC_MapGeo_Integration')) {
 | |
|     $integration = HVAC_MapGeo_Integration::get_instance();
 | |
|     
 | |
|     // Create test data that should trigger our integration
 | |
|     $test_map_meta = [
 | |
|         'roundMarkers' => [
 | |
|             [
 | |
|                 'id' => 'test_marker_1',
 | |
|                 'title' => 'Test Trainer',
 | |
|                 'coordinates' => ['lat' => 40.7128, 'lng' => -74.0060],
 | |
|                 'action' => 'igm_display_right_1_3'
 | |
|             ]
 | |
|         ]
 | |
|     ];
 | |
|     
 | |
|     echo "Testing modify_map_layout directly...<br>\n";
 | |
|     $result = $integration->modify_map_layout($test_map_meta, 5872);
 | |
|     
 | |
|     echo "Result keys: " . implode(', ', array_keys($result)) . "<br>\n";
 | |
|     if (isset($result['roundMarkers']) && is_array($result['roundMarkers'])) {
 | |
|         echo "Result has " . count($result['roundMarkers']) . " markers<br>\n";
 | |
|         foreach ($result['roundMarkers'] as $i => $marker) {
 | |
|             echo "Marker {$i} action: " . ($marker['action'] ?? 'none') . "<br>\n";
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| echo "<h3>Debug Complete</h3>\n";
 | |
| echo "Check error logs for additional debugging information.<br>\n"; |