# HVAC Plugin Troubleshooting Guide ## Table of Contents - [Common Issues](#common-issues) - [Debugging Techniques](#debugging-techniques) - [Error Messages](#error-messages) - [Performance Issues](#performance-issues) - [Deployment Problems](#deployment-problems) - [Theme Conflicts](#theme-conflicts) - [Database Issues](#database-issues) - [Recovery Procedures](#recovery-procedures) ## Common Issues ### 1. Pages Not Found (404 Errors) **Symptoms:** - Trainer pages return 404 - Certificate reports page not accessible - Profile page missing **Solutions:** ```bash # Flush rewrite rules wp rewrite flush # Recreate pages wp eval 'do_action("hvac_create_pages");' # Verify page exists wp post list --post_type=page --name=trainer ``` **Code Fix:** ```php // Force page creation in plugin HVAC_Page_Manager::create_required_pages(); flush_rewrite_rules(); ``` ### 2. Duplicate Navigation Menus **Symptoms:** - Two navigation bars showing - Both trainer and master menus visible **Root Cause:** - User has both trainer and master trainer roles - Navigation system rendering both menus **Solution:** Already fixed in `HVAC_Menu_System`: ```php // Check get_menu_structure() method // Master trainers always see master menu only ``` ### 3. Missing CSS/Styling **Symptoms:** - Pages appear unstyled - Broken layouts - Missing theme integration **Diagnosis:** ```php // Check if CSS is loading add_action('wp_head', function() { global $wp_styles; echo ""; }); ``` **Solutions:** 1. Verify `HVAC_Scripts_Styles` is loading 2. Check `is_plugin_page()` detection 3. Ensure template has `HVAC_IN_PAGE_TEMPLATE` constant ### 4. Mobile CSS Issues #### Modal Overlay Appearing on Page Load **Symptoms:** - Non-functional "Apply" button overlay appears on find-trainer page - Modal visible by default on mobile devices - Overlay blocks interaction with page content **Root Cause:** - CSS specificity conflict: `display: flex !important` in CSS overrides inline `style="display: none"` - Modal visibility controlled by both CSS and JavaScript **Solution:** Add `!important` to inline styles in the HTML template: ```html
``` Also ensure CSS has proper default state: ```css /* In assets/css/find-trainer.css */ .hvac-filter-modal, #hvac-filter-modal { display: none !important; visibility: hidden; opacity: 0; pointer-events: none; } ``` **Files Modified:** - `templates/page-find-trainer.php` (line 535) - `assets/css/find-trainer.css` - `assets/js/find-trainer.js` (initialization checks) - `astra-child-hvac/css/hvac-find-trainer-mobile.css` #### Excessive Mobile Padding **Symptoms:** - Too much left/right padding on mobile views - Wasted screen space on small devices - Content not utilizing full viewport width **Solution:** Set all container padding to 0 on mobile breakpoints: ```css /* In astra-child-hvac/css/hvac-find-trainer-mobile.css */ @media screen and (max-width: 768px) { body.hvac-find-trainer-page .ast-container, body.page-id-1653 .ast-container { padding: 0 !important; margin: 0 !important; width: 100% !important; } /* Filters section with minimal margins */ .hvac-filters-section { margin: 0 5px !important; padding: 8px !important; } } ``` **Deployment:** Use child theme CSS deployment script: ```bash scripts/deploy-child-theme-css.sh ``` ### 5. Sidebar Still Showing **Symptoms:** - 2-column layout persists - Sidebar visible on trainer pages **Solutions:** 1. Check Astra integration is active: ```php // In theme's functions.php temporarily add_action('init', function() { if (class_exists('HVAC_Astra_Integration')) { error_log('Astra integration loaded'); } }); ``` 2. Force no-sidebar via database: ```bash wp eval ' $pages = get_posts(array( "post_type" => "page", "meta_key" => "_wp_page_template", "meta_value" => "trainer", "meta_compare" => "LIKE" )); foreach($pages as $page) { update_post_meta($page->ID, "site-sidebar-layout", "no-sidebar"); update_post_meta($page->ID, "ast-site-sidebar-layout", "no-sidebar"); }' ``` ### 5. Profile Page Using Wrong Template **Symptoms:** - Old navigation showing - Missing fields - Wrong layout **Quick Fix:** ```bash # Find profile page wp post list --post_type=page --name=profile --fields=ID,post_title # Update template wp post meta update [PAGE_ID] _wp_page_template templates/page-trainer-profile.php ``` ### 6. Certificate Pages Template Issues **Symptoms:** - Certificate pages show only content without theme headers - Missing navigation menu on certificate pages - Duplicate breadcrumbs appearing - Pages look "broken" or unstyled **Root Causes:** 1. Template system loading content-only templates instead of full page templates 2. Astra theme adding its own breadcrumbs while plugin adds more 3. Navigation rendering being blocked by constants **Solutions:** **Fix Template Loading:** ```php // In class-hvac-community-events.php load_custom_templates() method // Change from: $custom_template = HVAC_PLUGIN_DIR . 'templates/certificates/template-certificate-reports.php'; // To: $custom_template = HVAC_PLUGIN_DIR . 'templates/page-certificate-reports.php'; ``` **Disable Duplicate Breadcrumbs:** ```php // In class-hvac-astra-integration.php add_filter('astra_breadcrumb_enabled', [$this, 'disable_astra_breadcrumbs'], 999); add_filter('astra_get_option_ast-breadcrumbs-content', [$this, 'disable_breadcrumb_option'], 999); ``` **Enable Navigation Menu:** ```php // In page templates, remove problematic constant checks: // Remove this: if (class_exists('HVAC_Menu_System') && !defined('HVAC_NAV_RENDERED')) { define('HVAC_NAV_RENDERED', true); HVAC_Menu_System::instance()->render_trainer_menu(); } // Replace with this: if (class_exists('HVAC_Menu_System')) { HVAC_Menu_System::instance()->render_trainer_menu(); } ``` **Quick Diagnostic:** ```bash # Check which template is being used wp eval 'echo get_page_template_slug(get_page_by_path("trainer/certificate-reports")->ID);' # Verify CSS is loading wp eval 'wp_head(); wp_footer();' | grep -i certificate ``` ## Debugging Techniques ### 1. Enable WordPress Debug Mode **wp-config.php:** ```php define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); define('SCRIPT_DEBUG', true); ``` ### 2. Plugin-Specific Debug **Add to plugin file:** ```php // Debug page detection add_action('wp', function() { if (defined('HVAC_DEBUG') && HVAC_DEBUG) { error_log('Current page: ' . $_SERVER['REQUEST_URI']); error_log('Is plugin page: ' . (HVAC_Scripts_Styles::is_plugin_page() ? 'yes' : 'no')); error_log('Template: ' . get_page_template()); } }); ``` ### 3. JavaScript Debugging ```javascript // Add debug logging if (window.hvac_debug) { console.log('HVAC Debug:', { page: window.location.pathname, user: hvac_ajax.user_id, role: hvac_ajax.user_role }); } ``` ### 4. Database Query Monitoring ```php // Log all queries for a page load define('SAVEQUERIES', true); add_action('shutdown', function() { global $wpdb; error_log('Total queries: ' . count($wpdb->queries)); foreach($wpdb->queries as $query) { if ($query[1] > 0.05) { // Queries taking > 50ms error_log('Slow query: ' . $query[0] . ' (' . $query[1] . 's)'); } } }); ``` ## Error Messages ### "There has been a critical error on this website" **Common Causes:** 1. PHP syntax error 2. Missing required file 3. Fatal error in hook **Debugging Steps:** ```bash # Check PHP error log tail -f wp-content/debug.log # Check syntax php -l includes/class-name.php # Enable recovery mode wp config set WP_DISABLE_FATAL_ERROR_HANDLER true ``` ### "Headers already sent" **Cause:** Output before WordPress headers **Fix:** ```php // Remove any whitespace before "; echo ""; }); ``` **Common Fixes:** 1. Enable object caching 2. Optimize database queries 3. Use transients for expensive operations ### 2. High Database Query Count **Identify Problem Queries:** ```php // Find duplicate queries add_filter('posts_request', function($query) { error_log('Query: ' . $query); return $query; }); ``` **Optimization:** ```php // Cache user queries $cache_key = 'hvac_trainer_' . $user_id; $trainer_data = wp_cache_get($cache_key); if (false === $trainer_data) { $trainer_data = get_user_meta($user_id); wp_cache_set($cache_key, $trainer_data, '', 3600); } ``` ### 3. Memory Issues **Symptoms:** - "Allowed memory size exhausted" - White screen of death **Solutions:** ```php // Increase memory limit define('WP_MEMORY_LIMIT', '256M'); define('WP_MAX_MEMORY_LIMIT', '512M'); // Find memory usage error_log('Memory: ' . memory_get_usage() / 1024 / 1024 . 'MB'); error_log('Peak: ' . memory_get_peak_usage() / 1024 / 1024 . 'MB'); ``` ## Deployment Problems ### 1. Plugin Not Activating **Check Requirements:** ```bash # PHP version php -v # Required extensions php -m | grep -E "(mysqli|curl|gd|mbstring)" # WordPress version wp core version ``` ### 2. Files Not Updating **Clear All Caches:** ```bash # WordPress cache wp cache flush # Opcache wp eval 'if (function_exists("opcache_reset")) opcache_reset();' # Breeze cache wp breeze purge --all # CloudFlare (if applicable) # Use CloudFlare dashboard or API ``` ### 3. Database Changes Not Applying **Force Update:** ```bash # Deactivate and reactivate wp plugin deactivate hvac-community-events wp plugin activate hvac-community-events # Run activation hook manually wp eval 'do_action("activate_hvac-community-events/hvac-community-events.php");' ``` ## Theme Conflicts ### 1. Astra Theme Issues **Check Theme Version:** ```bash wp theme list --fields=name,version,status ``` **Force Compatibility:** ```php // Add to theme's functions.php add_action('after_setup_theme', function() { // Force load Astra integration if (!class_exists('HVAC_Astra_Integration')) { require_once WP_PLUGIN_DIR . '/hvac-community-events/includes/class-hvac-astra-integration.php'; HVAC_Astra_Integration::instance(); } }, 5); ``` ### 2. Other Theme Conflicts **Identify Conflicts:** ```php // Switch to default theme temporarily wp theme activate twentytwentyone // Test plugin functionality // If it works, theme conflict confirmed ``` **Common Fixes:** 1. Add theme-specific integration class 2. Use more specific CSS selectors 3. Adjust hook priorities ## Database Issues ### 1. Missing Meta Keys **Audit Meta Keys:** ```bash # Check post meta wp db query "SELECT DISTINCT meta_key FROM wp_postmeta WHERE meta_key LIKE '%hvac%'" # Check user meta wp db query "SELECT DISTINCT meta_key FROM wp_usermeta WHERE meta_key LIKE '%hvac%'" ``` ### 2. Orphaned Data **Clean Orphaned Event Data:** ```sql -- Find events without trainers SELECT ID, post_title FROM wp_posts p WHERE post_type = 'tribe_events' AND NOT EXISTS ( SELECT 1 FROM wp_postmeta pm WHERE pm.post_id = p.ID AND pm.meta_key = '_EventTrainerID' ); ``` ### 3. Data Migration **Migrate Legacy Roles:** ```php // Run via WP-CLI wp eval ' $users = get_users(array("role" => "event_trainer")); foreach($users as $user) { $user->remove_role("event_trainer"); $user->add_role("hvac_trainer"); echo "Migrated user: " . $user->user_login . "\n"; }' ``` ## Recovery Procedures ### 1. Emergency Rollback ```bash # SSH to server ssh user@server # Navigate to plugins cd /path/to/wp-content/plugins # Backup current version mv hvac-community-events hvac-community-events-broken # Restore previous version cp -r hvac-backups/hvac-community-events-backup-[date] hvac-community-events # Reactivate wp plugin activate hvac-community-events # Clear caches wp cache flush ``` ### 2. Database Recovery ```bash # Export current state wp db export backup-$(date +%Y%m%d-%H%M%S).sql # If needed, restore from backup wp db import backup-file.sql # Verify data wp db query "SELECT COUNT(*) FROM wp_posts WHERE post_type = 'tribe_events'" ``` ### 3. Complete Reset **Nuclear Option - Full Reset:** ```bash # Backup everything first! wp db export full-backup.sql # Deactivate plugin wp plugin deactivate hvac-community-events # Remove all plugin data wp eval ' // Delete all pages $pages = get_posts(array( "post_type" => "page", "meta_key" => "_wp_page_template", "meta_value" => "hvac", "meta_compare" => "LIKE", "posts_per_page" => -1 )); foreach($pages as $page) { wp_delete_post($page->ID, true); } // Delete options delete_option("hvac_plugin_version"); delete_option("hvac_settings"); ' # Reinstall wp plugin activate hvac-community-events ``` ## Monitoring & Logging ### 1. Set Up Error Monitoring ```php // Add to plugin class HVAC_Error_Handler { public static function log_error($message, $context = array()) { $log_entry = sprintf( '[%s] %s | Context: %s', current_time('mysql'), $message, json_encode($context) ); error_log($log_entry, 3, WP_CONTENT_DIR . '/hvac-errors.log'); // Also send to external service if configured if (defined('HVAC_ERROR_WEBHOOK')) { wp_remote_post(HVAC_ERROR_WEBHOOK, array( 'body' => json_encode(array( 'message' => $message, 'context' => $context, 'site' => home_url() )) )); } } } ``` ### 2. Performance Monitoring ```php // Track slow operations function hvac_track_performance($operation, $callback) { $start = microtime(true); $result = $callback(); $duration = microtime(true) - $start; if ($duration > 1.0) { // Log operations taking > 1 second HVAC_Error_Handler::log_error( 'Slow operation detected', array( 'operation' => $operation, 'duration' => $duration, 'memory' => memory_get_peak_usage() / 1024 / 1024 ) ); } return $result; } ``` ## Quick Reference Commands ```bash # Check plugin status wp plugin list --name=hvac-community-events # View recent errors tail -f wp-content/debug.log | grep -i hvac # Clear all caches wp cache flush && wp rewrite flush && wp breeze purge --all # Test page routing wp eval 'print_r(get_page_by_path("trainer/dashboard"));' # Force recreate pages wp eval 'HVAC_Page_Manager::create_required_pages();' # Check user roles wp user list --role=hvac_trainer,hvac_master_trainer # Database optimization wp db optimize ```