define_constants(); HVAC_Logger::info('Constants defined', 'Core'); $this->includes(); HVAC_Logger::info('Includes completed', 'Core'); $this->init_hooks(); HVAC_Logger::info('Hooks initialized', 'Core'); } /** * Define constants */ private function define_constants() { // Additional constants can be defined here } /** * Include required files */ private function includes() { HVAC_Logger::info('Loading required files', 'Core'); $files_to_include = [ 'class-hvac-roles.php', 'class-hvac-registration.php', 'class-hvac-settings.php', 'community/class-login-handler.php', 'community/class-event-handler.php', 'class-hvac-dashboard-data.php', 'class-hvac-master-dashboard-data.php', 'class-hvac-trainer-status.php', // Trainer status management 'class-hvac-access-control.php', // Access control system 'class-hvac-approval-workflow.php', // Approval workflow system 'class-event-form-handler.php', // Add our form handler 'class-event-author-fixer.php', // Fix event author assignment 'class-hvac-dashboard.php', // New dashboard handler 'class-hvac-manage-event.php', // Manage event page handler 'class-hvac-event-navigation.php', // Event navigation shortcode 'class-hvac-event-manage-header.php', // Event management page header 'class-hvac-help-system.php', // Help system for tooltips and documentation 'certificates/class-certificate-installer.php', // Certificate database installer 'certificates/class-certificate-manager.php', // Certificate management 'certificates/class-certificate-generator.php', // Certificate generation 'certificates/class-certificate-settings.php', // Certificate settings 'certificates/class-certificate-template.php', // Certificate template 'certificates/class-certificate-security.php', // Certificate security 'certificates/class-certificate-url-handler.php', // Certificate URL handler 'certificates/class-certificate-ajax-handler.php', // Certificate AJAX handling 'certificates/class-certificate-fix.php', // Certificate diagnostic/fix tool 'community/class-email-debug.php', // Email debugging tools 'certificates/test-rewrite-rules.php', // Rewrite rules testing (temporary) 'google-sheets/class-google-sheets-auth.php', // Google Sheets authentication 'google-sheets/class-google-sheets-manager.php', // Google Sheets management 'communication/class-communication-templates.php', // Email template management 'communication/class-communication-installer.php', // Communication system database installer 'communication/class-communication-schedule-manager.php', // Communication schedule manager 'communication/class-communication-trigger-engine.php', // Communication trigger engine 'communication/class-communication-logger.php', // Communication logger 'communication/class-communication-scheduler.php', // Communication scheduler 'class-hvac-organizers.php', // Training organizers management 'class-hvac-venues.php', // Training venues management 'class-hvac-trainer-profile-manager.php', // Trainer profile management 'class-hvac-profile-sync-handler.php', // Profile synchronization 'class-hvac-geocoding-service.php', // Geocoding service 'class-hvac-trainer-profile-settings.php', // Profile settings 'class-hvac-geocoding-ajax.php', // Geocoding AJAX handler 'class-hvac-scripts-styles.php', // Scripts and styles management 'class-hvac-shortcodes.php' // Shortcodes management ]; // Make sure Login_Handler is loaded first for shortcode registration $login_handler_path = HVAC_PLUGIN_DIR . 'includes/community/class-login-handler.php'; if (file_exists($login_handler_path)) { require_once $login_handler_path; HVAC_Logger::info("Included file: community/class-login-handler.php", 'Core'); } foreach ($files_to_include as $file) { // Skip Login_Handler as we've already loaded it if ($file === 'community/class-login-handler.php') { continue; } $path = HVAC_PLUGIN_DIR . 'includes/' . $file; if (file_exists($path)) { require_once $path; HVAC_Logger::info("Included file: {$file}", 'Core'); } else { HVAC_Logger::error("Failed to include file: {$file} - File not found", 'Core'); } } // Note: Zoho admin interface will be loaded in init_zoho_admin() method during hooks initialization HVAC_Logger::info('All required files loaded', 'Core'); } /** * Initialize hooks */ private function init_hooks() { // Register activation/deactivation hooks // Note: These hooks are typically registered outside the class instance context // register_activation_hook(__FILE__, array($this, 'activate')); // This won't work correctly here // register_deactivation_hook(__FILE__, array($this, 'deactivate')); // This won't work correctly here // Initialize other hooks add_action('init', array($this, 'init')); // Template loading for custom pages add_filter('template_include', array($this, 'load_custom_templates')); // Force correct content on master dashboard add_filter('the_content', array($this, 'force_master_dashboard_content'), 1); // Authentication checks - these should eventually move to HVAC_Access_Control add_action('template_redirect', array($this, 'check_event_summary_auth')); add_action('template_redirect', array($this, 'check_email_attendees_auth')); add_action('template_redirect', array($this, 'check_certificate_pages_auth')); add_action('template_redirect', array($this, 'check_master_dashboard_auth')); add_action('template_redirect', array($this, 'check_google_sheets_auth')); add_action('template_redirect', array($this, 'ensure_registration_page_public'), 1); // Scripts and styles are now handled by HVAC_Scripts_Styles // add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts')); } // End init_hooks /** * Ensure registration page is always publicly accessible */ public function ensure_registration_page_public() { // List of pages that should be publicly accessible $public_pages = array( 'trainer/registration', // Registration form 'registration-pending', // Registration success/pending page 'training-login', // Login page itself ); // If we're on any of these pages, ensure they're accessible if (is_page($public_pages)) { // Do not redirect to login - these pages should be public // This runs with priority 1, before other auth checks return; } } /** * Check authentication for event summary page */ public function check_event_summary_auth() { // Check if we're on the event-summary page if (is_page('trainer/event/summary') && !is_user_logged_in()) { // Redirect to login page wp_redirect(home_url('/training-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI']))); exit; } } /** * Check authentication for email attendees page */ public function check_email_attendees_auth() { // Check if we're on the email-attendees page if (is_page('trainer/email-attendees') && !is_user_logged_in()) { // Redirect to login page wp_redirect(home_url('/training-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI']))); exit; } } /** * Check authentication for certificate pages */ public function check_certificate_pages_auth() { // Check if we're on certificate-related pages if ((is_page('trainer/certificate-reports') || is_page('trainer/generate-certificates')) && !is_user_logged_in()) { // Redirect to login page wp_redirect(home_url('/training-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI']))); exit; } } /** * Check authentication for master dashboard page */ public function check_master_dashboard_auth() { // Check if we're on the master dashboard page if (is_page('master-trainer/master-dashboard') || is_page(5508)) { if (!is_user_logged_in()) { // Redirect to login page wp_redirect(home_url('/training-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI']))); exit; } // Check if user has master dashboard permissions - include administrator if (!current_user_can('view_master_dashboard') && !current_user_can('view_all_trainer_data') && !current_user_can('administrator')) { // Redirect to regular dashboard or show error wp_redirect(home_url('/trainer/dashboard/?error=access_denied')); exit; } } } /** * Check authentication for Google Sheets page */ public function check_google_sheets_auth() { // Check if we're on the Google Sheets page - use multiple detection methods $is_google_sheets_page = false; // Add debug logging if (isset($_GET['hvac_debug']) && $_GET['hvac_debug'] === 'google_sheets') { error_log('HVAC Google Sheets Auth Check - Starting'); error_log('Request URI: ' . (isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'Not set')); global $post; if ($post) { error_log('Current post ID: ' . $post->ID); error_log('Current post name: ' . $post->post_name); error_log('Current post type: ' . $post->post_type); } } // Method 1: Check by page path/slug if (is_page('master-trainer/google-sheets') || is_page('google-sheets')) { $is_google_sheets_page = true; if (isset($_GET['hvac_debug'])) error_log('HVAC Google Sheets: Detected via is_page()'); } // Method 2: Check by URL if (!$is_google_sheets_page && isset($_SERVER['REQUEST_URI'])) { $uri = $_SERVER['REQUEST_URI']; if (strpos($uri, '/master-trainer/google-sheets') !== false) { $is_google_sheets_page = true; if (isset($_GET['hvac_debug'])) error_log('HVAC Google Sheets: Detected via URL'); } } // Method 3: Check if current page has Google Sheets shortcode global $post; if (!$is_google_sheets_page && $post && has_shortcode($post->post_content, 'hvac_google_sheets')) { $is_google_sheets_page = true; if (isset($_GET['hvac_debug'])) error_log('HVAC Google Sheets: Detected via shortcode'); } // Only proceed if we're actually on the Google Sheets page if ($is_google_sheets_page) { // Prevent infinite redirect loops if (isset($_GET['hvac_redirect_check'])) { return; // Already redirected once, don't redirect again } if (!is_user_logged_in()) { // Add a parameter to prevent redirect loops $redirect_url = add_query_arg('hvac_redirect_check', '1', home_url('/training-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI']))); wp_redirect($redirect_url); exit; } // Check if user has master dashboard permissions (same as master dashboard) if (!current_user_can('view_master_dashboard') && !current_user_can('view_all_trainer_data') && !current_user_can('manage_options')) { // Add a parameter to prevent redirect loops $redirect_url = add_query_arg('hvac_redirect_check', '1', home_url('/trainer/dashboard/?error=access_denied')); wp_redirect($redirect_url); exit; } } } /** * Plugin activation (Should be called statically or from the main plugin file context) */ public static function activate() { // Activation code here (e.g., page creation, role creation) // Note: This method might need to be moved or called differently } /** * Plugin deactivation (Should be called statically or from the main plugin file context) */ public static function deactivate() { // Remove the hvac_trainer role require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-roles.php'; // Ensure class is available HVAC_Roles::remove_hvac_trainer_role(); HVAC_Logger::info('Deactivation completed: HVAC trainer role removed.', 'Core'); } /** * Initialize function (hooked on 'init') */ public function init() { // Initialize roles $this->init_roles(); // Initialize settings (admin menu) $this->init_settings(); // Initialize Zoho admin always (needed for AJAX) $this->init_zoho_admin(); // Initialize Google Sheets integration (needed for AJAX) $this->init_google_sheets(); // Initialize admin dashboard if in admin or handling AJAX if (is_admin() || (defined('DOING_AJAX') && DOING_AJAX)) { $this->init_admin_dashboard(); } // Initialize forms first $this->init_forms(); // Initialize shortcodes after forms are ready $this->init_shortcodes(); // Initialize certificate AJAX handler if (class_exists('HVAC_Certificate_AJAX_Handler')) { HVAC_Certificate_AJAX_Handler::instance(); } // Initialize certificate security if (class_exists('HVAC_Certificate_Security')) { HVAC_Certificate_Security::instance(); } // Initialize certificate URL handler if (class_exists('HVAC_Certificate_URL_Handler')) { HVAC_Certificate_URL_Handler::instance(); } // Add manual flush rewrite rules for admins (debugging) if (is_admin() && current_user_can('manage_options') && isset($_GET['hvac_flush_rewrite']) && $_GET['hvac_flush_rewrite'] === '1') { flush_rewrite_rules(); wp_die('Rewrite rules flushed. Return to admin'); } // Initialize event form handler if (class_exists('HVAC_Community_Events\Event_Form_Handler')) { new \HVAC_Community_Events\Event_Form_Handler(); } // Initialize manage event handler if (class_exists('HVAC_Manage_Event')) { new HVAC_Manage_Event(); } // Initialize dashboard handler if (class_exists('HVAC_Dashboard')) { new HVAC_Dashboard(); } // Initialize help system (singleton) if (class_exists('HVAC_Help_System')) { HVAC_Help_System::instance(); } // Initialize organizers management if (class_exists('HVAC_Organizers')) { new HVAC_Organizers(); } // Initialize venues management if (class_exists('HVAC_Venues')) { new HVAC_Venues(); } // Initialize trainer profile manager if (class_exists('HVAC_Trainer_Profile_Manager')) { HVAC_Trainer_Profile_Manager::get_instance(); } // Initialize scripts and styles management if (class_exists('HVAC_Scripts_Styles')) { HVAC_Scripts_Styles::instance(); } // Initialize shortcodes management if (class_exists('HVAC_Shortcodes')) { HVAC_Shortcodes::instance(); } // Initialize communication system $this->init_communication_system(); // Initialize access control system if (class_exists('HVAC_Access_Control')) { new HVAC_Access_Control(); } // Initialize approval workflow if (class_exists('HVAC_Approval_Workflow')) { new HVAC_Approval_Workflow(); } } /** * Initialize roles */ private function init_roles() { $roles = new HVAC_Roles(); // Note: Role creation is handled in the activate method or the class constructor } /** * Initialize settings */ private function init_settings() { // Settings are already initialized in HVAC_Plugin // new HVAC_Settings(); // Enhanced Settings is now initialized in HVAC_Plugin to avoid duplication // if ( file_exists( HVAC_PLUGIN_DIR . 'includes/admin/class-hvac-enhanced-settings.php' ) ) { // require_once HVAC_PLUGIN_DIR . 'includes/admin/class-hvac-enhanced-settings.php'; // new HVAC_Enhanced_Settings(); // } } /** * Initialize Zoho admin */ private function init_zoho_admin() { // Zoho admin is now initialized in HVAC_Plugin to prevent duplicate initialization // This method is kept for backward compatibility but does nothing } /** * Initialize admin dashboard */ private function init_admin_dashboard() { if (file_exists(HVAC_PLUGIN_DIR . 'includes/admin/class-admin-dashboard.php')) { require_once HVAC_PLUGIN_DIR . 'includes/admin/class-admin-dashboard.php'; new HVAC_Admin_Dashboard(); } } /** * Initialize forms */ private function init_forms() { $this->registration = new HVAC_Registration(); // Note: Form registration is handled in the class constructor // Initialize event navigation shortcode new HVAC_Event_Navigation(); } /** * Initialize shortcodes */ private function init_shortcodes() { // Note: Registration form shortcode is registered in HVAC_Registration constructor // Community login shortcode - initialize Login_Handler to register the shortcode new \HVAC_Community_Events\Community\Login_Handler(); // Dashboard shortcode add_shortcode('hvac_dashboard', array($this, 'render_dashboard')); // Master Dashboard shortcode add_shortcode('hvac_master_dashboard', array($this, 'render_master_dashboard')); // Add the event summary shortcode add_shortcode('hvac_event_summary', array($this, 'render_event_summary')); // Add trainer profile shortcode add_shortcode('hvac_trainer_profile', array($this, 'render_trainer_profile')); // Note: Edit profile shortcode is registered in HVAC_Registration constructor // Add email attendees shortcode add_shortcode('hvac_email_attendees', array($this, 'render_email_attendees')); // Add certificate reports shortcode add_shortcode('hvac_certificate_reports', array($this, 'render_certificate_reports')); // Add generate certificates shortcode add_shortcode('hvac_generate_certificates', array($this, 'render_generate_certificates')); // Certificate fix shortcode is handled by the Certificate Fix class // to avoid duplicate registration and missing method issues // Add Google Sheets admin shortcode add_shortcode('hvac_google_sheets', array($this, 'render_google_sheets_admin')); // Add communication templates shortcode add_shortcode('hvac_communication_templates', array($this, 'render_communication_templates')); // Add communication schedules shortcode add_shortcode('hvac_communication_schedules', array($this, 'render_communication_schedules')); // Removed shortcode override - let The Events Calendar Community Events handle this shortcode // add_shortcode('tribe_community_events', array($this, 'render_tribe_community_events')); // Add future shortcodes here } /** * Render dashboard content */ public function render_dashboard() { // Add debug comment $debug = ''; if (!is_user_logged_in()) { return $debug . '

Please log in to view the dashboard.

'; } // Include the dashboard template ob_start(); echo $debug; include HVAC_PLUGIN_DIR . 'templates/template-hvac-dashboard.php'; return ob_get_clean(); } /** * Render master dashboard content */ public function render_master_dashboard() { if (!is_user_logged_in()) { return '

Please log in to view the master dashboard.

'; } // Check if user has master dashboard permissions - include administrator if (!current_user_can('view_master_dashboard') && !current_user_can('view_all_trainer_data') && !current_user_can('administrator')) { return '
You do not have permission to view the master dashboard. This dashboard is only available to Master Trainers and Administrators.
'; } // Include the master dashboard template ob_start(); include HVAC_PLUGIN_DIR . 'templates/template-hvac-master-dashboard.php'; return ob_get_clean(); } /** * Render event summary content */ public function render_event_summary() { // Check if user is logged in if (!is_user_logged_in()) { return '

Please log in to view the event summary.

'; } // Get event ID from URL parameter $event_id = isset($_GET['event_id']) ? absint($_GET['event_id']) : 0; if ($event_id <= 0) { return '
No event ID provided. Please access this page from your dashboard.
'; } // Check if the event exists and user has permission to view it $event = get_post($event_id); if (!$event || get_post_type($event) !== Tribe__Events__Main::POSTTYPE) { return '
Event not found or invalid.
'; } // Check if the current user has permission to view this event // For now, we'll check if they're the post author or have edit_posts capability if ($event->post_author != get_current_user_id() && !current_user_can('edit_posts')) { return '
You do not have permission to view this event summary.
'; } // Include the event summary template ob_start(); include HVAC_PLUGIN_DIR . 'templates/event-summary/template-event-summary.php'; return ob_get_clean(); } /** * Render trainer profile content */ public function render_trainer_profile() { if (!is_user_logged_in()) { return '

Please log in to view your profile.

'; } // Use the new HVAC_Trainer_Profile_Manager system if available if (class_exists('HVAC_Trainer_Profile_Manager')) { $profile_manager = HVAC_Trainer_Profile_Manager::get_instance(); return $profile_manager->render_profile_view(); } // Fallback to old template (for backward compatibility) ob_start(); include HVAC_PLUGIN_DIR . 'templates/template-trainer-profile.php'; return ob_get_clean(); } /** * Render email attendees content */ public function render_email_attendees() { // Check if user is logged in if (!is_user_logged_in()) { return '

Please log in to email event attendees.

'; } // Get event ID from URL parameter $event_id = isset($_GET['event_id']) ? absint($_GET['event_id']) : 0; if ($event_id <= 0) { return '
No event ID provided. Please access this page from your dashboard or event summary page.
'; } // Check if the event exists and user has permission to view it $event = get_post($event_id); if (!$event || get_post_type($event) !== Tribe__Events__Main::POSTTYPE) { return '
Event not found or invalid.
'; } // Check if the current user has permission to view this event // For now, we'll check if they're the post author or have edit_posts capability if ($event->post_author != get_current_user_id() && !current_user_can('edit_posts')) { return '
You do not have permission to email attendees for this event.
'; } // Include the email attendees template ob_start(); include HVAC_PLUGIN_DIR . 'templates/email-attendees/template-email-attendees.php'; return ob_get_clean(); } /** * Validate template file for common syntax errors * @param string $file_path Path to the template file * @return bool|string True if valid, error message otherwise */ private function validate_template_file($file_path) { // Check if the file exists if (!file_exists($file_path)) { return "Template file does not exist: {$file_path}"; } // Get file contents $content = file_get_contents($file_path); // Check for common syntax errors with escaped operators $common_errors = [ '\\!==', // Escaped !== '\\!=' , // Escaped != '\\!' , // Escaped ! '\\=' , // Escaped = '\\>' , // Escaped > '\\<' , // Escaped < ]; foreach ($common_errors as $error) { if (strpos($content, $error) !== false) { // Find the line number $lines = explode("\n", $content); $line_number = 0; foreach ($lines as $i => $line) { if (strpos($line, $error) !== false) { $line_number = $i + 1; break; } } // Log the error for admin $filename = basename($file_path); HVAC_Logger::error("Syntax error detected in {$filename} line {$line_number}: Improper escape sequence {$error}", 'Core'); return "Template file contains syntax errors: {$filename} line {$line_number}. Please contact the administrator."; } } return true; } /** * Render certificate reports content */ public function render_certificate_reports() { // Check if user is logged in if (!is_user_logged_in()) { return '

Please log in to view certificate reports.

'; } // Check if the current user has permission to view certificate reports // For now, we'll check if they're a trainer or have edit_posts capability if (!current_user_can('hvac_trainer') && !current_user_can('edit_posts')) { return '
You do not have permission to view certificate reports.
'; } // Make sure certificate manager is loaded require_once HVAC_PLUGIN_DIR . 'includes/certificates/class-certificate-manager.php'; // Make sure certificate security is loaded require_once HVAC_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php'; // Validate the template file before including $template_path = HVAC_PLUGIN_DIR . 'templates/certificates/template-certificate-reports.php'; $validation = $this->validate_template_file($template_path); if ($validation !== true) { return '
' . esc_html($validation) . '
'; } // Include the certificate reports template with error handling try { ob_start(); include $template_path; return ob_get_clean(); } catch (Exception $e) { return '
Error loading certificate reports: ' . esc_html($e->getMessage()) . '
'; } } /** * Render generate certificates content */ public function render_generate_certificates() { // Check if user is logged in if (!is_user_logged_in()) { return '

Please log in to generate certificates.

'; } // Get event ID from URL parameter if available $event_id = isset($_GET['event_id']) ? absint($_GET['event_id']) : 0; // Check if the event exists and user has permission to view it when event_id is provided if ($event_id > 0) { $event = get_post($event_id); if (!$event || get_post_type($event) !== Tribe__Events__Main::POSTTYPE) { return '
Event not found or invalid.
'; } // Check if the current user has permission to view this event if ($event->post_author != get_current_user_id() && !current_user_can('edit_posts')) { return '
You do not have permission to generate certificates for this event.
'; } } else { // If no event ID is provided, check general permissions if (!current_user_can('hvac_trainer') && !current_user_can('edit_posts')) { return '
You do not have permission to generate certificates.
'; } } // Make sure certificate manager is loaded require_once HVAC_PLUGIN_DIR . 'includes/certificates/class-certificate-manager.php'; // Make sure certificate security is loaded require_once HVAC_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php'; // Make sure certificate generator is loaded require_once HVAC_PLUGIN_DIR . 'includes/certificates/class-certificate-generator.php'; // Validate the template file before including $template_path = HVAC_PLUGIN_DIR . 'templates/certificates/template-generate-certificates.php'; $validation = $this->validate_template_file($template_path); if ($validation !== true) { return '
' . esc_html($validation) . '
'; } // Include the generate certificates template with error handling try { ob_start(); include $template_path; return ob_get_clean(); } catch (Exception $e) { return '
Error loading certificate generation: ' . esc_html($e->getMessage()) . '
'; } } /** * Include custom templates for plugin pages */ public function load_custom_templates($template) { $custom_template = null; // Check for dashboard page if (is_page('trainer/dashboard')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/template-hvac-dashboard.php'; } // For master dashboard, check if page has custom template if (is_page('master-trainer/master-dashboard')) { global $post; $page_template = get_post_meta($post->ID, '_wp_page_template', true); if ($page_template && $page_template !== 'default') { // Let WordPress handle the page template return $template; } } // Check for google-sheets page if (is_page('master-trainer/google-sheets')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/template-google-sheets.php'; } // Check for community-login page if (is_page('training-login')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/page-community-login.php'; } // Check for trainer-profile page if (is_page('trainer/my-profile')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/template-trainer-profile.php'; } // Check for new trainer profile page if (is_page('trainer/profile')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/page-trainer-profile.php'; } // Check for event-summary page if (is_page('trainer/event/summary')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/template-event-summary.php'; } // Check for manage-event page if (is_page('trainer/event/manage')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/page-manage-event.php'; } // Check for email-attendees page if (is_page('trainer/email-attendees')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/email-attendees/template-email-attendees.php'; } // Check for certificate-reports page if (is_page('trainer/certificate-reports')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/page-certificate-reports.php'; } // Check for generate-certificates page if (is_page('trainer/generate-certificates')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/page-generate-certificates.php'; } // Check for edit-profile page if (is_page('edit-profile')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/template-edit-profile.php'; } // Check for communication-templates page if (is_page('trainer/communication-templates')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/communication/template-communication-templates.php'; } // Check for single event view (temporary) if (is_singular('tribe_events')) { $custom_template = HVAC_PLUGIN_DIR . 'templates/single-tribe_events.php'; } // Process the custom template if one was found if ($custom_template !== null) { // Check if file exists if (file_exists($custom_template)) { // Validate certificate templates for syntax errors if (strpos($custom_template, 'certificates/') !== false) { $validation = $this->validate_template_file($custom_template); if ($validation !== true) { // Log error and show friendly message HVAC_Logger::error("Template validation failed in load_custom_templates: {$validation}", 'Core'); // Display error or fallback template add_action('wp_head', function() use ($validation) { echo '
There was a problem loading this page. ' . 'The administrator has been notified. Please try again later.
'; }); // Either fall back to the standard WP template or use a simple error template return $template; } } // Template exists and passes validation return $custom_template; } } return $template; } // End load_custom_templates /** * Force master dashboard content on master dashboard page */ public function force_master_dashboard_content($content) { // Only on master dashboard page if (is_page('master-trainer/master-dashboard') && in_the_loop() && is_main_query()) { // Return the master dashboard content return $this->render_master_dashboard(); } return $content; } // REMOVED: render_tribe_community_events() method // This method was overriding The Events Calendar Community Events shortcode // Let TEC handle the shortcode properly instead /** * Render Google Sheets admin content */ public function render_google_sheets_admin() { if (!is_user_logged_in()) { return '

Please log in to access Google Sheets integration.

'; } // Check if user has master dashboard permissions if (!current_user_can('view_master_dashboard') && !current_user_can('view_all_trainer_data') && !current_user_can('manage_options')) { return '

You do not have permission to access Google Sheets integration.

'; } // Initialize Google Sheets admin if not already done if (!class_exists('HVAC_Google_Sheets_Admin')) { require_once HVAC_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-admin.php'; } $google_sheets_admin = new HVAC_Google_Sheets_Admin(); ob_start(); $google_sheets_admin->render_admin_page(); return ob_get_clean(); } /** * Initialize Google Sheets integration */ private function init_google_sheets() { // Always initialize auth handler for OAuth callbacks if (file_exists(HVAC_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-auth.php')) { require_once HVAC_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-auth.php'; new HVAC_Google_Sheets_Auth(); } // Initialize admin interface if (file_exists(HVAC_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-admin.php')) { require_once HVAC_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-admin.php'; new HVAC_Google_Sheets_Admin(); } } /** * Initialize communication system */ private function init_communication_system() { // Check and install/update communication database tables if (class_exists('HVAC_Communication_Installer')) { HVAC_Communication_Installer::maybe_update(); } // Initialize the communication scheduler (singleton) if (class_exists('HVAC_Communication_Scheduler')) { hvac_communication_scheduler(); } if (class_exists('HVAC_Logger')) { HVAC_Logger::info('Communication system initialized', 'Communication System'); } } /** * Render communication templates content */ public function render_communication_templates() { if (!is_user_logged_in()) { return '

Please log in to manage communication templates.

'; } // Check if user is a trainer or has permission to manage templates $current_user = wp_get_current_user(); if (!in_array('hvac_trainer', $current_user->roles) && !current_user_can('edit_posts')) { return '

You do not have permission to manage communication templates.

'; } // Initialize the communication templates class if (!class_exists('HVAC_Communication_Templates')) { require_once HVAC_PLUGIN_DIR . 'includes/communication/class-communication-templates.php'; } ob_start(); include HVAC_PLUGIN_DIR . 'templates/communication/template-communication-templates.php'; return ob_get_clean(); } /** * Render communication schedules content */ public function render_communication_schedules() { if (!is_user_logged_in()) { return '

Please log in to manage communication schedules.

'; } // Check if user is a trainer or has permission to manage schedules $current_user = wp_get_current_user(); if (!in_array('hvac_trainer', $current_user->roles) && !current_user_can('edit_posts')) { return '

You do not have permission to manage communication schedules.

'; } // Initialize the communication scheduler class if (!class_exists('HVAC_Communication_Scheduler')) { require_once HVAC_PLUGIN_DIR . 'includes/communication/class-communication-scheduler.php'; } ob_start(); include HVAC_PLUGIN_DIR . 'templates/communication/template-communication-schedules.php'; return ob_get_clean(); } /** * Enqueue scripts and styles for HVAC pages */ public function enqueue_scripts() { // Check if we're on any HVAC page $current_path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); $is_hvac_page = false; // List of HVAC page patterns $hvac_patterns = array( 'trainer/', 'master-trainer/', 'training-login', 'registration-pending', 'trainer-account-' ); // Check if current path matches any HVAC pattern foreach ($hvac_patterns as $pattern) { if (strpos($current_path, $pattern) === 0 || $current_path === rtrim($pattern, '/')) { $is_hvac_page = true; break; } } // Also check if any HVAC shortcodes are present global $post; if (is_a($post, 'WP_Post')) { $hvac_shortcodes = array( 'hvac_dashboard', 'hvac_master_dashboard', 'hvac_event_summary', 'hvac_trainer_profile', 'hvac_email_attendees', 'hvac_certificate_reports', 'hvac_generate_certificates', 'hvac_google_sheets', 'hvac_communication_templates', 'hvac_communication_schedules' ); foreach ($hvac_shortcodes as $shortcode) { if (has_shortcode($post->post_content, $shortcode)) { $is_hvac_page = true; break; } } } if (!$is_hvac_page) { return; } // Enqueue common HVAC styles wp_enqueue_style( 'hvac-common-style', HVAC_PLUGIN_URL . 'assets/css/hvac-common.css', array(), HVAC_PLUGIN_VERSION ); // Enqueue harmonized framework wp_enqueue_style( 'hvac-harmonized-framework', HVAC_PLUGIN_URL . 'assets/css/hvac-harmonized.css', array('hvac-common-style'), HVAC_PLUGIN_VERSION ); // Enqueue main plugin CSS wp_enqueue_style( 'hvac-community-events', HVAC_PLUGIN_URL . 'assets/css/hvac-community-events.css', array('hvac-harmonized-framework'), HVAC_PLUGIN_VERSION ); // Enqueue main plugin JavaScript wp_enqueue_script( 'hvac-community-events', HVAC_PLUGIN_URL . 'assets/js/hvac-community-events.js', array('jquery'), HVAC_PLUGIN_VERSION, true ); // Localize script wp_localize_script('hvac-community-events', 'hvac_ajax', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('hvac_ajax_nonce') )); } } // End class HVAC_Community_Events