upskill-event-manager/includes/class-hvac-community-events.php
bengizmo a1abbf1577 fix: Resolve duplicate content and raw shortcode display on manage event page
- Strip WordPress block editor comments (<\!-- wp:shortcode -->) from content
- Prevent duplicate header rendering when using page template vs shortcode
- Add conditional header rendering based on URL path to avoid duplication
- Header now only renders for non-hierarchical URLs where template isn't used

The manage event page was showing duplicate "Create and Manage Your HVAC Training Events"
sections and raw block editor comments because both the template and the header class
were outputting content, and block editor wrapper comments weren't being stripped.

Co-Authored-By: Ben Reed <ben@tealmaker.com>
2025-07-30 10:06:49 -03:00

1077 lines
No EOL
36 KiB
PHP

<?php
/**
* Main plugin class for HVAC Community Events
*/
if (!defined('ABSPATH')) {
exit;
}
class HVAC_Community_Events {
/**
* The single instance of the class
*/
private static $instance = null;
/**
* Registration instance
*/
private $registration = null;
/**
* Main instance
*/
public static function instance() {
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor
*/
public function __construct() {
HVAC_Logger::info('HVAC_Community_Events constructor started', 'Core');
$this->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
];
// 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. <a href="' . admin_url() . '">Return to admin</a>');
}
// 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 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 = '<!-- HVAC_Community_Events::render_dashboard called -->';
if (!is_user_logged_in()) {
return $debug . '<p>Please log in to view the dashboard.</p>';
}
// 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 '<p>Please log in to view the master dashboard.</p>';
}
// 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 '<div class="hvac-error">You do not have permission to view the master dashboard. This dashboard is only available to Master Trainers and Administrators.</div>';
}
// 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 '<p>Please log in to view the event summary.</p>';
}
// Get event ID from URL parameter
$event_id = isset($_GET['event_id']) ? absint($_GET['event_id']) : 0;
if ($event_id <= 0) {
return '<div class="hvac-error">No event ID provided. Please access this page from your dashboard.</div>';
}
// 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 '<div class="hvac-error">Event not found or invalid.</div>';
}
// 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 '<div class="hvac-error">You do not have permission to view this event summary.</div>';
}
// 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 '<p>Please log in to view your profile.</p>';
}
// Include the trainer profile template
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 '<p>Please log in to email event attendees.</p>';
}
// Get event ID from URL parameter
$event_id = isset($_GET['event_id']) ? absint($_GET['event_id']) : 0;
if ($event_id <= 0) {
return '<div class="hvac-error">No event ID provided. Please access this page from your dashboard or event summary page.</div>';
}
// 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 '<div class="hvac-error">Event not found or invalid.</div>';
}
// 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 '<div class="hvac-error">You do not have permission to email attendees for this event.</div>';
}
// 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 '<p>Please log in to view certificate reports.</p>';
}
// 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 '<div class="hvac-error">You do not have permission to view certificate reports.</div>';
}
// 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 '<div class="hvac-error">' . esc_html($validation) . '</div>';
}
// Include the certificate reports template with error handling
try {
ob_start();
include $template_path;
return ob_get_clean();
} catch (Exception $e) {
return '<div class="hvac-error">Error loading certificate reports: ' . esc_html($e->getMessage()) . '</div>';
}
}
/**
* Render generate certificates content
*/
public function render_generate_certificates() {
// Check if user is logged in
if (!is_user_logged_in()) {
return '<p>Please log in to generate certificates.</p>';
}
// 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 '<div class="hvac-error">Event not found or invalid.</div>';
}
// 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 '<div class="hvac-error">You do not have permission to generate certificates for this event.</div>';
}
} else {
// If no event ID is provided, check general permissions
if (!current_user_can('hvac_trainer') && !current_user_can('edit_posts')) {
return '<div class="hvac-error">You do not have permission to generate certificates.</div>';
}
}
// 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 '<div class="hvac-error">' . esc_html($validation) . '</div>';
}
// Include the generate certificates template with error handling
try {
ob_start();
include $template_path;
return ob_get_clean();
} catch (Exception $e) {
return '<div class="hvac-error">Error loading certificate generation: ' . esc_html($e->getMessage()) . '</div>';
}
}
/**
* 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 event-summary page
if (is_page('trainer/event/summary')) {
$custom_template = HVAC_PLUGIN_DIR . 'templates/template-event-summary.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/certificates/template-certificate-reports.php';
}
// Check for generate-certificates page
if (is_page('trainer/generate-certificates')) {
$custom_template = HVAC_PLUGIN_DIR . 'templates/certificates/template-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 '<div class="hvac-error">There was a problem loading this page. ' .
'The administrator has been notified. Please try again later.</div>';
});
// 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 '<p>Please log in to access Google Sheets integration.</p>';
}
// 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 '<p>You do not have permission to access Google Sheets integration.</p>';
}
// 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 '<p>Please log in to manage communication templates.</p>';
}
// 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 '<p>You do not have permission to manage communication templates.</p>';
}
// 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 '<p>Please log in to manage communication schedules.</p>';
}
// 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 '<p>You do not have permission to manage communication schedules.</p>';
}
// 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