refactor: Implement new plugin architecture with single-responsibility classes
- Create HVAC_Shortcodes class to centralize shortcode management - Create HVAC_Scripts_Styles class for all script/style enqueuing - Create HVAC_Route_Manager class for URL routing and redirects - Update HVAC_Plugin to use new architecture components - Remove duplicate functionality from HVAC_Community_Events - Add comprehensive refactoring plan documentation This refactoring resolves duplicate initialization issues and creates a cleaner, more maintainable architecture with clear separation of concerns. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
		
							parent
							
								
									a58ea1603c
								
							
						
					
					
						commit
						005a35d89e
					
				
					 6 changed files with 1249 additions and 246 deletions
				
			
		
							
								
								
									
										141
									
								
								docs/PLUGIN-ARCHITECTURE-REFACTORING.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								docs/PLUGIN-ARCHITECTURE-REFACTORING.md
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,141 @@ | ||||||
|  | # HVAC Plugin Architecture Refactoring Plan | ||||||
|  | 
 | ||||||
|  | ## Current Issues | ||||||
|  | 
 | ||||||
|  | 1. **Duplicate Functionality**: HVAC_Plugin and HVAC_Community_Events have overlapping responsibilities | ||||||
|  | 2. **Multiple Initialization**: Components are initialized in multiple places causing duplication | ||||||
|  | 3. **Mixed Concerns**: Classes handle multiple unrelated responsibilities | ||||||
|  | 4. **Inconsistent Patterns**: Some classes use singleton, others don't | ||||||
|  | 5. **Legacy Code**: Backward compatibility code mixed with new features | ||||||
|  | 
 | ||||||
|  | ## Proposed Architecture | ||||||
|  | 
 | ||||||
|  | ### Phase 1: Create Dedicated Single-Responsibility Classes | ||||||
|  | 
 | ||||||
|  | #### 1.1 HVAC_Shortcodes Class | ||||||
|  | - **Purpose**: Register and manage all plugin shortcodes | ||||||
|  | - **Location**: `/includes/class-hvac-shortcodes.php` | ||||||
|  | - **Responsibilities**: | ||||||
|  |   - Register all shortcodes in one place | ||||||
|  |   - Handle shortcode callbacks | ||||||
|  |   - Manage shortcode attributes and defaults | ||||||
|  | 
 | ||||||
|  | #### 1.2 HVAC_Scripts_Styles Class | ||||||
|  | - **Purpose**: Manage all script and style enqueuing | ||||||
|  | - **Location**: `/includes/class-hvac-scripts-styles.php` | ||||||
|  | - **Responsibilities**: | ||||||
|  |   - Frontend script/style registration and enqueuing | ||||||
|  |   - Admin script/style registration and enqueuing | ||||||
|  |   - Script localization | ||||||
|  |   - Version management for cache busting | ||||||
|  | 
 | ||||||
|  | #### 1.3 HVAC_Route_Manager Class | ||||||
|  | - **Purpose**: Handle all URL routing and redirects | ||||||
|  | - **Location**: `/includes/class-hvac-route-manager.php` | ||||||
|  | - **Responsibilities**: | ||||||
|  |   - Legacy URL redirects | ||||||
|  |   - Parent page redirects | ||||||
|  |   - Custom rewrite rules | ||||||
|  |   - Query var registration | ||||||
|  | 
 | ||||||
|  | ### Phase 2: Consolidate Authentication and Access Control | ||||||
|  | 
 | ||||||
|  | #### 2.1 Enhance HVAC_Access_Control | ||||||
|  | - Move all authentication checks from HVAC_Community_Events | ||||||
|  | - Centralize page access rules | ||||||
|  | - Implement filter/action based access control | ||||||
|  | 
 | ||||||
|  | ### Phase 3: Refactor Main Plugin Classes | ||||||
|  | 
 | ||||||
|  | #### 3.1 HVAC_Plugin (Main Plugin Controller) | ||||||
|  | - **Keep**: | ||||||
|  |   - Plugin activation/deactivation | ||||||
|  |   - Dependency loading | ||||||
|  |   - Component initialization (single point) | ||||||
|  |   - Hook registration | ||||||
|  | - **Remove**: | ||||||
|  |   - Direct script/style enqueuing (move to HVAC_Scripts_Styles) | ||||||
|  |   - Redirect handling (move to HVAC_Route_Manager) | ||||||
|  |   - AJAX handlers (move to respective feature classes) | ||||||
|  | 
 | ||||||
|  | #### 3.2 HVAC_Community_Events (Deprecate) | ||||||
|  | - **Phase 1**: Remove all duplicate functionality | ||||||
|  | - **Phase 2**: Convert to compatibility layer | ||||||
|  | - **Phase 3**: Add deprecation notices | ||||||
|  | - **Phase 4**: Remove entirely in future version | ||||||
|  | 
 | ||||||
|  | ### Phase 4: Implement Consistent Patterns | ||||||
|  | 
 | ||||||
|  | #### 4.1 Singleton Pattern | ||||||
|  | Apply to classes that should have single instances: | ||||||
|  | - HVAC_Plugin | ||||||
|  | - HVAC_Shortcodes | ||||||
|  | - HVAC_Scripts_Styles | ||||||
|  | - HVAC_Route_Manager | ||||||
|  | - HVAC_Access_Control | ||||||
|  | 
 | ||||||
|  | #### 4.2 Interface-Based Design | ||||||
|  | Create interfaces for common patterns: | ||||||
|  | - `HVAC_Component_Interface` for initializable components | ||||||
|  | - `HVAC_Ajax_Handler_Interface` for AJAX handling classes | ||||||
|  | - `HVAC_Admin_Page_Interface` for admin page classes | ||||||
|  | 
 | ||||||
|  | ### Phase 5: Create Service Container | ||||||
|  | 
 | ||||||
|  | #### 5.1 HVAC_Container Class | ||||||
|  | - **Purpose**: Manage dependency injection | ||||||
|  | - **Features**: | ||||||
|  |   - Lazy loading of components | ||||||
|  |   - Dependency resolution | ||||||
|  |   - Service registration | ||||||
|  | 
 | ||||||
|  | ## Implementation Order | ||||||
|  | 
 | ||||||
|  | 1. **Create new classes** (non-breaking additions): | ||||||
|  |    - HVAC_Shortcodes | ||||||
|  |    - HVAC_Scripts_Styles | ||||||
|  |    - HVAC_Route_Manager | ||||||
|  | 
 | ||||||
|  | 2. **Move functionality** (careful migration): | ||||||
|  |    - Migrate shortcodes from HVAC_Community_Events to HVAC_Shortcodes | ||||||
|  |    - Migrate scripts/styles to HVAC_Scripts_Styles | ||||||
|  |    - Migrate routing logic to HVAC_Route_Manager | ||||||
|  | 
 | ||||||
|  | 3. **Update initialization**: | ||||||
|  |    - Update HVAC_Plugin to use new classes | ||||||
|  |    - Remove duplicate initializations | ||||||
|  | 
 | ||||||
|  | 4. **Deprecate legacy code**: | ||||||
|  |    - Add deprecation notices to HVAC_Community_Events methods | ||||||
|  |    - Maintain backward compatibility temporarily | ||||||
|  | 
 | ||||||
|  | 5. **Clean up**: | ||||||
|  |    - Remove deprecated code in future version | ||||||
|  |    - Update documentation | ||||||
|  |    - Update tests | ||||||
|  | 
 | ||||||
|  | ## Benefits | ||||||
|  | 
 | ||||||
|  | 1. **Clear Separation of Concerns**: Each class has a single, well-defined purpose | ||||||
|  | 2. **Easier Maintenance**: Changes to one feature won't affect others | ||||||
|  | 3. **Better Testing**: Isolated components are easier to test | ||||||
|  | 4. **Reduced Duplication**: Single source of truth for each functionality | ||||||
|  | 5. **Improved Performance**: No duplicate initializations or hook registrations | ||||||
|  | 6. **Easier Onboarding**: New developers can understand the architecture quickly | ||||||
|  | 
 | ||||||
|  | ## Backward Compatibility Strategy | ||||||
|  | 
 | ||||||
|  | 1. **Maintain existing hooks**: Keep action/filter names unchanged | ||||||
|  | 2. **Proxy methods**: Create proxy methods in deprecated classes | ||||||
|  | 3. **Gradual migration**: Move functionality piece by piece | ||||||
|  | 4. **Version checks**: Add version-based compatibility layers | ||||||
|  | 5. **Clear deprecation timeline**: Document when features will be removed | ||||||
|  | 
 | ||||||
|  | ## Success Metrics | ||||||
|  | 
 | ||||||
|  | - [ ] No duplicate component initialization | ||||||
|  | - [ ] All functionality maintained | ||||||
|  | - [ ] No breaking changes for existing users | ||||||
|  | - [ ] Improved code organization | ||||||
|  | - [ ] Reduced file size and complexity | ||||||
|  | - [ ] Better performance metrics | ||||||
|  | @ -133,26 +133,16 @@ class HVAC_Community_Events { | ||||||
| 		// Template loading for custom pages
 | 		// Template loading for custom pages
 | ||||||
| 		add_filter('template_include', array($this, 'load_custom_templates')); | 		add_filter('template_include', array($this, 'load_custom_templates')); | ||||||
| 		 | 		 | ||||||
| 		// Add authentication check for event summary page
 | 		// 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_event_summary_auth')); | ||||||
| 		 |  | ||||||
| 		// Add authentication check for email attendees page
 |  | ||||||
| 		add_action('template_redirect', array($this, 'check_email_attendees_auth')); | 		add_action('template_redirect', array($this, 'check_email_attendees_auth')); | ||||||
| 		 |  | ||||||
| 		// Add authentication check for certificate pages
 |  | ||||||
| 		add_action('template_redirect', array($this, 'check_certificate_pages_auth')); | 		add_action('template_redirect', array($this, 'check_certificate_pages_auth')); | ||||||
| 		 |  | ||||||
| 		// Add authentication check for master dashboard page
 |  | ||||||
| 		add_action('template_redirect', array($this, 'check_master_dashboard_auth')); | 		add_action('template_redirect', array($this, 'check_master_dashboard_auth')); | ||||||
| 		 |  | ||||||
| 		// Add authentication check for Google Sheets page
 |  | ||||||
| 		add_action('template_redirect', array($this, 'check_google_sheets_auth')); | 		add_action('template_redirect', array($this, 'check_google_sheets_auth')); | ||||||
| 		 |  | ||||||
| 		// Ensure registration page is always publicly accessible
 |  | ||||||
| 		add_action('template_redirect', array($this, 'ensure_registration_page_public'), 1); | 		add_action('template_redirect', array($this, 'ensure_registration_page_public'), 1); | ||||||
| 		 | 		 | ||||||
| 		// Enqueue styles and scripts
 | 		// Scripts and styles are now handled by HVAC_Scripts_Styles
 | ||||||
| 		add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts')); | 		// add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
 | ||||||
| 	} // End init_hooks
 | 	} // End init_hooks
 | ||||||
| 	 | 	 | ||||||
| 	/** | 	/** | ||||||
|  |  | ||||||
|  | @ -87,6 +87,11 @@ class HVAC_Plugin { | ||||||
|             require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-roles.php'; |             require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-roles.php'; | ||||||
|         } |         } | ||||||
|          |          | ||||||
|  |         // Core architecture includes
 | ||||||
|  |         require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-shortcodes.php'; | ||||||
|  |         require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-scripts-styles.php'; | ||||||
|  |         require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-route-manager.php'; | ||||||
|  |          | ||||||
|         // Feature includes - check if files exist before including
 |         // Feature includes - check if files exist before including
 | ||||||
|         $feature_includes = [ |         $feature_includes = [ | ||||||
|             'class-hvac-trainer-status.php', |             'class-hvac-trainer-status.php', | ||||||
|  | @ -232,10 +237,6 @@ class HVAC_Plugin { | ||||||
|         // Admin init
 |         // Admin init
 | ||||||
|         add_action('admin_init', [$this, 'admin_init']); |         add_action('admin_init', [$this, 'admin_init']); | ||||||
|          |          | ||||||
|         // Scripts and styles
 |  | ||||||
|         add_action('wp_enqueue_scripts', [$this, 'enqueue_scripts']); |  | ||||||
|         add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_scripts']); |  | ||||||
|          |  | ||||||
|         // AJAX handlers
 |         // AJAX handlers
 | ||||||
|         add_action('wp_ajax_hvac_master_dashboard_events', [$this, 'ajax_master_dashboard_events']); |         add_action('wp_ajax_hvac_master_dashboard_events', [$this, 'ajax_master_dashboard_events']); | ||||||
|         add_action('wp_ajax_nopriv_hvac_master_dashboard_events', [$this, 'ajax_master_dashboard_events']); |         add_action('wp_ajax_nopriv_hvac_master_dashboard_events', [$this, 'ajax_master_dashboard_events']); | ||||||
|  | @ -265,6 +266,11 @@ class HVAC_Plugin { | ||||||
|      * @return void |      * @return void | ||||||
|      */ |      */ | ||||||
|     public function init() { |     public function init() { | ||||||
|  |         // Initialize core architecture components
 | ||||||
|  |         HVAC_Shortcodes::instance(); | ||||||
|  |         HVAC_Scripts_Styles::instance(); | ||||||
|  |         HVAC_Route_Manager::instance(); | ||||||
|  |          | ||||||
|         // Initialize template loader
 |         // Initialize template loader
 | ||||||
|         HVAC_Template_Loader::init(); |         HVAC_Template_Loader::init(); | ||||||
|          |          | ||||||
|  | @ -274,12 +280,6 @@ class HVAC_Plugin { | ||||||
|         // Initialize other components
 |         // Initialize other components
 | ||||||
|         $this->init_components(); |         $this->init_components(); | ||||||
|          |          | ||||||
|         // Handle legacy redirects
 |  | ||||||
|         $this->handle_legacy_redirects(); |  | ||||||
|          |  | ||||||
|         // Handle parent page redirects
 |  | ||||||
|         add_action('template_redirect', [$this, 'redirect_parent_pages']); |  | ||||||
|          |  | ||||||
|         // Ensure registration page access
 |         // Ensure registration page access
 | ||||||
|         add_action('template_redirect', [$this, 'ensure_registration_access'], 5); |         add_action('template_redirect', [$this, 'ensure_registration_access'], 5); | ||||||
|     } |     } | ||||||
|  | @ -406,208 +406,7 @@ class HVAC_Plugin { | ||||||
|         $this->check_plugin_updates(); |         $this->check_plugin_updates(); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     /** |  | ||||||
|      * Enqueue frontend scripts and styles |  | ||||||
|      *  |  | ||||||
|      * @return void |  | ||||||
|      */ |  | ||||||
|     public function enqueue_scripts() { |  | ||||||
|         // Enqueue only on plugin pages
 |  | ||||||
|         if (!HVAC_Template_Loader::is_plugin_template()) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|      |      | ||||||
|         // Plugin styles
 |  | ||||||
|         wp_enqueue_style( |  | ||||||
|             'hvac-community-events', |  | ||||||
|             HVAC_PLUGIN_URL . 'assets/css/hvac-community-events.css', |  | ||||||
|             [], |  | ||||||
|             HVAC_PLUGIN_VERSION |  | ||||||
|         ); |  | ||||||
|          |  | ||||||
|         // Plugin scripts
 |  | ||||||
|         wp_enqueue_script( |  | ||||||
|             'hvac-community-events', |  | ||||||
|             HVAC_PLUGIN_URL . 'assets/js/hvac-community-events.js', |  | ||||||
|             ['jquery'], |  | ||||||
|             HVAC_PLUGIN_VERSION, |  | ||||||
|             true |  | ||||||
|         ); |  | ||||||
|          |  | ||||||
|         // Localize script
 |  | ||||||
|         wp_localize_script('hvac-community-events', 'hvac_ajax', [ |  | ||||||
|             'ajax_url' => admin_url('admin-ajax.php'), |  | ||||||
|             'nonce' => wp_create_nonce('hvac_ajax_nonce') |  | ||||||
|         ]); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     /** |  | ||||||
|      * Enqueue admin scripts and styles |  | ||||||
|      *  |  | ||||||
|      * @param string $hook Current admin page hook |  | ||||||
|      * @return void |  | ||||||
|      */ |  | ||||||
|     public function admin_enqueue_scripts($hook) { |  | ||||||
|         // Admin styles
 |  | ||||||
|         wp_enqueue_style( |  | ||||||
|             'hvac-admin', |  | ||||||
|             HVAC_PLUGIN_URL . 'assets/css/hvac-admin.css', |  | ||||||
|             [], |  | ||||||
|             HVAC_PLUGIN_VERSION |  | ||||||
|         ); |  | ||||||
|          |  | ||||||
|         // Admin scripts
 |  | ||||||
|         wp_enqueue_script( |  | ||||||
|             'hvac-admin', |  | ||||||
|             HVAC_PLUGIN_URL . 'assets/js/hvac-admin.js', |  | ||||||
|             ['jquery'], |  | ||||||
|             HVAC_PLUGIN_VERSION . '.1', // Force cache refresh
 |  | ||||||
|             true |  | ||||||
|         ); |  | ||||||
|          |  | ||||||
|         // Localize admin script
 |  | ||||||
|         wp_localize_script('hvac-admin', 'hvac_admin', [ |  | ||||||
|             'ajax_url' => admin_url('admin-ajax.php'), |  | ||||||
|             'nonce' => wp_create_nonce('hvac_admin_nonce') |  | ||||||
|         ]); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     /** |  | ||||||
|      * Handle legacy URL redirects |  | ||||||
|      *  |  | ||||||
|      * @return void |  | ||||||
|      */ |  | ||||||
|     private function handle_legacy_redirects() { |  | ||||||
|         // Hook early to catch URLs before 404
 |  | ||||||
|         add_action('init', [$this, 'register_legacy_rewrite_rules']); |  | ||||||
|         add_action('template_redirect', [$this, 'legacy_redirects'], 5); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     /** |  | ||||||
|      * Register rewrite rules for legacy URLs |  | ||||||
|      *  |  | ||||||
|      * @return void |  | ||||||
|      */ |  | ||||||
|     public function register_legacy_rewrite_rules() { |  | ||||||
|         // Legacy URL to new URL mapping
 |  | ||||||
|         $legacy_redirects = $this->get_legacy_redirects(); |  | ||||||
|          |  | ||||||
|         // Add rewrite rules for each legacy URL
 |  | ||||||
|         foreach ($legacy_redirects as $legacy => $new) { |  | ||||||
|             add_rewrite_rule( |  | ||||||
|                 '^' . $legacy . '/?$', |  | ||||||
|                 'index.php?hvac_legacy_redirect=' . $legacy, |  | ||||||
|                 'top' |  | ||||||
|             ); |  | ||||||
|         } |  | ||||||
|          |  | ||||||
|         // Register the query var
 |  | ||||||
|         add_filter('query_vars', function($vars) { |  | ||||||
|             $vars[] = 'hvac_legacy_redirect'; |  | ||||||
|             return $vars; |  | ||||||
|         }); |  | ||||||
|          |  | ||||||
|         // Handle the redirect
 |  | ||||||
|         add_action('parse_request', [$this, 'handle_legacy_redirect_request']); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     /** |  | ||||||
|      * Get legacy redirect mappings |  | ||||||
|      *  |  | ||||||
|      * @return array |  | ||||||
|      */ |  | ||||||
|     private function get_legacy_redirects() { |  | ||||||
|         return [ |  | ||||||
|             'community-login' => 'training-login', |  | ||||||
|             'hvac-dashboard' => 'trainer/dashboard', |  | ||||||
|             'master-dashboard' => 'master-trainer/dashboard', |  | ||||||
|             'manage-event' => 'trainer/event/manage', |  | ||||||
|             'trainer-profile' => 'trainer/my-profile', |  | ||||||
|             'event-summary' => 'trainer/event/summary', |  | ||||||
|             'email-attendees' => 'trainer/email-attendees', |  | ||||||
|             'certificate-reports' => 'trainer/certificate-reports', |  | ||||||
|             'generate-certificates' => 'trainer/generate-certificates', |  | ||||||
|             'certificate-fix' => 'master-trainer/certificate-fix', |  | ||||||
|             'hvac-documentation' => 'trainer/documentation', |  | ||||||
|             'attendee-profile' => 'trainer/attendee-profile', |  | ||||||
|             'google-sheets' => 'master-trainer/google-sheets', |  | ||||||
|             'communication-templates' => 'trainer/communication-templates', |  | ||||||
|             'communication-schedules' => 'trainer/communication-schedules', |  | ||||||
|             'trainer-registration' => 'trainer/registration', |  | ||||||
|         ]; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     /** |  | ||||||
|      * Handle legacy redirect requests |  | ||||||
|      *  |  | ||||||
|      * @param WP $wp WordPress environment instance |  | ||||||
|      * @return void |  | ||||||
|      */ |  | ||||||
|     public function handle_legacy_redirect_request($wp) { |  | ||||||
|         if (!isset($wp->query_vars['hvac_legacy_redirect'])) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|          |  | ||||||
|         $legacy_slug = $wp->query_vars['hvac_legacy_redirect']; |  | ||||||
|         $legacy_redirects = $this->get_legacy_redirects(); |  | ||||||
|          |  | ||||||
|         if (isset($legacy_redirects[$legacy_slug])) { |  | ||||||
|             $new_url = home_url('/' . $legacy_redirects[$legacy_slug] . '/'); |  | ||||||
|              |  | ||||||
|             // Preserve query parameters
 |  | ||||||
|             if (!empty($_SERVER['QUERY_STRING'])) { |  | ||||||
|                 $new_url .= '?' . $_SERVER['QUERY_STRING']; |  | ||||||
|             } |  | ||||||
|              |  | ||||||
|             wp_redirect($new_url, 301); |  | ||||||
|             exit; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     /** |  | ||||||
|      * Process legacy redirects (fallback for existing pages) |  | ||||||
|      *  |  | ||||||
|      * @return void |  | ||||||
|      */ |  | ||||||
|     public function legacy_redirects() { |  | ||||||
|         // Get current URL path
 |  | ||||||
|         $current_path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); |  | ||||||
|          |  | ||||||
|         // Get legacy redirects
 |  | ||||||
|         $legacy_redirects = $this->get_legacy_redirects(); |  | ||||||
|          |  | ||||||
|         // Check if current path matches a legacy URL
 |  | ||||||
|         if (isset($legacy_redirects[$current_path])) { |  | ||||||
|             $new_url = home_url('/' . $legacy_redirects[$current_path] . '/'); |  | ||||||
|              |  | ||||||
|             // Preserve query parameters
 |  | ||||||
|             if (!empty($_SERVER['QUERY_STRING'])) { |  | ||||||
|                 $new_url .= '?' . $_SERVER['QUERY_STRING']; |  | ||||||
|             } |  | ||||||
|              |  | ||||||
|             // Perform 301 redirect
 |  | ||||||
|             wp_redirect($new_url, 301); |  | ||||||
|             exit; |  | ||||||
|         } |  | ||||||
|          |  | ||||||
|         // Also check if this is a page that exists with a legacy slug
 |  | ||||||
|         global $post; |  | ||||||
|         if (is_page() && $post) { |  | ||||||
|             $current_slug = $post->post_name; |  | ||||||
|              |  | ||||||
|             if (isset($legacy_redirects[$current_slug])) { |  | ||||||
|                 $new_url = home_url('/' . $legacy_redirects[$current_slug] . '/'); |  | ||||||
|                  |  | ||||||
|                 // Preserve query parameters
 |  | ||||||
|                 if (!empty($_SERVER['QUERY_STRING'])) { |  | ||||||
|                     $new_url .= '?' . $_SERVER['QUERY_STRING']; |  | ||||||
|                 } |  | ||||||
|                  |  | ||||||
|                 wp_redirect($new_url, 301); |  | ||||||
|                 exit; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |      | ||||||
|     /** |     /** | ||||||
|      * Check for plugin updates |      * Check for plugin updates | ||||||
|  | @ -638,28 +437,6 @@ class HVAC_Plugin { | ||||||
|         // Version-specific upgrades can be added here
 |         // Version-specific upgrades can be added here
 | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     /** |  | ||||||
|      * Redirect parent pages to their dashboards |  | ||||||
|      *  |  | ||||||
|      * @return void |  | ||||||
|      */ |  | ||||||
|     public function redirect_parent_pages() { |  | ||||||
|         // Get the current URL path
 |  | ||||||
|         $current_path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); |  | ||||||
|          |  | ||||||
|         // Check if we're on the trainer parent page (not a child page)
 |  | ||||||
|         if ($current_path === 'trainer' || $current_path === 'trainer/') { |  | ||||||
|             // Redirect to the dashboard
 |  | ||||||
|             wp_redirect(home_url('/trainer/dashboard/'), 301); |  | ||||||
|             exit; |  | ||||||
|         } |  | ||||||
|          |  | ||||||
|         // Also redirect master-trainer to master-trainer/dashboard
 |  | ||||||
|         if ($current_path === 'master-trainer' || $current_path === 'master-trainer/') { |  | ||||||
|             wp_redirect(home_url('/master-trainer/dashboard/'), 301); |  | ||||||
|             exit; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |      | ||||||
|     /** |     /** | ||||||
|      * Ensure trainer registration page is publicly accessible |      * Ensure trainer registration page is publicly accessible | ||||||
|  |  | ||||||
							
								
								
									
										341
									
								
								includes/class-hvac-route-manager.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										341
									
								
								includes/class-hvac-route-manager.php
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,341 @@ | ||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * HVAC Route Manager | ||||||
|  |  * | ||||||
|  |  * Centralized management of URL routing, redirects, and rewrite rules | ||||||
|  |  * | ||||||
|  |  * @package HVAC_Community_Events | ||||||
|  |  * @since 2.0.0 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | if (!defined('ABSPATH')) { | ||||||
|  |     exit; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * HVAC_Route_Manager class | ||||||
|  |  */ | ||||||
|  | class HVAC_Route_Manager { | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Instance | ||||||
|  |      *  | ||||||
|  |      * @var HVAC_Route_Manager | ||||||
|  |      */ | ||||||
|  |     private static $instance = null; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Legacy redirect mappings | ||||||
|  |      *  | ||||||
|  |      * @var array | ||||||
|  |      */ | ||||||
|  |     private $legacy_redirects = array(); | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Parent page redirects | ||||||
|  |      *  | ||||||
|  |      * @var array | ||||||
|  |      */ | ||||||
|  |     private $parent_redirects = array(); | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Get instance | ||||||
|  |      *  | ||||||
|  |      * @return HVAC_Route_Manager | ||||||
|  |      */ | ||||||
|  |     public static function instance() { | ||||||
|  |         if (null === self::$instance) { | ||||||
|  |             self::$instance = new self(); | ||||||
|  |         } | ||||||
|  |         return self::$instance; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Constructor | ||||||
|  |      */ | ||||||
|  |     private function __construct() { | ||||||
|  |         $this->define_redirects(); | ||||||
|  |         $this->init_hooks(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Define redirect mappings | ||||||
|  |      *  | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     private function define_redirects() { | ||||||
|  |         // Legacy URL to new URL mappings
 | ||||||
|  |         $this->legacy_redirects = array( | ||||||
|  |             'community-login' => 'training-login', | ||||||
|  |             'hvac-dashboard' => 'trainer/dashboard', | ||||||
|  |             'master-dashboard' => 'master-trainer/dashboard', | ||||||
|  |             'manage-event' => 'trainer/event/manage', | ||||||
|  |             'trainer-profile' => 'trainer/my-profile', | ||||||
|  |             'event-summary' => 'trainer/event/summary', | ||||||
|  |             'email-attendees' => 'trainer/email-attendees', | ||||||
|  |             'certificate-reports' => 'trainer/certificate-reports', | ||||||
|  |             'generate-certificates' => 'trainer/generate-certificates', | ||||||
|  |             'certificate-fix' => 'master-trainer/certificate-fix', | ||||||
|  |             'hvac-documentation' => 'trainer/documentation', | ||||||
|  |             'attendee-profile' => 'trainer/attendee-profile', | ||||||
|  |             'google-sheets' => 'master-trainer/google-sheets', | ||||||
|  |             'communication-templates' => 'trainer/communication-templates', | ||||||
|  |             'communication-schedules' => 'trainer/communication-schedules', | ||||||
|  |             'trainer-registration' => 'trainer/registration', | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         // Parent pages that redirect to dashboards
 | ||||||
|  |         $this->parent_redirects = array( | ||||||
|  |             'trainer' => 'trainer/dashboard', | ||||||
|  |             'master-trainer' => 'master-trainer/dashboard', | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         // Allow filtering
 | ||||||
|  |         $this->legacy_redirects = apply_filters('hvac_legacy_redirects', $this->legacy_redirects); | ||||||
|  |         $this->parent_redirects = apply_filters('hvac_parent_redirects', $this->parent_redirects); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Initialize hooks | ||||||
|  |      *  | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     private function init_hooks() { | ||||||
|  |         // Register rewrite rules
 | ||||||
|  |         add_action('init', array($this, 'register_rewrite_rules'), 5); | ||||||
|  |          | ||||||
|  |         // Handle redirects
 | ||||||
|  |         add_action('template_redirect', array($this, 'handle_redirects'), 5); | ||||||
|  |          | ||||||
|  |         // Register query vars
 | ||||||
|  |         add_filter('query_vars', array($this, 'register_query_vars')); | ||||||
|  |          | ||||||
|  |         // Handle legacy redirect requests
 | ||||||
|  |         add_action('parse_request', array($this, 'handle_legacy_redirect_request')); | ||||||
|  |          | ||||||
|  |         // Flush rewrite rules on activation
 | ||||||
|  |         add_action('hvac_plugin_activated', array($this, 'flush_rewrite_rules')); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Register rewrite rules | ||||||
|  |      *  | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public function register_rewrite_rules() { | ||||||
|  |         // Add rewrite rules for legacy URLs
 | ||||||
|  |         foreach ($this->legacy_redirects as $legacy => $new) { | ||||||
|  |             add_rewrite_rule( | ||||||
|  |                 '^' . $legacy . '/?$', | ||||||
|  |                 'index.php?hvac_legacy_redirect=' . $legacy, | ||||||
|  |                 'top' | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Add rewrite rules for hierarchical URLs
 | ||||||
|  |         $hierarchical_rules = array( | ||||||
|  |             // Trainer pages
 | ||||||
|  |             'trainer/?$' => 'index.php?hvac_route=trainer', | ||||||
|  |             'trainer/([^/]+)/?$' => 'index.php?hvac_route=trainer&hvac_page=$matches[1]', | ||||||
|  |             'trainer/([^/]+)/([^/]+)/?$' => 'index.php?hvac_route=trainer&hvac_page=$matches[1]&hvac_subpage=$matches[2]', | ||||||
|  |              | ||||||
|  |             // Master trainer pages
 | ||||||
|  |             'master-trainer/?$' => 'index.php?hvac_route=master-trainer', | ||||||
|  |             'master-trainer/([^/]+)/?$' => 'index.php?hvac_route=master-trainer&hvac_page=$matches[1]', | ||||||
|  |             'master-trainer/([^/]+)/([^/]+)/?$' => 'index.php?hvac_route=master-trainer&hvac_page=$matches[1]&hvac_subpage=$matches[2]', | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         foreach ($hierarchical_rules as $regex => $redirect) { | ||||||
|  |             add_rewrite_rule($regex, $redirect, 'top'); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Log registration
 | ||||||
|  |         HVAC_Logger::info('Registered ' . count($this->legacy_redirects) . ' legacy redirects and ' . count($hierarchical_rules) . ' hierarchical rules', 'Routes'); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Register query vars | ||||||
|  |      *  | ||||||
|  |      * @param array $vars Query vars | ||||||
|  |      * @return array | ||||||
|  |      */ | ||||||
|  |     public function register_query_vars($vars) { | ||||||
|  |         $vars[] = 'hvac_legacy_redirect'; | ||||||
|  |         $vars[] = 'hvac_route'; | ||||||
|  |         $vars[] = 'hvac_page'; | ||||||
|  |         $vars[] = 'hvac_subpage'; | ||||||
|  |          | ||||||
|  |         return $vars; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Handle legacy redirect requests | ||||||
|  |      *  | ||||||
|  |      * @param WP $wp WordPress environment instance | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public function handle_legacy_redirect_request($wp) { | ||||||
|  |         if (!isset($wp->query_vars['hvac_legacy_redirect'])) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $legacy_slug = $wp->query_vars['hvac_legacy_redirect']; | ||||||
|  |          | ||||||
|  |         if (isset($this->legacy_redirects[$legacy_slug])) { | ||||||
|  |             $new_url = home_url('/' . $this->legacy_redirects[$legacy_slug] . '/'); | ||||||
|  |              | ||||||
|  |             // Preserve query parameters
 | ||||||
|  |             if (!empty($_SERVER['QUERY_STRING'])) { | ||||||
|  |                 $new_url .= '?' . $_SERVER['QUERY_STRING']; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             // Log redirect
 | ||||||
|  |             HVAC_Logger::info("Redirecting legacy URL: {$legacy_slug} to {$new_url}", 'Routes'); | ||||||
|  |              | ||||||
|  |             wp_redirect($new_url, 301); | ||||||
|  |             exit; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Handle redirects | ||||||
|  |      *  | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public function handle_redirects() { | ||||||
|  |         // Get current URL path
 | ||||||
|  |         $current_path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); | ||||||
|  |          | ||||||
|  |         // Handle legacy redirects
 | ||||||
|  |         if (isset($this->legacy_redirects[$current_path])) { | ||||||
|  |             $this->perform_redirect($this->legacy_redirects[$current_path]); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Handle parent page redirects
 | ||||||
|  |         if (isset($this->parent_redirects[$current_path])) { | ||||||
|  |             $this->perform_redirect($this->parent_redirects[$current_path]); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Also check if this is a page that exists with a legacy slug
 | ||||||
|  |         global $post; | ||||||
|  |         if (is_page() && $post) { | ||||||
|  |             $current_slug = $post->post_name; | ||||||
|  |              | ||||||
|  |             if (isset($this->legacy_redirects[$current_slug])) { | ||||||
|  |                 $this->perform_redirect($this->legacy_redirects[$current_slug]); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Perform redirect | ||||||
|  |      *  | ||||||
|  |      * @param string $target Target path | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     private function perform_redirect($target) { | ||||||
|  |         $new_url = home_url('/' . $target . '/'); | ||||||
|  |          | ||||||
|  |         // Preserve query parameters
 | ||||||
|  |         if (!empty($_SERVER['QUERY_STRING'])) { | ||||||
|  |             $new_url .= '?' . $_SERVER['QUERY_STRING']; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Log redirect
 | ||||||
|  |         HVAC_Logger::info("Performing redirect to: {$new_url}", 'Routes'); | ||||||
|  |          | ||||||
|  |         wp_redirect($new_url, 301); | ||||||
|  |         exit; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Get legacy redirects | ||||||
|  |      *  | ||||||
|  |      * @return array | ||||||
|  |      */ | ||||||
|  |     public function get_legacy_redirects() { | ||||||
|  |         return $this->legacy_redirects; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Get parent redirects | ||||||
|  |      *  | ||||||
|  |      * @return array | ||||||
|  |      */ | ||||||
|  |     public function get_parent_redirects() { | ||||||
|  |         return $this->parent_redirects; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Add custom redirect | ||||||
|  |      *  | ||||||
|  |      * @param string $from From path | ||||||
|  |      * @param string $to To path | ||||||
|  |      * @param string $type Type of redirect (legacy or parent) | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public function add_redirect($from, $to, $type = 'legacy') { | ||||||
|  |         if ($type === 'legacy') { | ||||||
|  |             $this->legacy_redirects[$from] = $to; | ||||||
|  |         } elseif ($type === 'parent') { | ||||||
|  |             $this->parent_redirects[$from] = $to; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Re-register rules if already initialized
 | ||||||
|  |         if (did_action('init')) { | ||||||
|  |             $this->register_rewrite_rules(); | ||||||
|  |             flush_rewrite_rules(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Remove redirect | ||||||
|  |      *  | ||||||
|  |      * @param string $from From path | ||||||
|  |      * @param string $type Type of redirect (legacy or parent) | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public function remove_redirect($from, $type = 'legacy') { | ||||||
|  |         if ($type === 'legacy' && isset($this->legacy_redirects[$from])) { | ||||||
|  |             unset($this->legacy_redirects[$from]); | ||||||
|  |         } elseif ($type === 'parent' && isset($this->parent_redirects[$from])) { | ||||||
|  |             unset($this->parent_redirects[$from]); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Re-register rules if already initialized
 | ||||||
|  |         if (did_action('init')) { | ||||||
|  |             $this->register_rewrite_rules(); | ||||||
|  |             flush_rewrite_rules(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Flush rewrite rules | ||||||
|  |      *  | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public function flush_rewrite_rules() { | ||||||
|  |         flush_rewrite_rules(); | ||||||
|  |         HVAC_Logger::info('Flushed rewrite rules', 'Routes'); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Check if URL needs redirect | ||||||
|  |      *  | ||||||
|  |      * @param string $url URL to check | ||||||
|  |      * @return string|false Redirect target or false | ||||||
|  |      */ | ||||||
|  |     public function needs_redirect($url) { | ||||||
|  |         $path = trim(parse_url($url, PHP_URL_PATH), '/'); | ||||||
|  |          | ||||||
|  |         if (isset($this->legacy_redirects[$path])) { | ||||||
|  |             return $this->legacy_redirects[$path]; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         if (isset($this->parent_redirects[$path])) { | ||||||
|  |             return $this->parent_redirects[$path]; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										363
									
								
								includes/class-hvac-scripts-styles.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										363
									
								
								includes/class-hvac-scripts-styles.php
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,363 @@ | ||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * HVAC Scripts and Styles Manager | ||||||
|  |  * | ||||||
|  |  * Centralized management of all plugin scripts and styles | ||||||
|  |  * | ||||||
|  |  * @package HVAC_Community_Events | ||||||
|  |  * @since 2.0.0 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | if (!defined('ABSPATH')) { | ||||||
|  |     exit; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * HVAC_Scripts_Styles class | ||||||
|  |  */ | ||||||
|  | class HVAC_Scripts_Styles { | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Instance | ||||||
|  |      *  | ||||||
|  |      * @var HVAC_Scripts_Styles | ||||||
|  |      */ | ||||||
|  |     private static $instance = null; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Script version for cache busting | ||||||
|  |      *  | ||||||
|  |      * @var string | ||||||
|  |      */ | ||||||
|  |     private $version; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Get instance | ||||||
|  |      *  | ||||||
|  |      * @return HVAC_Scripts_Styles | ||||||
|  |      */ | ||||||
|  |     public static function instance() { | ||||||
|  |         if (null === self::$instance) { | ||||||
|  |             self::$instance = new self(); | ||||||
|  |         } | ||||||
|  |         return self::$instance; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Constructor | ||||||
|  |      */ | ||||||
|  |     private function __construct() { | ||||||
|  |         $this->version = HVAC_PLUGIN_VERSION; | ||||||
|  |         $this->init_hooks(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Initialize hooks | ||||||
|  |      *  | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     private function init_hooks() { | ||||||
|  |         // Frontend scripts and styles
 | ||||||
|  |         add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_assets')); | ||||||
|  |          | ||||||
|  |         // Admin scripts and styles
 | ||||||
|  |         add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets')); | ||||||
|  |          | ||||||
|  |         // Login page scripts and styles
 | ||||||
|  |         add_action('login_enqueue_scripts', array($this, 'enqueue_login_assets')); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Enqueue frontend assets | ||||||
|  |      *  | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public function enqueue_frontend_assets() { | ||||||
|  |         // Only enqueue on plugin pages
 | ||||||
|  |         if (!$this->is_plugin_page()) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Main plugin styles
 | ||||||
|  |         wp_enqueue_style( | ||||||
|  |             'hvac-community-events', | ||||||
|  |             HVAC_PLUGIN_URL . 'assets/css/hvac-community-events.css', | ||||||
|  |             array(), | ||||||
|  |             $this->version | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         // Dashboard styles
 | ||||||
|  |         if ($this->is_dashboard_page()) { | ||||||
|  |             wp_enqueue_style( | ||||||
|  |                 'hvac-dashboard', | ||||||
|  |                 HVAC_PLUGIN_URL . 'assets/css/hvac-dashboard.css', | ||||||
|  |                 array('hvac-community-events'), | ||||||
|  |                 $this->version | ||||||
|  |             ); | ||||||
|  |              | ||||||
|  |             wp_enqueue_style( | ||||||
|  |                 'hvac-dashboard-enhanced', | ||||||
|  |                 HVAC_PLUGIN_URL . 'assets/css/hvac-dashboard-enhanced.css', | ||||||
|  |                 array('hvac-dashboard'), | ||||||
|  |                 $this->version | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Registration styles
 | ||||||
|  |         if ($this->is_registration_page()) { | ||||||
|  |             wp_enqueue_style( | ||||||
|  |                 'hvac-registration', | ||||||
|  |                 HVAC_PLUGIN_URL . 'assets/css/hvac-registration.css', | ||||||
|  |                 array('hvac-community-events'), | ||||||
|  |                 $this->version | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Communication templates styles
 | ||||||
|  |         if ($this->is_communication_page()) { | ||||||
|  |             wp_enqueue_style( | ||||||
|  |                 'communication-templates', | ||||||
|  |                 HVAC_PLUGIN_URL . 'assets/css/communication-templates.css', | ||||||
|  |                 array('hvac-community-events'), | ||||||
|  |                 $this->version | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Main plugin scripts
 | ||||||
|  |         wp_enqueue_script( | ||||||
|  |             'hvac-community-events', | ||||||
|  |             HVAC_PLUGIN_URL . 'assets/js/hvac-community-events.js', | ||||||
|  |             array('jquery'), | ||||||
|  |             $this->version, | ||||||
|  |             true | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         // Dashboard scripts
 | ||||||
|  |         if ($this->is_dashboard_page()) { | ||||||
|  |             wp_enqueue_script( | ||||||
|  |                 'hvac-dashboard', | ||||||
|  |                 HVAC_PLUGIN_URL . 'assets/js/hvac-dashboard.js', | ||||||
|  |                 array('jquery', 'hvac-community-events'), | ||||||
|  |                 $this->version, | ||||||
|  |                 true | ||||||
|  |             ); | ||||||
|  |              | ||||||
|  |             wp_enqueue_script( | ||||||
|  |                 'hvac-dashboard-enhanced', | ||||||
|  |                 HVAC_PLUGIN_URL . 'assets/js/hvac-dashboard-enhanced.js', | ||||||
|  |                 array('hvac-dashboard'), | ||||||
|  |                 $this->version, | ||||||
|  |                 true | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Registration scripts
 | ||||||
|  |         if ($this->is_registration_page()) { | ||||||
|  |             wp_enqueue_script( | ||||||
|  |                 'hvac-registration', | ||||||
|  |                 HVAC_PLUGIN_URL . 'assets/js/hvac-registration.js', | ||||||
|  |                 array('jquery', 'hvac-community-events'), | ||||||
|  |                 $this->version, | ||||||
|  |                 true | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Help system scripts
 | ||||||
|  |         wp_enqueue_script( | ||||||
|  |             'hvac-help-system', | ||||||
|  |             HVAC_PLUGIN_URL . 'assets/js/hvac-help-system.js', | ||||||
|  |             array('jquery'), | ||||||
|  |             $this->version, | ||||||
|  |             true | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         // Localize main script
 | ||||||
|  |         wp_localize_script('hvac-community-events', 'hvac_ajax', array( | ||||||
|  |             'ajax_url' => admin_url('admin-ajax.php'), | ||||||
|  |             'nonce' => wp_create_nonce('hvac_ajax_nonce'), | ||||||
|  |             'is_logged_in' => is_user_logged_in(), | ||||||
|  |             'plugin_url' => HVAC_PLUGIN_URL, | ||||||
|  |         )); | ||||||
|  |          | ||||||
|  |         // Localize dashboard script
 | ||||||
|  |         if ($this->is_dashboard_page()) { | ||||||
|  |             wp_localize_script('hvac-dashboard', 'hvac_dashboard', array( | ||||||
|  |                 'ajax_url' => admin_url('admin-ajax.php'), | ||||||
|  |                 'nonce' => wp_create_nonce('hvac_dashboard_nonce'), | ||||||
|  |                 'strings' => array( | ||||||
|  |                     'loading' => __('Loading...', 'hvac-community-events'), | ||||||
|  |                     'error' => __('An error occurred. Please try again.', 'hvac-community-events'), | ||||||
|  |                 ), | ||||||
|  |             )); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Enqueue admin assets | ||||||
|  |      *  | ||||||
|  |      * @param string $hook Current admin page hook | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public function enqueue_admin_assets($hook) { | ||||||
|  |         // Global admin styles
 | ||||||
|  |         wp_enqueue_style( | ||||||
|  |             'hvac-admin', | ||||||
|  |             HVAC_PLUGIN_URL . 'assets/css/hvac-admin.css', | ||||||
|  |             array(), | ||||||
|  |             $this->version | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         // Global admin scripts
 | ||||||
|  |         wp_enqueue_script( | ||||||
|  |             'hvac-admin', | ||||||
|  |             HVAC_PLUGIN_URL . 'assets/js/hvac-admin.js', | ||||||
|  |             array('jquery'), | ||||||
|  |             $this->version . '.2', // Force cache refresh for jQuery fix
 | ||||||
|  |             true | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         // Localize admin script
 | ||||||
|  |         wp_localize_script('hvac-admin', 'hvac_admin', array( | ||||||
|  |             'ajax_url' => admin_url('admin-ajax.php'), | ||||||
|  |             'nonce' => wp_create_nonce('hvac_admin_nonce'), | ||||||
|  |         )); | ||||||
|  |          | ||||||
|  |         // Plugin-specific admin pages
 | ||||||
|  |         if (strpos($hook, 'hvac-community-events') !== false) { | ||||||
|  |             // Add any additional plugin-specific admin assets here
 | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Certificate admin scripts
 | ||||||
|  |         if (strpos($hook, 'certificate') !== false) { | ||||||
|  |             wp_enqueue_script( | ||||||
|  |                 'hvac-certificate-admin', | ||||||
|  |                 HVAC_PLUGIN_URL . 'assets/js/hvac-certificate-admin.js', | ||||||
|  |                 array('jquery'), | ||||||
|  |                 $this->version, | ||||||
|  |                 true | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Enqueue login page assets | ||||||
|  |      *  | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public function enqueue_login_assets() { | ||||||
|  |         // Check if we're on the custom login page
 | ||||||
|  |         if (!$this->is_custom_login_page()) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         wp_enqueue_style( | ||||||
|  |             'hvac-login', | ||||||
|  |             HVAC_PLUGIN_URL . 'assets/css/hvac-login.css', | ||||||
|  |             array(), | ||||||
|  |             $this->version | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         wp_enqueue_script( | ||||||
|  |             'hvac-login', | ||||||
|  |             HVAC_PLUGIN_URL . 'assets/js/hvac-login.js', | ||||||
|  |             array('jquery'), | ||||||
|  |             $this->version, | ||||||
|  |             true | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Check if current page is a plugin page | ||||||
|  |      *  | ||||||
|  |      * @return bool | ||||||
|  |      */ | ||||||
|  |     private function is_plugin_page() { | ||||||
|  |         // Check using template loader if available
 | ||||||
|  |         if (class_exists('HVAC_Template_Loader')) { | ||||||
|  |             return HVAC_Template_Loader::is_plugin_template(); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Fallback: check URL path
 | ||||||
|  |         $current_path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); | ||||||
|  |         $plugin_paths = array( | ||||||
|  |             'trainer', | ||||||
|  |             'master-trainer', | ||||||
|  |             'training-login', | ||||||
|  |             'hvac-dashboard', | ||||||
|  |             'manage-event', | ||||||
|  |             'event-summary', | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         foreach ($plugin_paths as $path) { | ||||||
|  |             if (strpos($current_path, $path) !== false) { | ||||||
|  |                 return true; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Check if current page is a dashboard page | ||||||
|  |      *  | ||||||
|  |      * @return bool | ||||||
|  |      */ | ||||||
|  |     private function is_dashboard_page() { | ||||||
|  |         return is_page('trainer-dashboard') ||  | ||||||
|  |                is_page('master-dashboard') || | ||||||
|  |                is_page('hvac-dashboard') || | ||||||
|  |                is_page('trainer/dashboard') || | ||||||
|  |                is_page('master-trainer/dashboard'); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Check if current page is registration page | ||||||
|  |      *  | ||||||
|  |      * @return bool | ||||||
|  |      */ | ||||||
|  |     private function is_registration_page() { | ||||||
|  |         return is_page('trainer-registration') || | ||||||
|  |                is_page('trainer/registration'); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Check if current page is communication page | ||||||
|  |      *  | ||||||
|  |      * @return bool | ||||||
|  |      */ | ||||||
|  |     private function is_communication_page() { | ||||||
|  |         return is_page('communication-templates') || | ||||||
|  |                is_page('trainer/communication-templates') || | ||||||
|  |                is_page('communication-schedules') || | ||||||
|  |                is_page('trainer/communication-schedules'); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Check if current page is custom login page | ||||||
|  |      *  | ||||||
|  |      * @return bool | ||||||
|  |      */ | ||||||
|  |     private function is_custom_login_page() { | ||||||
|  |         return is_page('training-login') || | ||||||
|  |                is_page('community-login') || | ||||||
|  |                is_page('trainer/login'); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Get script version with cache busting | ||||||
|  |      *  | ||||||
|  |      * @param string $file File path | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function get_asset_version($file = '') { | ||||||
|  |         // In development, use file modification time
 | ||||||
|  |         if (defined('WP_DEBUG') && WP_DEBUG && $file) { | ||||||
|  |             $file_path = HVAC_PLUGIN_DIR . $file; | ||||||
|  |             if (file_exists($file_path)) { | ||||||
|  |                 return filemtime($file_path); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return $this->version; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										391
									
								
								includes/class-hvac-shortcodes.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										391
									
								
								includes/class-hvac-shortcodes.php
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,391 @@ | ||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * HVAC Shortcodes Manager | ||||||
|  |  * | ||||||
|  |  * Centralized management of all plugin shortcodes | ||||||
|  |  * | ||||||
|  |  * @package HVAC_Community_Events | ||||||
|  |  * @since 2.0.0 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | if (!defined('ABSPATH')) { | ||||||
|  |     exit; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * HVAC_Shortcodes class | ||||||
|  |  */ | ||||||
|  | class HVAC_Shortcodes { | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Instance | ||||||
|  |      *  | ||||||
|  |      * @var HVAC_Shortcodes | ||||||
|  |      */ | ||||||
|  |     private static $instance = null; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Registered shortcodes | ||||||
|  |      *  | ||||||
|  |      * @var array | ||||||
|  |      */ | ||||||
|  |     private $shortcodes = array(); | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Get instance | ||||||
|  |      *  | ||||||
|  |      * @return HVAC_Shortcodes | ||||||
|  |      */ | ||||||
|  |     public static function instance() { | ||||||
|  |         if (null === self::$instance) { | ||||||
|  |             self::$instance = new self(); | ||||||
|  |         } | ||||||
|  |         return self::$instance; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Constructor | ||||||
|  |      */ | ||||||
|  |     private function __construct() { | ||||||
|  |         $this->define_shortcodes(); | ||||||
|  |         $this->register_shortcodes(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Define all plugin shortcodes | ||||||
|  |      *  | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     private function define_shortcodes() { | ||||||
|  |         $this->shortcodes = array( | ||||||
|  |             // Dashboard shortcodes
 | ||||||
|  |             'hvac_dashboard' => array( | ||||||
|  |                 'callback' => array($this, 'render_dashboard'), | ||||||
|  |                 'description' => 'Trainer dashboard' | ||||||
|  |             ), | ||||||
|  |             'hvac_master_dashboard' => array( | ||||||
|  |                 'callback' => array($this, 'render_master_dashboard'), | ||||||
|  |                 'description' => 'Master trainer dashboard' | ||||||
|  |             ), | ||||||
|  |              | ||||||
|  |             // Event management shortcodes
 | ||||||
|  |             'hvac_manage_event' => array( | ||||||
|  |                 'callback' => array($this, 'render_manage_event'), | ||||||
|  |                 'description' => 'Event management form' | ||||||
|  |             ), | ||||||
|  |             'hvac_event_summary' => array( | ||||||
|  |                 'callback' => array($this, 'render_event_summary'), | ||||||
|  |                 'description' => 'Event summary page' | ||||||
|  |             ), | ||||||
|  |              | ||||||
|  |             // Authentication shortcodes
 | ||||||
|  |             'hvac_community_login' => array( | ||||||
|  |                 'callback' => array($this, 'render_login'), | ||||||
|  |                 'description' => 'Community login form' | ||||||
|  |             ), | ||||||
|  |             'hvac_trainer_registration' => array( | ||||||
|  |                 'callback' => array($this, 'render_registration'), | ||||||
|  |                 'description' => 'Trainer registration form' | ||||||
|  |             ), | ||||||
|  |              | ||||||
|  |             // Profile shortcodes
 | ||||||
|  |             'hvac_trainer_profile' => array( | ||||||
|  |                 'callback' => array($this, 'render_trainer_profile'), | ||||||
|  |                 'description' => 'Trainer profile page' | ||||||
|  |             ), | ||||||
|  |              | ||||||
|  |             // Certificate shortcodes
 | ||||||
|  |             'hvac_certificate_reports' => array( | ||||||
|  |                 'callback' => array($this, 'render_certificate_reports'), | ||||||
|  |                 'description' => 'Certificate reports page' | ||||||
|  |             ), | ||||||
|  |             'hvac_generate_certificates' => array( | ||||||
|  |                 'callback' => array($this, 'render_generate_certificates'), | ||||||
|  |                 'description' => 'Certificate generation page' | ||||||
|  |             ), | ||||||
|  |              | ||||||
|  |             // Communication shortcodes
 | ||||||
|  |             'hvac_email_attendees' => array( | ||||||
|  |                 'callback' => array($this, 'render_email_attendees'), | ||||||
|  |                 'description' => 'Email attendees interface' | ||||||
|  |             ), | ||||||
|  |             'hvac_communication_templates' => array( | ||||||
|  |                 'callback' => array($this, 'render_communication_templates'), | ||||||
|  |                 'description' => 'Communication templates management' | ||||||
|  |             ), | ||||||
|  |             'hvac_communication_schedules' => array( | ||||||
|  |                 'callback' => array($this, 'render_communication_schedules'), | ||||||
|  |                 'description' => 'Communication schedules management' | ||||||
|  |             ), | ||||||
|  |              | ||||||
|  |             // Admin shortcodes
 | ||||||
|  |             'hvac_google_sheets' => array( | ||||||
|  |                 'callback' => array($this, 'render_google_sheets_admin'), | ||||||
|  |                 'description' => 'Google Sheets integration admin' | ||||||
|  |             ), | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         // Allow filtering of shortcode definitions
 | ||||||
|  |         $this->shortcodes = apply_filters('hvac_shortcode_definitions', $this->shortcodes); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Register all shortcodes | ||||||
|  |      *  | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     private function register_shortcodes() { | ||||||
|  |         foreach ($this->shortcodes as $tag => $config) { | ||||||
|  |             add_shortcode($tag, $config['callback']); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Log registration
 | ||||||
|  |         HVAC_Logger::info('Registered ' . count($this->shortcodes) . ' shortcodes', 'Shortcodes'); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Get registered shortcodes | ||||||
|  |      *  | ||||||
|  |      * @return array | ||||||
|  |      */ | ||||||
|  |     public function get_shortcodes() { | ||||||
|  |         return $this->shortcodes; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Check if shortcode is registered | ||||||
|  |      *  | ||||||
|  |      * @param string $tag Shortcode tag | ||||||
|  |      * @return bool | ||||||
|  |      */ | ||||||
|  |     public function is_registered($tag) { | ||||||
|  |         return isset($this->shortcodes[$tag]); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // ========================================
 | ||||||
|  |     // Shortcode Render Methods
 | ||||||
|  |     // ========================================
 | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render dashboard shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_dashboard($atts = array()) { | ||||||
|  |         if (!class_exists('HVAC_Dashboard')) { | ||||||
|  |             return '<p>' . __('Dashboard functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $dashboard = new HVAC_Dashboard(); | ||||||
|  |         return $dashboard->render_dashboard($atts); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render master dashboard shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_master_dashboard($atts = array()) { | ||||||
|  |         if (!class_exists('HVAC_Master_Dashboard')) { | ||||||
|  |             return '<p>' . __('Master dashboard functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $master_dashboard = new HVAC_Master_Dashboard(); | ||||||
|  |         return $master_dashboard->render_dashboard($atts); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render manage event shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_manage_event($atts = array()) { | ||||||
|  |         if (!class_exists('HVAC_Manage_Event')) { | ||||||
|  |             return '<p>' . __('Event management functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $manage_event = new HVAC_Manage_Event(); | ||||||
|  |         return $manage_event->render_form($atts); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render event summary shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_event_summary($atts = array()) { | ||||||
|  |         if (!class_exists('HVAC_Event_Summary')) { | ||||||
|  |             return '<p>' . __('Event summary functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $event_summary = new HVAC_Event_Summary(); | ||||||
|  |         return $event_summary->render_summary($atts); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render login shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_login($atts = array()) { | ||||||
|  |         if (!class_exists('\\HVAC_Community_Events\\Community\\Login_Handler')) { | ||||||
|  |             return '<p>' . __('Login functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $login_handler = new \HVAC_Community_Events\Community\Login_Handler(); | ||||||
|  |         return $login_handler->render_login_form($atts); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render registration shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_registration($atts = array()) { | ||||||
|  |         if (!class_exists('HVAC_Registration')) { | ||||||
|  |             return '<p>' . __('Registration functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $registration = new HVAC_Registration(); | ||||||
|  |         return $registration->render_registration_form($atts); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render trainer profile shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_trainer_profile($atts = array()) { | ||||||
|  |         if (!class_exists('HVAC_Trainer_Profile')) { | ||||||
|  |             return '<p>' . __('Profile functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $trainer_profile = new HVAC_Trainer_Profile(); | ||||||
|  |         return $trainer_profile->render_profile($atts); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render certificate reports shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_certificate_reports($atts = array()) { | ||||||
|  |         // Redirect to manager if available
 | ||||||
|  |         if (class_exists('HVAC_Certificate_Manager')) { | ||||||
|  |             $cert_manager = new HVAC_Certificate_Manager(); | ||||||
|  |             return $cert_manager->render_reports_page(); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return '<p>' . __('Certificate reports functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render generate certificates shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_generate_certificates($atts = array()) { | ||||||
|  |         // Redirect to manager if available
 | ||||||
|  |         if (class_exists('HVAC_Certificate_Manager')) { | ||||||
|  |             $cert_manager = new HVAC_Certificate_Manager(); | ||||||
|  |             return $cert_manager->render_generate_page(); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return '<p>' . __('Certificate generation functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render email attendees shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_email_attendees($atts = array()) { | ||||||
|  |         // Check if user has appropriate permissions
 | ||||||
|  |         if (!current_user_can('edit_tribe_events')) { | ||||||
|  |             return '<p>' . __('You do not have permission to access this page.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         ob_start(); | ||||||
|  |         include HVAC_PLUGIN_DIR . 'templates/email-attendees.php'; | ||||||
|  |         return ob_get_clean(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render communication templates shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_communication_templates($atts = array()) { | ||||||
|  |         if (!class_exists('HVAC_Communication_Templates')) { | ||||||
|  |             return '<p>' . __('Communication templates functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Check permissions
 | ||||||
|  |         if (!current_user_can('edit_tribe_events') && !current_user_can('manage_options')) { | ||||||
|  |             return '<p>' . __('You do not have permission to access this page.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $templates = new HVAC_Communication_Templates(); | ||||||
|  |          | ||||||
|  |         ob_start(); | ||||||
|  |         $templates->render_admin_page(); | ||||||
|  |         return ob_get_clean(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render communication schedules shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_communication_schedules($atts = array()) { | ||||||
|  |         if (!class_exists('HVAC_Communication_Scheduler')) { | ||||||
|  |             return '<p>' . __('Communication scheduler functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Check permissions
 | ||||||
|  |         if (!current_user_can('edit_tribe_events') && !current_user_can('manage_options')) { | ||||||
|  |             return '<p>' . __('You do not have permission to access this page.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $scheduler = hvac_communication_scheduler(); | ||||||
|  |          | ||||||
|  |         ob_start(); | ||||||
|  |         $scheduler->render_schedules_page(); | ||||||
|  |         return ob_get_clean(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Render Google Sheets admin shortcode | ||||||
|  |      *  | ||||||
|  |      * @param array $atts Shortcode attributes | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function render_google_sheets_admin($atts = array()) { | ||||||
|  |         if (!class_exists('HVAC_Google_Sheets_Admin')) { | ||||||
|  |             return '<p>' . __('Google Sheets functionality not available.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Check permissions
 | ||||||
|  |         if (!current_user_can('manage_options') && !current_user_can('view_all_trainer_data')) { | ||||||
|  |             return '<p>' . __('You do not have permission to access this page.', 'hvac-community-events') . '</p>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $google_sheets = new HVAC_Google_Sheets_Admin(); | ||||||
|  |          | ||||||
|  |         ob_start(); | ||||||
|  |         $google_sheets->render_admin_page(); | ||||||
|  |         return ob_get_clean(); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in a new issue