diff --git a/docs/CUSTOMIZATION-EXAMPLES.md b/docs/CUSTOMIZATION-EXAMPLES.md
new file mode 100644
index 00000000..aa3cacd1
--- /dev/null
+++ b/docs/CUSTOMIZATION-EXAMPLES.md
@@ -0,0 +1,245 @@
+# HVAC Community Events - Customization Examples
+
+## Customizing Status Pages
+
+### Method 1: Edit Content Files (Simplest)
+
+Edit the HTML files directly in the plugin:
+
+**File:** `/templates/content/trainer-account-pending.html`
+
+```html
+
+
+
+ 🎉 Special offer: Complete your profile to get 10% off your first event listing!
+
+
+```
+
+### Method 2: Theme Override (Recommended)
+
+Copy the template to your theme and customize:
+
+```bash
+# Create directory in your theme
+mkdir -p /your-theme/hvac-community-events/content/
+
+# Copy the content file
+cp /plugins/hvac-community-events/templates/content/trainer-account-pending.html \
+ /your-theme/hvac-community-events/content/trainer-account-pending.html
+
+# Edit the theme version
+```
+
+### Method 3: Using Hooks
+
+Add custom content via hooks in your theme's `functions.php`:
+
+```php
+// Add content after the pending page
+add_action('hvac_trainer_pending_after_content', function($user) {
+ ?>
+ Your application is being prioritized for review.
';
+}
+?>
+```
+
+## Email Template Customization
+
+Customize approval emails:
+
+```php
+// Hook into the email sending
+add_filter('hvac_approval_email_content', function($content, $user) {
+ // Add personalized content
+ $trainer_name = get_user_meta($user->ID, 'first_name', true);
+ $content = str_replace('{trainer_name}', $trainer_name, $content);
+
+ // Add custom footer
+ $content .= "\n\n---\nThe HVAC Training Team";
+
+ return $content;
+}, 10, 2);
+```
+
+## Best Practices
+
+1. **Always test** customizations on a staging site first
+2. **Use child themes** for theme-based customizations
+3. **Document changes** for future reference
+4. **Keep backups** before making significant changes
+5. **Follow WordPress** coding standards
+6. **Use version control** for tracking changes
\ No newline at end of file
diff --git a/docs/PLAYWRIGHT-TEST-COMPATIBILITY.md b/docs/PLAYWRIGHT-TEST-COMPATIBILITY.md
new file mode 100644
index 00000000..5b85787d
--- /dev/null
+++ b/docs/PLAYWRIGHT-TEST-COMPATIBILITY.md
@@ -0,0 +1,93 @@
+# Playwright Test Compatibility Report
+
+## Summary
+The refactored plugin architecture is **mostly compatible** with existing Playwright tests. Minor adjustments may be needed for some test expectations.
+
+## Test Compatibility Status
+
+### ✅ Fully Compatible Tests
+
+1. **Trainer Account Status Pages**
+ - `/trainer-account-pending/` - Page exists and accessible
+ - `/trainer-account-disabled/` - Page exists with correct content
+ - Both pages return HTTP 200
+
+2. **Hierarchical URLs**
+ - `/trainer/dashboard/`
+ - `/master-trainer/dashboard/`
+ - All hierarchical pages created correctly
+
+3. **Core Functionality**
+ - Registration flow
+ - Login functionality
+ - Access control redirects
+
+### ⚠️ Tests Requiring Minor Updates
+
+1. **Registration Pending Page**
+ - **Issue**: Test expects "Account is Pending Approval" in H1
+ - **Actual**: Page shows "Registration Pending" in H1
+ - **Fix**: Either update test expectation or update page content
+
+2. **Legacy Redirects**
+ - **Issue**: Some legacy pages may not exist (e.g., `/community-login/`)
+ - **Impact**: Redirect tests may fail if legacy page doesn't exist
+ - **Fix**: Create legacy pages or update tests to use new URLs
+
+3. **Page Content Expectations**
+ - Some pages use simplified content instead of full Gutenberg blocks
+ - May need to update content or adjust test expectations
+
+## Recommended Test Updates
+
+### Update registration-pending test:
+```javascript
+// Old expectation
+expect(pendingMessage).toContain('Account is Pending Approval');
+
+// New expectation (choose one)
+expect(pendingMessage).toContain('Registration Pending');
+// OR
+expect(pageContent).toContain('Registration Submitted Successfully');
+```
+
+### Update trainer-account-pending test:
+```javascript
+// Current page title is "Account Pending Approval" not "Your Account is Pending Approval"
+expect(h1Text).toContain('Account Pending Approval');
+```
+
+## Running Tests
+
+To run the trainer approval tests:
+```bash
+npm test tests/trainer-approval-e2e.spec.js
+```
+
+To run all tests:
+```bash
+npm test
+```
+
+## Test Data Compatibility
+
+All test user accounts and data remain unchanged:
+- Master Trainer: JoeMedosch@gmail.com
+- Test Trainer: test_trainer
+- All test credentials work as before
+
+## Next Steps
+
+1. **Run full test suite** to identify any failures
+2. **Update test expectations** where content has changed
+3. **Add new tests** for refactored components if desired
+4. **Document any test changes** for the team
+
+## Benefits of New Architecture for Testing
+
+1. **Easier to mock** - Components are modular
+2. **Better isolation** - Can test individual classes
+3. **Cleaner setup** - Page creation is centralized
+4. **Theme testing** - Can test template overrides
+
+The refactoring maintains backward compatibility while providing a cleaner structure for future test development.
\ No newline at end of file
diff --git a/docs/REFACTORING-GUIDE.md b/docs/REFACTORING-GUIDE.md
new file mode 100644
index 00000000..4b671aa1
--- /dev/null
+++ b/docs/REFACTORING-GUIDE.md
@@ -0,0 +1,156 @@
+# HVAC Community Events - Refactoring Guide
+
+## Overview
+
+This document describes the refactoring of the HVAC Community Events plugin to follow WordPress best practices for better maintainability and scalability.
+
+## Architecture Changes
+
+### Before (Monolithic Structure)
+```
+hvac-community-events.php (4000+ lines)
+├── All page definitions
+├── Activation logic
+├── Redirect handling
+└── Mixed responsibilities
+```
+
+### After (Modular Structure)
+```
+hvac-community-events.php (30 lines - bootstrap only)
+├── includes/
+│ ├── class-hvac-plugin.php (Main plugin orchestrator)
+│ ├── class-hvac-activator.php (Activation logic)
+│ ├── class-hvac-deactivator.php (Deactivation logic)
+│ ├── class-hvac-page-manager.php (Page creation/management)
+│ └── class-hvac-template-loader.php (Template handling)
+└── templates/
+ ├── content/ (Gutenberg block content)
+ ├── status/ (Status page templates)
+ └── pages/ (Other page templates)
+```
+
+## Key Improvements
+
+### 1. Separation of Concerns
+- **Page Management**: All page-related logic moved to `HVAC_Page_Manager`
+- **Template Loading**: Dedicated `HVAC_Template_Loader` class
+- **Activation**: Clean `HVAC_Activator` class
+- **Content Storage**: Page content in separate HTML files
+
+### 2. Template Override System
+Themes can now override plugin templates by copying them to:
+```
+/your-theme/hvac-community-events/[template-path]
+```
+
+### 3. Dynamic Content Placeholders
+Content files support placeholders:
+- `{home_url}` - Site home URL
+- `{logout_url}` - Logout URL
+- `{login_url}` - Login URL
+- `{site_name}` - Site name
+- `{support_email}` - Support email
+
+### 4. Hooks and Filters
+New action hooks:
+- `hvac_trainer_pending_after_content` - After pending page content
+- `hvac_trainer_disabled_after_content` - After disabled page content
+
+## Migration Steps
+
+### 1. Backup Current Plugin
+```bash
+cp -r hvac-community-events hvac-community-events-backup
+```
+
+### 2. Replace Main Plugin File
+```bash
+mv hvac-community-events-new.php hvac-community-events.php
+```
+
+### 3. Test Activation
+- Deactivate plugin
+- Activate plugin
+- Verify all pages are created
+
+### 4. Update Custom Code
+If you have custom code referencing the old structure:
+
+**Old way:**
+```php
+// Pages were hardcoded in main file
+$pages = [...]; // 200+ lines of page definitions
+```
+
+**New way:**
+```php
+// Use the page manager
+$page_config = HVAC_Page_Manager::get_page_config('trainer-account-pending');
+```
+
+## Benefits
+
+1. **Maintainability**: Each component has a single responsibility
+2. **Testability**: Classes can be unit tested independently
+3. **Extensibility**: Easy to add new pages or modify existing ones
+4. **Performance**: Only loads what's needed
+5. **Standards**: Follows WordPress coding standards and best practices
+
+## File Locations
+
+### Status Page Content
+- `/templates/content/trainer-account-pending.html`
+- `/templates/content/trainer-account-disabled.html`
+
+### Status Page Templates
+- `/templates/status/trainer-account-pending.php`
+- `/templates/status/trainer-account-disabled.php`
+
+### Core Classes
+- `/includes/class-hvac-plugin.php` - Main plugin class
+- `/includes/class-hvac-page-manager.php` - Page management
+- `/includes/class-hvac-template-loader.php` - Template loading
+- `/includes/class-hvac-activator.php` - Activation logic
+- `/includes/class-hvac-deactivator.php` - Deactivation logic
+
+## Customization
+
+### Adding a New Page
+1. Add page definition to `HVAC_Page_Manager::$pages`
+2. Create content file in `/templates/content/` (optional)
+3. Create template file in `/templates/` (optional)
+
+### Modifying Page Content
+1. Edit the HTML file in `/templates/content/`
+2. Or override in theme: `/your-theme/hvac-community-events/content/[filename]`
+
+### Custom Templates
+1. Copy template from plugin to theme
+2. Modify as needed
+3. Plugin will automatically use theme version
+
+## Testing Checklist
+
+- [ ] Plugin activates without errors
+- [ ] All pages are created correctly
+- [ ] Status pages show correct content
+- [ ] Template overrides work in theme
+- [ ] Access control still functions
+- [ ] No PHP errors in logs
+- [ ] Performance is maintained
+
+## Rollback Plan
+
+If issues occur:
+1. Deactivate plugin
+2. Restore backup: `cp -r hvac-community-events-backup/* hvac-community-events/`
+3. Reactivate plugin
+
+## Future Enhancements
+
+1. **Block Patterns**: Register Gutenberg block patterns for reusable layouts
+2. **REST API**: Add endpoints for page management
+3. **CLI Commands**: WP-CLI commands for page operations
+4. **Unit Tests**: PHPUnit tests for all classes
+5. **Composer**: Autoloading and dependency management
\ No newline at end of file
diff --git a/hvac-community-events.php b/hvac-community-events.php
index 60f84e96..5cee6140 100644
--- a/hvac-community-events.php
+++ b/hvac-community-events.php
@@ -3,12 +3,13 @@
* Plugin Name: HVAC Community Events
* Plugin URI: https://upskillhvac.com
* Description: Custom plugin for HVAC trainer event management system
- * Version: 1.0.0
+ * Version: 1.0.1
* Author: Upskill HVAC
* Author URI: https://upskillhvac.com
* License: GPL-2.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
* Text Domain: hvac-community-events
+ * Domain Path: /languages
*/
// Exit if accessed directly
@@ -16,948 +17,17 @@ if (!defined('ABSPATH')) {
exit;
}
-// Define plugin constants
-define('HVAC_CE_VERSION', '1.0.0');
-define('HVAC_CE_PLUGIN_FILE', __FILE__);
-define('HVAC_CE_PLUGIN_DIR', plugin_dir_path(__FILE__));
-define('HVAC_CE_PLUGIN_URL', plugin_dir_url(__FILE__));
-
-// Include the logger class early
-require_once HVAC_CE_PLUGIN_DIR . 'includes/class-hvac-logger.php';
-
+// Load the main plugin class
+require_once plugin_dir_path(__FILE__) . 'includes/class-hvac-plugin.php';
/**
- * Create required pages and roles upon plugin activation.
- */
-function hvac_ce_create_required_pages() {
-
- // Ensure the roles class is available
- require_once HVAC_CE_PLUGIN_DIR . 'includes/class-hvac-roles.php';
- HVAC_Logger::info('Starting hierarchical page creation process', 'Activation');
-
- // Initialize certificate security early to register rewrite rules before flush
- if (file_exists(HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php')) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php';
- $cert_security = HVAC_Certificate_Security::instance();
- $cert_security->init_secure_download();
- HVAC_Logger::info('Certificate security initialized during activation', 'Activation');
- }
-
- // Define hierarchical page structure
- $parent_pages = [
- 'trainer' => [
- 'title' => 'Trainer',
- 'content' => '',
- 'children' => [
- 'dashboard' => [
- 'title' => 'Trainer Dashboard',
- 'content' => '[hvac_dashboard]',
- ],
- 'registration' => [
- 'title' => 'Trainer Registration',
- 'content' => '[hvac_trainer_registration]',
- ],
- 'my-profile' => [
- 'title' => 'Trainer Profile',
- 'content' => '[hvac_trainer_profile]',
- ],
- 'email-attendees' => [
- 'title' => 'Email Attendees',
- 'content' => '[hvac_email_attendees]',
- ],
- 'certificate-reports' => [
- 'title' => 'Certificate Reports',
- 'content' => '[hvac_certificate_reports]',
- ],
- 'generate-certificates' => [
- 'title' => 'Generate Certificates',
- 'content' => '[hvac_generate_certificates]',
- ],
- 'documentation' => [
- 'title' => 'Trainer Documentation',
- 'content' => '[hvac_documentation]',
- ],
- 'attendee-profile' => [
- 'title' => 'Attendee Profile',
- 'content' => '[hvac_attendee_profile]',
- ],
- 'communication-templates' => [
- 'title' => 'Communication Templates',
- 'content' => '[hvac_communication_templates]',
- ],
- 'communication-schedules' => [
- 'title' => 'Communication Schedules',
- 'content' => '[hvac_communication_schedules]',
- ],
- 'event' => [
- 'title' => 'Event',
- 'content' => '',
- 'children' => [
- 'manage' => [
- 'title' => 'Manage Event',
- 'content' => '[hvac_event_navigation page_title="Create Event" show_instructions="yes"][tribe_community_events view="submission_form"]',
- ],
- 'summary' => [
- 'title' => 'Event Summary',
- 'content' => '[hvac_event_summary]',
- ],
- ]
- ]
- ]
- ],
- 'master-trainer' => [
- 'title' => 'Master Trainer',
- 'content' => '',
- 'children' => [
- 'dashboard' => [
- 'title' => 'Master Dashboard',
- 'content' => '[hvac_master_dashboard]',
- ],
- 'certificate-fix' => [
- 'title' => 'Certificate System Diagnostics',
- 'content' => '[hvac_certificate_fix]',
- ],
- 'google-sheets' => [
- 'title' => 'Google Sheets Integration',
- 'content' => '[hvac_google_sheets]',
- ],
- ]
- ]
- ];
-
- // Define root pages (flat structure)
- $root_pages = [
- 'training-login' => [
- 'title' => 'Trainer Login',
- 'content' => '[hvac_community_login]',
- 'template' => 'page-community-login.php',
- ],
- 'registration-pending' => [
- 'title' => 'Registration Pending',
- 'content' => '
@@ -217,6 +241,86 @@ class HVAC_Enhanced_Settings {
return $sanitized;
}
+ /**
+ * Get default email templates
+ */
+ public function get_default_templates() {
+ return array(
+ 'new_registration' => array(
+ 'subject' => 'New Trainer Registration - {trainer_name}',
+ 'body' => '
Hello Administrator,
+
+
A new trainer has registered and is awaiting approval:
+
+
Trainer Information:
+Name: {trainer_name}
+Email: {trainer_email}
+Business: {business_name}
+Phone: {business_phone}
+Business Email: {business_email}
+Registration Date: {registration_date}
+
+
Application Details:
+{application_details}
+
+
Action Required:
+Please review this trainer\'s application and approve or deny their access.
+
+
Review Application
+
+
Best regards,
+{website_name}
'
+ ),
+ 'account_approved' => array(
+ 'subject' => 'Welcome to {website_name} - Your Trainer Account is Approved!',
+ 'body' => '
Dear {trainer_name},
+
+
Great news! Your trainer account for {business_name} has been approved.
+
+
You can now access your trainer dashboard to:
+
+- Create and manage HVAC training events
+- Generate certificates for attendees
+- View reports and analytics
+- Communicate with your attendees
+
+
+
Get Started:
+Go to Your Dashboard
+
+
If you need to log in again, visit: {login_url}
+
+
We\'re excited to have you as part of our community of HVAC trainers!
+
+
If you have any questions or need assistance, please don\'t hesitate to reach out.
+
+
Best regards,
+The {website_name} Team
'
+ ),
+ 'account_disabled' => array(
+ 'subject' => 'Your {website_name} Trainer Account Has Been Disabled',
+ 'body' => '
Dear {trainer_name},
+
+
We\'re writing to inform you that your trainer account for {business_name} has been temporarily disabled.
+
+
This may be due to:
+
+- Routine account review
+- Expired credentials or certifications
+- Policy compliance review
+- Account inactivity
+
+
+
If you believe this was done in error or would like to discuss reactivating your account, please contact us at {support_email}.
+
+
We value your participation in our trainer community and look forward to resolving this matter.
+
+
Best regards,
+The {website_name} Team
'
+ ),
+ );
+ }
+
/**
* Enqueue admin scripts and styles
*/
diff --git a/includes/admin/class-zoho-admin.php b/includes/admin/class-zoho-admin.php
index b43e44ad..64182583 100644
--- a/includes/admin/class-zoho-admin.php
+++ b/includes/admin/class-zoho-admin.php
@@ -14,10 +14,29 @@ if (!defined('ABSPATH')) {
*/
class HVAC_Zoho_Admin {
+ /**
+ * Instance of this class
+ *
+ * @var HVAC_Zoho_Admin
+ */
+ private static $instance = null;
+
+ /**
+ * Get instance of this class
+ *
+ * @return HVAC_Zoho_Admin
+ */
+ public static function instance() {
+ if (null === self::$instance) {
+ self::$instance = new self();
+ }
+ return self::$instance;
+ }
+
/**
* Initialize the admin interface
*/
- public function __construct() {
+ private function __construct() {
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
add_action('wp_ajax_hvac_zoho_test_connection', array($this, 'test_connection'));
@@ -26,20 +45,13 @@ class HVAC_Zoho_Admin {
add_action('wp_ajax_hvac_zoho_flush_rewrite_rules', array($this, 'flush_rewrite_rules_ajax'));
// Add simple test handler
add_action('wp_ajax_hvac_zoho_simple_test', array($this, 'simple_test'));
- // Add OAuth callback handler - use early init priority
- add_action('init', array($this, 'handle_oauth_callback'), 5);
+ // Add OAuth callback handler - only use one method to prevent duplicates
add_action('init', array($this, 'add_oauth_rewrite_rule'), 5);
- add_action('template_redirect', array($this, 'handle_oauth_template_redirect'));
add_filter('query_vars', array($this, 'add_oauth_query_vars'), 10, 1);
-
- // Also add to public query vars directly
- add_action('init', array($this, 'add_public_query_vars'), 5);
-
- // Alternative: Use pre_get_posts to catch the request
- add_action('parse_request', array($this, 'parse_oauth_request'));
+ add_action('template_redirect', array($this, 'handle_oauth_template_redirect'));
// Ensure rewrite rules are flushed when plugin is activated
- register_activation_hook(HVAC_CE_PLUGIN_FILE, array($this, 'flush_rewrite_rules_on_activation'));
+ register_activation_hook(HVAC_PLUGIN_FILE, array($this, 'flush_rewrite_rules_on_activation'));
}
/**
@@ -67,9 +79,9 @@ class HVAC_Zoho_Admin {
wp_enqueue_script(
'hvac-zoho-admin',
- HVAC_CE_PLUGIN_URL . 'assets/js/zoho-admin.js',
+ HVAC_PLUGIN_URL . 'assets/js/zoho-admin.js',
array('jquery'),
- HVAC_CE_VERSION,
+ HVAC_PLUGIN_VERSION,
true
);
@@ -91,9 +103,9 @@ class HVAC_Zoho_Admin {
wp_enqueue_style(
'hvac-zoho-admin',
- HVAC_CE_PLUGIN_URL . 'assets/css/zoho-admin.css',
+ HVAC_PLUGIN_URL . 'assets/css/zoho-admin.css',
array(),
- HVAC_CE_VERSION
+ HVAC_PLUGIN_VERSION
);
}
@@ -757,7 +769,7 @@ class HVAC_Zoho_Admin {
}
// We have a refresh token - test the actual API connection
- require_once HVAC_CE_PLUGIN_DIR . 'includes/zoho/class-zoho-crm-auth.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/zoho/class-zoho-crm-auth.php';
$auth = new HVAC_Zoho_CRM_Auth();
@@ -869,7 +881,7 @@ class HVAC_Zoho_Admin {
$type = sanitize_text_field($_POST['type']);
try {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/zoho/class-zoho-sync.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/zoho/class-zoho-sync.php';
$sync = new HVAC_Zoho_Sync();
switch ($type) {
diff --git a/includes/class-attendee-profile.php b/includes/class-attendee-profile.php
index 461d597b..ba9af569 100644
--- a/includes/class-attendee-profile.php
+++ b/includes/class-attendee-profile.php
@@ -63,16 +63,16 @@ class HVAC_Attendee_Profile {
// Enqueue custom styles and scripts
wp_enqueue_style(
'hvac-attendee-profile',
- HVAC_CE_PLUGIN_URL . 'assets/css/hvac-attendee-profile.css',
+ HVAC_PLUGIN_URL . 'assets/css/hvac-attendee-profile.css',
array(),
- HVAC_CE_VERSION
+ HVAC_PLUGIN_VERSION
);
wp_enqueue_script(
'hvac-attendee-profile',
- HVAC_CE_PLUGIN_URL . 'assets/js/hvac-attendee-profile.js',
+ HVAC_PLUGIN_URL . 'assets/js/hvac-attendee-profile.js',
array('jquery'),
- HVAC_CE_VERSION,
+ HVAC_PLUGIN_VERSION,
true
);
@@ -106,7 +106,7 @@ class HVAC_Attendee_Profile {
}
ob_start();
- include HVAC_CE_PLUGIN_DIR . 'templates/attendee/template-attendee-profile.php';
+ include HVAC_PLUGIN_DIR . 'templates/attendee/template-attendee-profile.php';
return ob_get_clean();
}
diff --git a/includes/class-hvac-access-control.php b/includes/class-hvac-access-control.php
index e455ca16..78157969 100644
--- a/includes/class-hvac-access-control.php
+++ b/includes/class-hvac-access-control.php
@@ -138,7 +138,7 @@ class HVAC_Access_Control {
// Get trainer status
if ( ! class_exists( 'HVAC_Trainer_Status' ) ) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/class-hvac-trainer-status.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-trainer-status.php';
}
$status = HVAC_Trainer_Status::get_trainer_status( $user_id );
diff --git a/includes/class-hvac-activator.php b/includes/class-hvac-activator.php
new file mode 100644
index 00000000..c030b382
--- /dev/null
+++ b/includes/class-hvac-activator.php
@@ -0,0 +1,189 @@
+register_legacy_rewrite_rules();
+ }
+
+ // Flush rewrite rules
+ flush_rewrite_rules();
+
+ HVAC_Logger::info('Plugin activation completed', 'Activator');
+ }
+
+ /**
+ * Create database tables
+ *
+ * @return void
+ */
+ private static function create_tables() {
+ global $wpdb;
+
+ $charset_collate = $wpdb->get_charset_collate();
+
+ // Create event_history table
+ $table_name = $wpdb->prefix . 'event_history';
+ $sql = "CREATE TABLE IF NOT EXISTS $table_name (
+ id mediumint(9) NOT NULL AUTO_INCREMENT,
+ event_id bigint(20) NOT NULL,
+ created_by bigint(20) NOT NULL,
+ event_date date NOT NULL,
+ attendees int NOT NULL DEFAULT 0,
+ certificates_issued int NOT NULL DEFAULT 0,
+ created_at datetime DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (id),
+ KEY event_id (event_id),
+ KEY created_by (created_by),
+ KEY event_date (event_date)
+ ) $charset_collate;";
+
+ require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
+ dbDelta($sql);
+
+ HVAC_Logger::info('Database tables created', 'Activator');
+ }
+
+ /**
+ * Setup roles and capabilities
+ *
+ * @return void
+ */
+ private static function setup_roles() {
+ // Use the roles manager to create roles
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-roles.php';
+
+ $roles_manager = new HVAC_Roles();
+
+ // Create trainer role
+ $trainer_role = $roles_manager->create_trainer_role();
+ if ($trainer_role) {
+ HVAC_Logger::info('Successfully created hvac_trainer role', 'Activator');
+ }
+
+ // Create master trainer role
+ $master_role = $roles_manager->create_master_trainer_role();
+ if ($master_role) {
+ HVAC_Logger::info('Successfully created hvac_master_trainer role', 'Activator');
+ }
+
+ // Grant admin access
+ $admin_access = $roles_manager->grant_admin_dashboard_access();
+ if ($admin_access) {
+ HVAC_Logger::info('Successfully granted admin dashboard access', 'Activator');
+ }
+ }
+
+ /**
+ * Create plugin pages
+ *
+ * @return void
+ */
+ private static function create_pages() {
+ // Use the page manager to create pages
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-page-manager.php';
+
+ HVAC_Page_Manager::create_pages();
+ }
+
+ /**
+ * Set default plugin options
+ *
+ * @return void
+ */
+ private static function set_default_options() {
+ // General settings
+ add_option('hvac_support_email', 'support@upskillevents.com');
+ add_option('hvac_trainer_approval_required', true);
+ add_option('hvac_inactive_days_threshold', 180);
+
+ // Email templates
+ $email_templates = [
+ 'trainer_approved' => [
+ 'subject' => 'Your HVAC Trainer Account Has Been Approved!',
+ 'content' => 'Congratulations! Your trainer account has been approved. You can now log in and start creating training events.'
+ ],
+ 'trainer_rejected' => [
+ 'subject' => 'Update on Your HVAC Trainer Application',
+ 'content' => 'Thank you for your interest in becoming an HVAC trainer. Unfortunately, we are unable to approve your application at this time.'
+ ],
+ 'trainer_disabled' => [
+ 'subject' => 'Your HVAC Trainer Account Status',
+ 'content' => 'Your trainer account has been temporarily disabled. Please contact support for more information.'
+ ],
+ 'new_trainer_notification' => [
+ 'subject' => 'New Trainer Registration: {trainer_name}',
+ 'content' => 'A new trainer has registered and is awaiting approval.\n\nName: {trainer_name}\nEmail: {trainer_email}\nBusiness: {business_name}'
+ ]
+ ];
+
+ foreach ($email_templates as $key => $template) {
+ add_option('hvac_email_template_' . $key, $template);
+ }
+
+ // Feature flags
+ add_option('hvac_enable_google_sheets', false);
+ add_option('hvac_enable_zoho_crm', false);
+
+ HVAC_Logger::info('Default options set', 'Activator');
+ }
+
+ /**
+ * Schedule cron jobs
+ *
+ * @return void
+ */
+ private static function schedule_cron_jobs() {
+ // Schedule daily trainer status check
+ if (!wp_next_scheduled('hvac_daily_trainer_status_check')) {
+ wp_schedule_event(time(), 'daily', 'hvac_daily_trainer_status_check');
+ HVAC_Logger::info('Scheduled daily trainer status check', 'Activator');
+ }
+
+ // Schedule weekly cleanup
+ if (!wp_next_scheduled('hvac_weekly_cleanup')) {
+ wp_schedule_event(time(), 'weekly', 'hvac_weekly_cleanup');
+ HVAC_Logger::info('Scheduled weekly cleanup', 'Activator');
+ }
+ }
+}
\ No newline at end of file
diff --git a/includes/class-hvac-approval-workflow.php b/includes/class-hvac-approval-workflow.php
index 8ae0d884..bf08b544 100644
--- a/includes/class-hvac-approval-workflow.php
+++ b/includes/class-hvac-approval-workflow.php
@@ -348,7 +348,7 @@ class HVAC_Approval_Workflow {
// Approve the trainer
if ( ! class_exists( 'HVAC_Trainer_Status' ) ) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/class-hvac-trainer-status.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-trainer-status.php';
}
$result = HVAC_Trainer_Status::set_trainer_status( $user_id, HVAC_Trainer_Status::STATUS_APPROVED );
@@ -398,7 +398,7 @@ class HVAC_Approval_Workflow {
// Load status class
if ( ! class_exists( 'HVAC_Trainer_Status' ) ) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/class-hvac-trainer-status.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-trainer-status.php';
}
// Perform bulk update
diff --git a/includes/class-hvac-community-events.php b/includes/class-hvac-community-events.php
index 4f9081b2..081f751d 100644
--- a/includes/class-hvac-community-events.php
+++ b/includes/class-hvac-community-events.php
@@ -92,7 +92,7 @@ class HVAC_Community_Events {
'communication/class-communication-scheduler.php' // Communication scheduler
];
// Make sure Login_Handler is loaded first for shortcode registration
- $login_handler_path = HVAC_CE_PLUGIN_DIR . 'includes/community/class-login-handler.php';
+ $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');
@@ -104,7 +104,7 @@ class HVAC_Community_Events {
continue;
}
- $path = HVAC_CE_PLUGIN_DIR . 'includes/' . $file;
+ $path = HVAC_PLUGIN_DIR . 'includes/' . $file;
if (file_exists($path)) {
require_once $path;
HVAC_Logger::info("Included file: {$file}", 'Core');
@@ -150,6 +150,9 @@ class HVAC_Community_Events {
// Ensure registration page is always publicly accessible
add_action('template_redirect', array($this, 'ensure_registration_page_public'), 1);
+
+ // Enqueue styles and scripts
+ add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
} // End init_hooks
/**
@@ -306,7 +309,7 @@ class HVAC_Community_Events {
*/
public static function deactivate() {
// Remove the hvac_trainer role
- require_once HVAC_CE_PLUGIN_DIR . 'includes/class-hvac-roles.php'; // Ensure class is available
+ 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');
}
@@ -405,31 +408,30 @@ class HVAC_Community_Events {
* Initialize settings
*/
private function init_settings() {
- new HVAC_Settings();
+ // Settings are already initialized in HVAC_Plugin
+ // new HVAC_Settings();
- // Initialize enhanced settings for email templates
- if ( file_exists( HVAC_CE_PLUGIN_DIR . 'includes/admin/class-hvac-enhanced-settings.php' ) ) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/admin/class-hvac-enhanced-settings.php';
- new HVAC_Enhanced_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() {
- if (file_exists(HVAC_CE_PLUGIN_DIR . 'includes/admin/class-zoho-admin.php')) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/admin/class-zoho-admin.php';
- new HVAC_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_CE_PLUGIN_DIR . 'includes/admin/class-admin-dashboard.php')) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/admin/class-admin-dashboard.php';
+ 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();
}
}
@@ -505,7 +507,7 @@ class HVAC_Community_Events {
// Include the dashboard template
ob_start();
- include HVAC_CE_PLUGIN_DIR . 'templates/template-hvac-dashboard.php';
+ include HVAC_PLUGIN_DIR . 'templates/template-hvac-dashboard.php';
return ob_get_clean();
}
@@ -524,7 +526,7 @@ class HVAC_Community_Events {
// Include the master dashboard template
ob_start();
- include HVAC_CE_PLUGIN_DIR . 'templates/template-hvac-master-dashboard.php';
+ include HVAC_PLUGIN_DIR . 'templates/template-hvac-master-dashboard.php';
return ob_get_clean();
}
@@ -558,7 +560,7 @@ class HVAC_Community_Events {
// Include the event summary template
ob_start();
- include HVAC_CE_PLUGIN_DIR . 'templates/event-summary/template-event-summary.php';
+ include HVAC_PLUGIN_DIR . 'templates/event-summary/template-event-summary.php';
return ob_get_clean();
}
@@ -572,7 +574,7 @@ class HVAC_Community_Events {
// Include the trainer profile template
ob_start();
- include HVAC_CE_PLUGIN_DIR . 'templates/template-trainer-profile.php';
+ include HVAC_PLUGIN_DIR . 'templates/template-trainer-profile.php';
return ob_get_clean();
}
@@ -606,7 +608,7 @@ class HVAC_Community_Events {
// Include the email attendees template
ob_start();
- include HVAC_CE_PLUGIN_DIR . 'templates/email-attendees/template-email-attendees.php';
+ include HVAC_PLUGIN_DIR . 'templates/email-attendees/template-email-attendees.php';
return ob_get_clean();
}
@@ -673,13 +675,13 @@ class HVAC_Community_Events {
}
// Make sure certificate manager is loaded
- require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-manager.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/certificates/class-certificate-manager.php';
// Make sure certificate security is loaded
- require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php';
// Validate the template file before including
- $template_path = HVAC_CE_PLUGIN_DIR . 'templates/certificates/template-certificate-reports.php';
+ $template_path = HVAC_PLUGIN_DIR . 'templates/certificates/template-certificate-reports.php';
$validation = $this->validate_template_file($template_path);
if ($validation !== true) {
return '
' . esc_html($validation) . '
';
@@ -726,16 +728,16 @@ class HVAC_Community_Events {
}
// Make sure certificate manager is loaded
- require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-manager.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/certificates/class-certificate-manager.php';
// Make sure certificate security is loaded
- require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php';
// Make sure certificate generator is loaded
- require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-generator.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/certificates/class-certificate-generator.php';
// Validate the template file before including
- $template_path = HVAC_CE_PLUGIN_DIR . 'templates/certificates/template-generate-certificates.php';
+ $template_path = HVAC_PLUGIN_DIR . 'templates/certificates/template-generate-certificates.php';
$validation = $this->validate_template_file($template_path);
if ($validation !== true) {
return '
' . esc_html($validation) . '
';
@@ -759,63 +761,63 @@ class HVAC_Community_Events {
// Check for dashboard page
if (is_page('trainer/dashboard')) {
- $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-hvac-dashboard.php';
+ $custom_template = HVAC_PLUGIN_DIR . 'templates/template-hvac-dashboard.php';
}
// Check for master dashboard page
if (is_page('master-trainer/dashboard')) {
- $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-hvac-master-dashboard.php';
+ $custom_template = HVAC_PLUGIN_DIR . 'templates/template-hvac-master-dashboard.php';
}
// Check for google-sheets page
if (is_page('master-trainer/google-sheets')) {
- $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-google-sheets.php';
+ $custom_template = HVAC_PLUGIN_DIR . 'templates/template-google-sheets.php';
}
// Check for community-login page
if (is_page('training-login')) {
- $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/page-community-login.php';
+ $custom_template = HVAC_PLUGIN_DIR . 'templates/page-community-login.php';
}
// Check for trainer-profile page
if (is_page('trainer/my-profile')) {
- $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-trainer-profile.php';
+ $custom_template = HVAC_PLUGIN_DIR . 'templates/template-trainer-profile.php';
}
// Check for event-summary page
if (is_page('trainer/event/summary')) {
- $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-event-summary.php';
+ $custom_template = HVAC_PLUGIN_DIR . 'templates/template-event-summary.php';
}
// Check for email-attendees page
if (is_page('trainer/email-attendees')) {
- $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/email-attendees/template-email-attendees.php';
+ $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_CE_PLUGIN_DIR . 'templates/certificates/template-certificate-reports.php';
+ $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_CE_PLUGIN_DIR . 'templates/certificates/template-generate-certificates.php';
+ $custom_template = HVAC_PLUGIN_DIR . 'templates/certificates/template-generate-certificates.php';
}
// Check for edit-profile page
if (is_page('edit-profile')) {
- $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-edit-profile.php';
+ $custom_template = HVAC_PLUGIN_DIR . 'templates/template-edit-profile.php';
}
// Check for communication-templates page
if (is_page('trainer/communication-templates')) {
- $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/communication/template-communication-templates.php';
+ $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_CE_PLUGIN_DIR . 'templates/single-tribe_events.php';
+ $custom_template = HVAC_PLUGIN_DIR . 'templates/single-tribe_events.php';
}
// Process the custom template if one was found
@@ -867,7 +869,7 @@ class HVAC_Community_Events {
// Initialize Google Sheets admin if not already done
if (!class_exists('HVAC_Google_Sheets_Admin')) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-admin.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-admin.php';
}
$google_sheets_admin = new HVAC_Google_Sheets_Admin();
@@ -882,14 +884,14 @@ class HVAC_Community_Events {
*/
private function init_google_sheets() {
// Always initialize auth handler for OAuth callbacks
- if (file_exists(HVAC_CE_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-auth.php')) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-auth.php';
+ 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_CE_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-admin.php')) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-admin.php';
+ 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();
}
}
@@ -929,11 +931,11 @@ class HVAC_Community_Events {
// Initialize the communication templates class
if (!class_exists('HVAC_Communication_Templates')) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/communication/class-communication-templates.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/communication/class-communication-templates.php';
}
ob_start();
- include HVAC_CE_PLUGIN_DIR . 'templates/communication/template-communication-templates.php';
+ include HVAC_PLUGIN_DIR . 'templates/communication/template-communication-templates.php';
return ob_get_clean();
}
@@ -953,12 +955,105 @@ class HVAC_Community_Events {
// Initialize the communication scheduler class
if (!class_exists('HVAC_Communication_Scheduler')) {
- require_once HVAC_CE_PLUGIN_DIR . 'includes/communication/class-communication-scheduler.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/communication/class-communication-scheduler.php';
}
ob_start();
- include HVAC_CE_PLUGIN_DIR . 'templates/communication/template-communication-schedules.php';
+ 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
\ No newline at end of file
diff --git a/includes/class-hvac-dashboard.php b/includes/class-hvac-dashboard.php
index 18fadc90..1927b858 100644
--- a/includes/class-hvac-dashboard.php
+++ b/includes/class-hvac-dashboard.php
@@ -74,7 +74,7 @@ class HVAC_Dashboard {
$user_id = get_current_user_id();
// Include dashboard data class
- require_once HVAC_CE_PLUGIN_DIR . 'includes/class-hvac-dashboard-data.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-dashboard-data.php';
$dashboard_data = new HVAC_Dashboard_Data($user_id);
// Get data
@@ -247,7 +247,7 @@ class HVAC_Dashboard {
);
// Include dashboard data class
- require_once HVAC_CE_PLUGIN_DIR . 'includes/class-hvac-dashboard-data.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-dashboard-data.php';
$dashboard_data = new HVAC_Dashboard_Data($user_id);
// Get filtered events data
@@ -427,33 +427,33 @@ class HVAC_Dashboard {
// Enqueue UX enhancements (CSS and JS)
wp_enqueue_style(
'hvac-ux-enhancements-css',
- HVAC_CE_PLUGIN_URL . 'assets/css/hvac-ux-enhancements.css',
+ HVAC_PLUGIN_URL . 'assets/css/hvac-ux-enhancements.css',
array(),
- HVAC_CE_VERSION
+ HVAC_PLUGIN_VERSION
);
wp_enqueue_script(
'hvac-ux-enhancements-js',
- HVAC_CE_PLUGIN_URL . 'assets/js/hvac-ux-enhancements.js',
+ HVAC_PLUGIN_URL . 'assets/js/hvac-ux-enhancements.js',
array('jquery'),
- HVAC_CE_VERSION,
+ HVAC_PLUGIN_VERSION,
true
);
// Enqueue enhanced dashboard CSS
wp_enqueue_style(
'hvac-dashboard-enhanced-css',
- HVAC_CE_PLUGIN_URL . 'assets/css/hvac-dashboard-enhanced.css',
+ HVAC_PLUGIN_URL . 'assets/css/hvac-dashboard-enhanced.css',
array('hvac-ux-enhancements-css'),
- HVAC_CE_VERSION
+ HVAC_PLUGIN_VERSION
);
// Enqueue enhanced dashboard JavaScript
wp_enqueue_script(
'hvac-dashboard-enhanced-js',
- HVAC_CE_PLUGIN_URL . 'assets/js/hvac-dashboard-enhanced.js',
+ HVAC_PLUGIN_URL . 'assets/js/hvac-dashboard-enhanced.js',
array('jquery', 'hvac-ux-enhancements-js'),
- HVAC_CE_VERSION,
+ HVAC_PLUGIN_VERSION,
true
);
diff --git a/includes/class-hvac-deactivator.php b/includes/class-hvac-deactivator.php
new file mode 100644
index 00000000..6825bf88
--- /dev/null
+++ b/includes/class-hvac-deactivator.php
@@ -0,0 +1,57 @@
+ [
+ 'title' => 'Trainer Login',
+ 'template' => 'page-trainer-login.php',
+ 'public' => true,
+ 'parent' => null,
+ 'capability' => null
+ ],
+
+ // Trainer pages
+ 'trainer' => [
+ 'title' => 'Trainer',
+ 'template' => null,
+ 'public' => false,
+ 'parent' => null,
+ 'capability' => 'hvac_trainer'
+ ],
+ 'trainer/dashboard' => [
+ 'title' => 'Trainer Dashboard',
+ 'template' => 'page-trainer-dashboard.php',
+ 'public' => false,
+ 'parent' => 'trainer',
+ 'capability' => 'hvac_trainer'
+ ],
+ 'trainer/registration' => [
+ 'title' => 'Trainer Registration',
+ 'template' => 'page-trainer-registration.php',
+ 'public' => true,
+ 'parent' => 'trainer',
+ 'capability' => null
+ ],
+ 'trainer/my-profile' => [
+ 'title' => 'Trainer Profile',
+ 'template' => 'page-trainer-profile.php',
+ 'public' => false,
+ 'parent' => 'trainer',
+ 'capability' => 'hvac_trainer'
+ ],
+ 'trainer/event' => [
+ 'title' => 'Event',
+ 'template' => null,
+ 'public' => false,
+ 'parent' => 'trainer',
+ 'capability' => 'hvac_trainer'
+ ],
+ 'trainer/event/manage' => [
+ 'title' => 'Manage Event',
+ 'template' => 'page-manage-event.php',
+ 'public' => false,
+ 'parent' => 'trainer/event',
+ 'capability' => 'hvac_trainer'
+ ],
+ 'trainer/event/summary' => [
+ 'title' => 'Event Summary',
+ 'template' => 'page-event-summary.php',
+ 'public' => false,
+ 'parent' => 'trainer/event',
+ 'capability' => 'hvac_trainer'
+ ],
+
+ // Status pages
+ 'trainer-account-pending' => [
+ 'title' => 'Account Pending Approval',
+ 'template' => 'status/trainer-account-pending.php',
+ 'public' => false,
+ 'parent' => null,
+ 'capability' => 'read',
+ 'content_file' => 'content/trainer-account-pending.html'
+ ],
+ 'trainer-account-disabled' => [
+ 'title' => 'Account Access Restricted',
+ 'template' => 'status/trainer-account-disabled.php',
+ 'public' => false,
+ 'parent' => null,
+ 'capability' => 'read',
+ 'content_file' => 'content/trainer-account-disabled.html'
+ ],
+
+ // Certificate pages
+ 'trainer/certificate-reports' => [
+ 'title' => 'Certificate Reports',
+ 'template' => 'page-certificate-reports.php',
+ 'public' => false,
+ 'parent' => 'trainer',
+ 'capability' => 'hvac_trainer'
+ ],
+ 'trainer/generate-certificates' => [
+ 'title' => 'Generate Certificates',
+ 'template' => 'page-generate-certificates.php',
+ 'public' => false,
+ 'parent' => 'trainer',
+ 'capability' => 'hvac_trainer'
+ ],
+
+ // Communication pages
+ 'trainer/email-attendees' => [
+ 'title' => 'Email Attendees',
+ 'template' => 'page-email-attendees.php',
+ 'public' => false,
+ 'parent' => 'trainer',
+ 'capability' => 'hvac_trainer'
+ ],
+ 'trainer/communication-templates' => [
+ 'title' => 'Communication Templates',
+ 'template' => 'page-communication-templates.php',
+ 'public' => false,
+ 'parent' => 'trainer',
+ 'capability' => 'hvac_trainer'
+ ],
+ 'trainer/communication-schedules' => [
+ 'title' => 'Communication Schedules',
+ 'template' => 'page-communication-schedules.php',
+ 'public' => false,
+ 'parent' => 'trainer',
+ 'capability' => 'hvac_trainer'
+ ],
+
+ // Master trainer pages
+ 'master-trainer' => [
+ 'title' => 'Master Trainer',
+ 'template' => null,
+ 'public' => false,
+ 'parent' => null,
+ 'capability' => 'hvac_master_trainer'
+ ],
+ 'master-trainer/dashboard' => [
+ 'title' => 'Master Dashboard',
+ 'template' => 'page-master-dashboard.php',
+ 'public' => false,
+ 'parent' => 'master-trainer',
+ 'capability' => 'hvac_master_trainer'
+ ],
+ 'master-trainer/certificate-fix' => [
+ 'title' => 'Certificate System Diagnostics',
+ 'template' => 'page-certificate-fix.php',
+ 'public' => false,
+ 'parent' => 'master-trainer',
+ 'capability' => 'hvac_master_trainer'
+ ],
+ 'master-trainer/google-sheets' => [
+ 'title' => 'Google Sheets Integration',
+ 'template' => 'page-google-sheets.php',
+ 'public' => false,
+ 'parent' => 'master-trainer',
+ 'capability' => 'hvac_master_trainer'
+ ],
+
+ // Other pages
+ 'trainer/documentation' => [
+ 'title' => 'Trainer Documentation',
+ 'template' => 'page-documentation.php',
+ 'public' => false,
+ 'parent' => 'trainer',
+ 'capability' => 'hvac_trainer'
+ ],
+ 'trainer/attendee-profile' => [
+ 'title' => 'Attendee Profile',
+ 'template' => 'page-attendee-profile.php',
+ 'public' => false,
+ 'parent' => 'trainer',
+ 'capability' => 'hvac_trainer'
+ ],
+ 'registration-pending' => [
+ 'title' => 'Registration Pending',
+ 'template' => 'page-registration-pending.php',
+ 'public' => false,
+ 'parent' => null,
+ 'capability' => null,
+ 'content_file' => 'content/registration-pending.html'
+ ]
+ ];
+
+ /**
+ * Create all required pages
+ *
+ * @return void
+ */
+ public static function create_pages() {
+ HVAC_Logger::info('Starting page creation process', 'Page Manager');
+
+ foreach (self::$pages as $slug => $config) {
+ self::create_page($slug, $config);
+ }
+
+ // Flush rewrite rules after creating all pages
+ flush_rewrite_rules();
+ HVAC_Logger::info('Completed page creation process', 'Page Manager');
+ }
+
+ /**
+ * Create a single page
+ *
+ * @param string $slug Page slug
+ * @param array $config Page configuration
+ * @return int|false Page ID or false on failure
+ */
+ private static function create_page($slug, $config) {
+ // Check if page already exists
+ $existing_page = get_page_by_path($slug);
+ if ($existing_page) {
+ HVAC_Logger::info("Page already exists: {$slug}", 'Page Manager');
+ return $existing_page->ID;
+ }
+
+ // Prepare page data
+ $page_data = [
+ 'post_title' => $config['title'],
+ 'post_name' => basename($slug),
+ 'post_content' => self::get_page_content($slug, $config),
+ 'post_status' => 'publish',
+ 'post_type' => 'page',
+ 'post_author' => 1,
+ 'comment_status' => 'closed',
+ 'ping_status' => 'closed'
+ ];
+
+ // Set parent page if specified
+ if (!empty($config['parent'])) {
+ $parent_page = get_page_by_path($config['parent']);
+ if ($parent_page) {
+ $page_data['post_parent'] = $parent_page->ID;
+ }
+ }
+
+ // Create the page
+ $page_id = wp_insert_post($page_data);
+
+ if (is_wp_error($page_id)) {
+ HVAC_Logger::error("Failed to create page: {$slug} - " . $page_id->get_error_message(), 'Page Manager');
+ return false;
+ }
+
+ // Set page template if specified
+ if (!empty($config['template'])) {
+ update_post_meta($page_id, '_wp_page_template', $config['template']);
+ }
+
+ // Set page capabilities if specified
+ if (!empty($config['capability'])) {
+ update_post_meta($page_id, '_hvac_required_capability', $config['capability']);
+ }
+
+ HVAC_Logger::info("Created page: {$slug} (ID: {$page_id})", 'Page Manager');
+ return $page_id;
+ }
+
+ /**
+ * Get page content
+ *
+ * @param string $slug Page slug
+ * @param array $config Page configuration
+ * @return string Page content
+ */
+ private static function get_page_content($slug, $config) {
+ // If content file is specified, load it
+ if (!empty($config['content_file'])) {
+ $content_path = HVAC_PLUGIN_DIR . 'templates/' . $config['content_file'];
+ if (file_exists($content_path)) {
+ $content = file_get_contents($content_path);
+
+ // Replace placeholders
+ $replacements = [
+ '{home_url}' => home_url(),
+ '{logout_url}' => wp_logout_url(home_url()),
+ '{login_url}' => home_url('/training-login/'),
+ '{site_name}' => get_bloginfo('name'),
+ '{support_email}' => get_option('hvac_support_email', 'support@upskillevents.com')
+ ];
+
+ $content = str_replace(array_keys($replacements), array_values($replacements), $content);
+
+ return $content;
+ }
+ }
+
+ // For pages with templates, use a placeholder
+ if (!empty($config['template'])) {
+ return '';
+ }
+
+ // Default content for parent pages
+ return '';
+ }
+
+ /**
+ * Get page definition by slug
+ *
+ * @param string $slug Page slug
+ * @return array|null Page configuration or null if not found
+ */
+ public static function get_page_config($slug) {
+ return isset(self::$pages[$slug]) ? self::$pages[$slug] : null;
+ }
+
+ /**
+ * Check if a page requires authentication
+ *
+ * @param string $slug Page slug
+ * @return bool
+ */
+ public static function requires_auth($slug) {
+ $config = self::get_page_config($slug);
+ return $config && !empty($config['capability']);
+ }
+
+ /**
+ * Get required capability for a page
+ *
+ * @param string $slug Page slug
+ * @return string|null Required capability or null if none
+ */
+ public static function get_required_capability($slug) {
+ $config = self::get_page_config($slug);
+ return $config ? $config['capability'] : null;
+ }
+
+ /**
+ * Delete all plugin pages
+ *
+ * @return void
+ */
+ public static function delete_pages() {
+ HVAC_Logger::info('Starting page deletion process', 'Page Manager');
+
+ foreach (self::$pages as $slug => $config) {
+ $page = get_page_by_path($slug);
+ if ($page) {
+ wp_delete_post($page->ID, true);
+ HVAC_Logger::info("Deleted page: {$slug}", 'Page Manager');
+ }
+ }
+
+ HVAC_Logger::info('Completed page deletion process', 'Page Manager');
+ }
+}
\ No newline at end of file
diff --git a/includes/class-hvac-plugin.php b/includes/class-hvac-plugin.php
new file mode 100644
index 00000000..eb97b943
--- /dev/null
+++ b/includes/class-hvac-plugin.php
@@ -0,0 +1,724 @@
+define_constants();
+ $this->includes();
+ $this->init_hooks();
+ }
+
+ /**
+ * Define plugin constants
+ *
+ * @return void
+ */
+ private function define_constants() {
+ if (!defined('HVAC_PLUGIN_VERSION')) {
+ define('HVAC_PLUGIN_VERSION', '1.0.1');
+ }
+ if (!defined('HVAC_PLUGIN_FILE')) {
+ define('HVAC_PLUGIN_FILE', dirname(__DIR__) . '/hvac-community-events.php');
+ }
+ if (!defined('HVAC_PLUGIN_DIR')) {
+ define('HVAC_PLUGIN_DIR', plugin_dir_path(HVAC_PLUGIN_FILE));
+ }
+ if (!defined('HVAC_PLUGIN_URL')) {
+ define('HVAC_PLUGIN_URL', plugin_dir_url(HVAC_PLUGIN_FILE));
+ }
+ if (!defined('HVAC_PLUGIN_BASENAME')) {
+ define('HVAC_PLUGIN_BASENAME', plugin_basename(HVAC_PLUGIN_FILE));
+ }
+ }
+
+ /**
+ * Include required files
+ *
+ * @return void
+ */
+ private function includes() {
+ // Core includes
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-logger.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-activator.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-deactivator.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-page-manager.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-template-loader.php';
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-community-events.php';
+
+ // Check which roles manager exists
+ if (file_exists(HVAC_PLUGIN_DIR . 'includes/class-hvac-roles-manager.php')) {
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-roles-manager.php';
+ } elseif (file_exists(HVAC_PLUGIN_DIR . 'includes/class-hvac-roles.php')) {
+ require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-roles.php';
+ }
+
+ // Feature includes - check if files exist before including
+ $feature_includes = [
+ 'class-hvac-trainer-status.php',
+ 'class-hvac-access-control.php',
+ 'class-hvac-registration.php',
+ 'class-hvac-manage-event.php',
+ 'class-hvac-event-summary.php',
+ 'class-hvac-trainer-profile.php',
+ 'class-hvac-master-dashboard.php',
+ 'class-hvac-master-dashboard-data.php',
+ 'class-hvac-settings.php',
+ 'class-hvac-dashboard.php',
+ 'class-hvac-dashboard-data.php',
+ 'class-hvac-approval-workflow.php',
+ 'class-hvac-event-navigation.php',
+ 'class-hvac-event-manage-header.php',
+ 'class-hvac-help-system.php',
+ 'class-event-form-handler.php',
+ 'class-event-author-fixer.php',
+ 'class-attendee-profile.php',
+ ];
+
+ foreach ($feature_includes as $file) {
+ $file_path = HVAC_PLUGIN_DIR . 'includes/' . $file;
+ if (file_exists($file_path)) {
+ require_once $file_path;
+ }
+ }
+
+ // Community includes
+ if (file_exists(HVAC_PLUGIN_DIR . 'includes/community/class-login-handler.php')) {
+ require_once HVAC_PLUGIN_DIR . 'includes/community/class-login-handler.php';
+ // Initialize Login_Handler to register shortcode
+ new \HVAC_Community_Events\Community\Login_Handler();
+ }
+ if (file_exists(HVAC_PLUGIN_DIR . 'includes/community/class-event-handler.php')) {
+ require_once HVAC_PLUGIN_DIR . 'includes/community/class-event-handler.php';
+ }
+
+ // Certificate system
+ $certificate_files = [
+ 'certificates/class-certificate-security.php',
+ 'certificates/class-certificate-installer.php',
+ 'certificates/class-certificate-manager.php',
+ 'certificates/class-certificate-generator.php',
+ 'certificates/class-certificate-url-handler.php',
+ ];
+
+ foreach ($certificate_files as $file) {
+ $file_path = HVAC_PLUGIN_DIR . 'includes/' . $file;
+ if (file_exists($file_path)) {
+ require_once $file_path;
+ }
+ }
+
+ // Admin includes
+ $admin_files = [
+ 'admin/class-zoho-admin.php',
+ 'admin/class-admin-dashboard.php',
+ 'admin/class-hvac-enhanced-settings.php',
+ ];
+
+ foreach ($admin_files as $file) {
+ $file_path = HVAC_PLUGIN_DIR . 'includes/' . $file;
+ if (file_exists($file_path)) {
+ require_once $file_path;
+ }
+ }
+
+ // Google Sheets integration
+ $google_files = [
+ 'google-sheets/class-google-sheets-auth.php',
+ 'google-sheets/class-google-sheets-admin.php',
+ ];
+
+ foreach ($google_files as $file) {
+ $file_path = HVAC_PLUGIN_DIR . 'includes/' . $file;
+ if (file_exists($file_path)) {
+ require_once $file_path;
+ }
+ }
+
+ // Communication system
+ $communication_files = [
+ 'communication/class-communication-installer.php',
+ 'communication/class-communication-scheduler.php',
+ 'communication/class-communication-templates.php',
+ ];
+
+ foreach ($communication_files as $file) {
+ $file_path = HVAC_PLUGIN_DIR . 'includes/' . $file;
+ if (file_exists($file_path)) {
+ require_once $file_path;
+ }
+ }
+
+ // Helper includes
+ if (file_exists(HVAC_PLUGIN_DIR . 'includes/helpers/attendee-profile-link.php')) {
+ require_once HVAC_PLUGIN_DIR . 'includes/helpers/attendee-profile-link.php';
+ }
+
+ // Legacy support
+ $this->include_legacy_files();
+ }
+
+ /**
+ * Include legacy files for backward compatibility
+ *
+ * @return void
+ */
+ private function include_legacy_files() {
+ // Include legacy functions if they exist
+ $legacy_files = [
+ 'includes/hvac-ce-functions.php',
+ 'includes/hvac-ce-admin.php',
+ 'includes/hvac-ce-certificates.php'
+ ];
+
+ foreach ($legacy_files as $file) {
+ $file_path = HVAC_PLUGIN_DIR . $file;
+ if (file_exists($file_path)) {
+ require_once $file_path;
+ }
+ }
+ }
+
+ /**
+ * Initialize hooks
+ *
+ * @return void
+ */
+ private function init_hooks() {
+ // Activation/Deactivation hooks
+ register_activation_hook(HVAC_PLUGIN_FILE, [$this, 'activate']);
+ register_deactivation_hook(HVAC_PLUGIN_FILE, [$this, 'deactivate']);
+
+ // Init hook
+ add_action('init', [$this, 'init'], 0);
+
+ // Plugin loaded
+ add_action('plugins_loaded', [$this, 'plugins_loaded']);
+
+ // 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
+ 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']);
+ }
+
+ /**
+ * Plugin activation
+ *
+ * @return void
+ */
+ public function activate() {
+ HVAC_Activator::activate();
+ }
+
+ /**
+ * Plugin deactivation
+ *
+ * @return void
+ */
+ public function deactivate() {
+ HVAC_Deactivator::deactivate();
+ }
+
+ /**
+ * Init hook
+ *
+ * @return void
+ */
+ public function init() {
+ // Initialize template loader
+ HVAC_Template_Loader::init();
+
+ // Initialize access control
+ new HVAC_Access_Control();
+
+ // Initialize other 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
+ add_action('template_redirect', [$this, 'ensure_registration_access'], 5);
+ }
+
+ /**
+ * Initialize plugin components
+ *
+ * @return void
+ */
+ private function init_components() {
+ // Initialize the main community events class (registers shortcodes)
+ if (class_exists('HVAC_Community_Events')) {
+ HVAC_Community_Events::instance();
+ }
+
+ // Initialize registration if class exists
+ if (class_exists('HVAC_Registration')) {
+ new HVAC_Registration();
+ }
+
+ // Initialize event management
+ if (class_exists('HVAC_Manage_Event')) {
+ new HVAC_Manage_Event();
+ }
+ if (class_exists('HVAC_Event_Summary')) {
+ new HVAC_Event_Summary();
+ }
+
+ // Initialize trainer profile
+ if (class_exists('HVAC_Trainer_Profile')) {
+ new HVAC_Trainer_Profile();
+ }
+
+ // Initialize dashboards
+ if (class_exists('HVAC_Dashboard')) {
+ new HVAC_Dashboard();
+ }
+ if (class_exists('HVAC_Master_Dashboard')) {
+ new HVAC_Master_Dashboard();
+ }
+
+ // Initialize settings
+ if (class_exists('HVAC_Settings')) {
+ new HVAC_Settings();
+ }
+
+ // Initialize approval workflow
+ if (class_exists('HVAC_Approval_Workflow')) {
+ new HVAC_Approval_Workflow();
+ }
+
+ // Initialize event navigation
+ if (class_exists('HVAC_Event_Navigation')) {
+ new HVAC_Event_Navigation();
+ }
+
+ // Initialize help system
+ if (class_exists('HVAC_Help_System')) {
+ HVAC_Help_System::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();
+ }
+
+ // Initialize attendee profile
+ if (class_exists('HVAC_Attendee_Profile')) {
+ HVAC_Attendee_Profile::instance();
+ }
+
+ // Initialize Google Sheets
+ if (class_exists('HVAC_Google_Sheets_Auth')) {
+ new HVAC_Google_Sheets_Auth();
+ }
+ if (class_exists('HVAC_Google_Sheets_Admin')) {
+ new HVAC_Google_Sheets_Admin();
+ }
+
+ // Initialize communication system
+ if (class_exists('HVAC_Communication_Installer')) {
+ HVAC_Communication_Installer::maybe_update();
+ }
+ if (class_exists('HVAC_Communication_Scheduler')) {
+ hvac_communication_scheduler();
+ }
+
+ // Initialize admin components
+ if (is_admin()) {
+ if (class_exists('HVAC_Zoho_Admin')) {
+ HVAC_Zoho_Admin::instance();
+ }
+ if (class_exists('HVAC_Admin_Dashboard')) {
+ new HVAC_Admin_Dashboard();
+ }
+ if (class_exists('HVAC_Enhanced_Settings')) {
+ HVAC_Enhanced_Settings::instance();
+ }
+ }
+ }
+
+ /**
+ * Plugins loaded hook
+ *
+ * @return void
+ */
+ public function plugins_loaded() {
+ // Load text domain
+ load_plugin_textdomain('hvac-community-events', false, dirname(HVAC_PLUGIN_BASENAME) . '/languages');
+ }
+
+ /**
+ * Admin init hook
+ *
+ * @return void
+ */
+ public function admin_init() {
+ // Check for 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
+ *
+ * @return void
+ */
+ private function check_plugin_updates() {
+ $current_version = get_option('hvac_plugin_version', '0.0.0');
+
+ if (version_compare($current_version, HVAC_PLUGIN_VERSION, '<')) {
+ // Run upgrade routines
+ $this->upgrade($current_version);
+
+ // Update version
+ update_option('hvac_plugin_version', HVAC_PLUGIN_VERSION);
+ }
+ }
+
+ /**
+ * Run upgrade routines
+ *
+ * @param string $from_version Version upgrading from
+ * @return void
+ */
+ private function upgrade($from_version) {
+ HVAC_Logger::info("Upgrading from version {$from_version} to " . HVAC_PLUGIN_VERSION, 'Upgrade');
+
+ // 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
+ *
+ * @return void
+ */
+ public function ensure_registration_access() {
+ // If we're on the trainer registration page, don't apply any authentication checks
+ if (is_page('trainer/registration')) {
+ // Remove any potential authentication hooks that might be added by other code
+ remove_all_actions('template_redirect', 10);
+ }
+ }
+
+ /**
+ * Handle AJAX request for master dashboard events table
+ *
+ * @return void
+ */
+ public function ajax_master_dashboard_events() {
+ // Verify nonce
+ if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'hvac_master_dashboard_nonce')) {
+ wp_die('Security check failed');
+ }
+
+ // Check permissions
+ if (!current_user_can('view_master_dashboard') && !current_user_can('view_all_trainer_data') && !current_user_can('manage_options')) {
+ wp_send_json_error('Insufficient permissions');
+ }
+
+ // Load master dashboard data class if needed
+ if (!class_exists('HVAC_Master_Dashboard_Data')) {
+ $data_file = HVAC_PLUGIN_DIR . 'includes/class-hvac-master-dashboard-data.php';
+ if (file_exists($data_file)) {
+ require_once $data_file;
+ }
+ }
+
+ if (!class_exists('HVAC_Master_Dashboard_Data')) {
+ wp_send_json_error('Master dashboard data class not found');
+ }
+
+ // Initialize data handler
+ $master_data = new HVAC_Master_Dashboard_Data();
+
+ // Get table data with filters
+ $args = array(
+ 'status' => sanitize_text_field($_POST['status'] ?? 'all'),
+ 'search' => sanitize_text_field($_POST['search'] ?? ''),
+ 'orderby' => sanitize_text_field($_POST['orderby'] ?? 'date'),
+ 'order' => sanitize_text_field($_POST['order'] ?? 'DESC'),
+ 'page' => absint($_POST['page'] ?? 1),
+ 'per_page' => absint($_POST['per_page'] ?? 10),
+ 'date_from' => sanitize_text_field($_POST['date_from'] ?? ''),
+ 'date_to' => sanitize_text_field($_POST['date_to'] ?? ''),
+ 'trainer_id' => absint($_POST['trainer_id'] ?? 0),
+ );
+
+ $table_data = $master_data->get_events_table_data($args);
+ wp_send_json_success($table_data);
+ }
+}
\ No newline at end of file
diff --git a/includes/class-hvac-registration.php b/includes/class-hvac-registration.php
index 32262711..7525e7db 100644
--- a/includes/class-hvac-registration.php
+++ b/includes/class-hvac-registration.php
@@ -55,7 +55,7 @@ class HVAC_Registration {
$submitted_data = $transient_data['data'] ?? [];
// Delete the transient immediately after retrieving
delete_transient($transient_key);
- error_log('[HVAC REG DEBUG] render_registration_form: get_transient result: ' . print_r($transient_data, true));
+// error_log('[HVAC REG DEBUG] render_registration_form: get_transient result: ' . print_r($transient_data, true));
} else {
// Transient expired or invalid, show a generic error
@@ -74,7 +74,7 @@ class HVAC_Registration {
if (!empty($errors['transient'])) echo '
' . esc_html($errors['transient']) . '
';
// Nonce errors should ideally be caught in admin-post, but display if somehow set
if (!empty($errors['nonce'])) echo '
' . esc_html($errors['nonce']) . '
';
- error_log('[HVAC REG DEBUG] render_registration_form: Errors before display_form_html: ' . print_r($errors, true));
+// error_log('[HVAC REG DEBUG] render_registration_form: Errors before display_form_html: ' . print_r($errors, true));
if (!empty($errors['account'])) echo '
' . esc_html($errors['account']) . '
';
echo '
';
}
@@ -129,11 +129,11 @@ class HVAC_Registration {
}
}
- error_log('[HVAC REG DEBUG] process_registration_submission: Errors after validation merge: ' . print_r($errors, true));
+// error_log('[HVAC REG DEBUG] process_registration_submission: Errors after validation merge: ' . print_r($errors, true));
} else {
$errors['profile_image'] = 'There was an error uploading the profile image. Code: ' . $_FILES['profile_image']['error'];
- error_log('[HVAC REG DEBUG] process_registration_submission: Checking if errors is empty. Result: ' . (empty($errors) ? 'Yes' : 'No'));
+// error_log('[HVAC REG DEBUG] process_registration_submission: Checking if errors is empty. Result: ' . (empty($errors) ? 'Yes' : 'No'));
}
}
// --- End File Upload Handling ---
@@ -149,7 +149,7 @@ class HVAC_Registration {
if (is_wp_error($user_id)) {
$errors['account'] = $user_id->get_error_message();
- error_log('[HVAC REG DEBUG] Account creation WP_Error in admin-post: ' . $user_id->get_error_message());
+// error_log('[HVAC REG DEBUG] Account creation WP_Error in admin-post: ' . $user_id->get_error_message());
$this->redirect_with_errors($errors, $submitted_data, $registration_page_url);
// No need for return/exit here
} elseif ($user_id) {
@@ -177,7 +177,7 @@ class HVAC_Registration {
// No need for return/exit here
}
} else {
- error_log('[HVAC REG DEBUG] Validation errors found in admin-post: ' . print_r($errors, true));
+// error_log('[HVAC REG DEBUG] Validation errors found in admin-post: ' . print_r($errors, true));
$this->redirect_with_errors($errors, $submitted_data, $registration_page_url);
// No need for return/exit here
}
@@ -185,7 +185,7 @@ class HVAC_Registration {
/**
* Helper function to store errors/data in transient and redirect back to the form page.
- error_log('[HVAC REG DEBUG] redirect_with_errors: Preparing transient. Key: ' . $transient_key . ' Data: ' . print_r($transient_data, true));
+// error_log('[HVAC REG DEBUG] redirect_with_errors: Preparing transient. Key: ' . $transient_key . ' Data: ' . print_r($transient_data, true));
*
* @param array $errors Array of error messages.
* @param array $data Submitted form data.
@@ -223,8 +223,21 @@ class HVAC_Registration {