## 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"; |