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