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:
bengizmo 2025-07-28 18:04:48 -03:00
parent a58ea1603c
commit 005a35d89e
6 changed files with 1249 additions and 246 deletions

View 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

View file

@ -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
/** /**

View file

@ -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

View 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;
}
}

View 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;
}
}

View 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();
}
}