• Add user role field to registration, profile display, and profile edit - 10 role options: technician, installer, supervisor, manager, trainer, consultant, sales rep, engineer, business owner, other - Required field with server-side validation - Radio buttons in registration, dropdown in profile edit - Displays in profile with proper capitalization • Implement advanced certification tracking system - Date Certified: HTML5 date picker with validation (no future dates) - Certification Type: dropdown with "Certified measureQuick Trainer" and "Certified measureQuick Champion" - Certification Status: color-coded status badges (Active/Expired/Pending/Disabled) • Add sophisticated role-based access control - Regular trainers: read-only access to certification fields - Administrators & master trainers: full edit access to certification fields - Visual indicators for read-only fields - Server-side permission validation • Enhance plugin activation system - Initialize all 36 user meta fields for existing users - Smart default assignment based on user capabilities - Backward compatibility maintained • Add professional UI styling - Blue-bordered certification section with trophy icon - Color-coded status badges with proper contrast - Read-only field styling with visual indicators - Enhanced form controls with focus states • Comprehensive testing and documentation - E2E test coverage with visual verification - Updated API reference with new meta fields - Access control patterns documented - 100% test pass rate on staging environment 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
554 lines
No EOL
19 KiB
PHP
554 lines
No EOL
19 KiB
PHP
<?php
|
|
/**
|
|
* Page Manager for HVAC Community Events
|
|
*
|
|
* Handles creation and management of plugin pages following WordPress best practices
|
|
*
|
|
* @package HVAC_Community_Events
|
|
* @since 1.0.0
|
|
*/
|
|
|
|
if (!defined('ABSPATH')) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* HVAC_Page_Manager class
|
|
*/
|
|
class HVAC_Page_Manager {
|
|
|
|
/**
|
|
* Page definitions
|
|
*
|
|
* @var array
|
|
*/
|
|
private static $pages = [
|
|
// Public pages
|
|
'training-login' => [
|
|
'title' => 'Trainer Login',
|
|
'template' => 'page-trainer-login.php',
|
|
'public' => true,
|
|
'parent' => null,
|
|
'capability' => null
|
|
],
|
|
|
|
// Trainer pages
|
|
'trainer' => [
|
|
'title' => 'Trainer',
|
|
'template' => null,
|
|
'public' => false,
|
|
'parent' => null,
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/dashboard' => [
|
|
'title' => 'Trainer Dashboard',
|
|
'template' => 'page-trainer-dashboard.php',
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/registration' => [
|
|
'title' => 'Trainer Registration',
|
|
'template' => 'page-trainer-registration.php',
|
|
'public' => true,
|
|
'parent' => 'trainer',
|
|
'capability' => null
|
|
],
|
|
'trainer/my-profile' => [
|
|
'title' => 'Trainer Profile',
|
|
'template' => 'page-trainer-profile.php',
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
|
|
// New trainer profile pages
|
|
'trainer/profile' => [
|
|
'title' => 'Personal Profile',
|
|
'template' => 'page-trainer-profile.php',
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/profile/edit' => [
|
|
'title' => 'Edit Profile',
|
|
'template' => 'page-trainer-profile-edit.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/profile',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
|
|
// Venue management pages
|
|
'trainer/venue' => [
|
|
'title' => 'Venues',
|
|
'template' => null,
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/venue/list' => [
|
|
'title' => 'Training Venues',
|
|
'template' => 'page-trainer-venues-list.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/venue',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/venue/manage' => [
|
|
'title' => 'Manage Venue',
|
|
'template' => 'page-trainer-venue-manage.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/venue',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
|
|
// Organizer management pages
|
|
'trainer/organizer' => [
|
|
'title' => 'Organizers',
|
|
'template' => null,
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/organizer/list' => [
|
|
'title' => 'Training Organizers',
|
|
'template' => 'page-trainer-organizers-list.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/organizer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/organizer/manage' => [
|
|
'title' => 'Manage Organizer',
|
|
'template' => 'page-trainer-organizer-manage.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/organizer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/event' => [
|
|
'title' => 'Event',
|
|
'template' => null,
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/event/manage' => [
|
|
'title' => 'Manage Event',
|
|
'template' => 'page-manage-event.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/event',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/event/summary' => [
|
|
'title' => 'Event Summary',
|
|
'template' => 'page-event-summary.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/event',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
|
|
// Status pages
|
|
'trainer-account-pending' => [
|
|
'title' => 'Account Pending Approval',
|
|
'template' => 'status/trainer-account-pending.php',
|
|
'public' => false,
|
|
'parent' => null,
|
|
'capability' => 'read',
|
|
'content_file' => 'content/trainer-account-pending.html'
|
|
],
|
|
'trainer-account-disabled' => [
|
|
'title' => 'Account Access Restricted',
|
|
'template' => 'status/trainer-account-disabled.php',
|
|
'public' => false,
|
|
'parent' => null,
|
|
'capability' => 'read',
|
|
'content_file' => 'content/trainer-account-disabled.html'
|
|
],
|
|
|
|
// Certificate pages
|
|
'trainer/certificate-reports' => [
|
|
'title' => 'Certificate Reports',
|
|
'template' => 'page-certificate-reports.php',
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/generate-certificates' => [
|
|
'title' => 'Generate Certificates',
|
|
'template' => 'page-generate-certificates.php',
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
|
|
// Communication pages
|
|
'trainer/email-attendees' => [
|
|
'title' => 'Email Attendees',
|
|
'template' => 'page-email-attendees.php',
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/communication-templates' => [
|
|
'title' => 'Communication Templates',
|
|
'template' => 'page-communication-templates.php',
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/communication-schedules' => [
|
|
'title' => 'Communication Schedules',
|
|
'template' => 'page-communication-schedules.php',
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
|
|
// Master trainer pages
|
|
'master-trainer' => [
|
|
'title' => 'Master Trainer',
|
|
'template' => null,
|
|
'public' => false,
|
|
'parent' => null,
|
|
'capability' => 'hvac_master_trainer'
|
|
],
|
|
'master-trainer/dashboard' => [
|
|
'title' => 'Master Dashboard',
|
|
'template' => 'page-master-dashboard.php',
|
|
'public' => false,
|
|
'parent' => 'master-trainer',
|
|
'capability' => 'hvac_master_trainer'
|
|
],
|
|
'master-trainer/master-dashboard' => [
|
|
'title' => 'Master Dashboard',
|
|
'template' => 'page-master-dashboard.php',
|
|
'public' => false,
|
|
'parent' => 'master-trainer',
|
|
'capability' => 'hvac_master_trainer'
|
|
],
|
|
'master-trainer/certificate-fix' => [
|
|
'title' => 'Certificate System Diagnostics',
|
|
'template' => 'page-certificate-fix.php',
|
|
'public' => false,
|
|
'parent' => 'master-trainer',
|
|
'capability' => 'hvac_master_trainer'
|
|
],
|
|
'master-trainer/google-sheets' => [
|
|
'title' => 'Google Sheets Integration',
|
|
'template' => 'page-google-sheets.php',
|
|
'public' => false,
|
|
'parent' => 'master-trainer',
|
|
'capability' => 'hvac_master_trainer'
|
|
],
|
|
'master-trainer/master-dashboard' => [
|
|
'title' => 'Master Dashboard',
|
|
'template' => 'page-master-dashboard.php',
|
|
'public' => false,
|
|
'parent' => 'master-trainer',
|
|
'capability' => 'hvac_master_trainer'
|
|
],
|
|
|
|
// Trainer Profile pages
|
|
'trainer/profile' => [
|
|
'title' => 'Personal Profile',
|
|
'template' => 'page-trainer-profile.php',
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/profile/edit' => [
|
|
'title' => 'Edit Profile',
|
|
'template' => 'page-trainer-profile-edit.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/profile',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
|
|
// Venue pages
|
|
'trainer/venue' => [
|
|
'title' => 'Venues',
|
|
'template' => null,
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/venue/list' => [
|
|
'title' => 'Training Venues',
|
|
'template' => 'page-trainer-venues-list.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/venue',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/venue/manage' => [
|
|
'title' => 'Manage Venue',
|
|
'template' => 'page-trainer-venue-manage.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/venue',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
|
|
// Organizer pages
|
|
'trainer/organizer' => [
|
|
'title' => 'Organizers',
|
|
'template' => null,
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/organizer/list' => [
|
|
'title' => 'Training Organizers',
|
|
'template' => 'page-trainer-organizers-list.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/organizer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/organizer/manage' => [
|
|
'title' => 'Manage Organizer',
|
|
'template' => 'page-trainer-organizer-manage.php',
|
|
'public' => false,
|
|
'parent' => 'trainer/organizer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
|
|
// Other pages
|
|
'trainer/documentation' => [
|
|
'title' => 'Trainer Documentation',
|
|
'template' => 'page-documentation.php',
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'trainer/attendee-profile' => [
|
|
'title' => 'Attendee Profile',
|
|
'template' => 'page-attendee-profile.php',
|
|
'public' => false,
|
|
'parent' => 'trainer',
|
|
'capability' => 'hvac_trainer'
|
|
],
|
|
'registration-pending' => [
|
|
'title' => 'Registration Pending',
|
|
'template' => 'page-registration-pending.php',
|
|
'public' => false,
|
|
'parent' => null,
|
|
'capability' => null,
|
|
'content_file' => 'content/registration-pending.html'
|
|
]
|
|
];
|
|
|
|
/**
|
|
* Create all required pages
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function create_pages() {
|
|
HVAC_Logger::info('Starting page creation process', 'Page Manager');
|
|
|
|
foreach (self::$pages as $slug => $config) {
|
|
self::create_page($slug, $config);
|
|
}
|
|
|
|
// Flush rewrite rules after creating all pages
|
|
flush_rewrite_rules();
|
|
HVAC_Logger::info('Completed page creation process', 'Page Manager');
|
|
}
|
|
|
|
/**
|
|
* Create a single page
|
|
*
|
|
* @param string $slug Page slug
|
|
* @param array $config Page configuration
|
|
* @return int|false Page ID or false on failure
|
|
*/
|
|
private static function create_page($slug, $config) {
|
|
// Check if page already exists
|
|
$existing_page = get_page_by_path($slug);
|
|
if ($existing_page) {
|
|
HVAC_Logger::info("Page already exists: {$slug}", 'Page Manager');
|
|
return $existing_page->ID;
|
|
}
|
|
|
|
// Prepare page data
|
|
$page_data = [
|
|
'post_title' => $config['title'],
|
|
'post_name' => basename($slug),
|
|
'post_content' => self::get_page_content($slug, $config),
|
|
'post_status' => 'publish',
|
|
'post_type' => 'page',
|
|
'post_author' => 1,
|
|
'comment_status' => 'closed',
|
|
'ping_status' => 'closed'
|
|
];
|
|
|
|
// Set parent page if specified
|
|
if (!empty($config['parent'])) {
|
|
$parent_page = get_page_by_path($config['parent']);
|
|
if ($parent_page) {
|
|
$page_data['post_parent'] = $parent_page->ID;
|
|
}
|
|
}
|
|
|
|
// Create the page
|
|
$page_id = wp_insert_post($page_data);
|
|
|
|
if (is_wp_error($page_id)) {
|
|
HVAC_Logger::error("Failed to create page: {$slug} - " . $page_id->get_error_message(), 'Page Manager');
|
|
return false;
|
|
}
|
|
|
|
// Set page template if specified
|
|
if (!empty($config['template'])) {
|
|
update_post_meta($page_id, '_wp_page_template', $config['template']);
|
|
}
|
|
|
|
// Set Astra theme layout to full-width for all HVAC pages
|
|
update_post_meta($page_id, 'ast-site-content-layout', 'page-builder');
|
|
update_post_meta($page_id, 'site-post-title', 'disabled');
|
|
update_post_meta($page_id, 'site-sidebar-layout', 'no-sidebar');
|
|
update_post_meta($page_id, 'theme-transparent-header-meta', 'disabled');
|
|
|
|
// Set page capabilities if specified
|
|
if (!empty($config['capability'])) {
|
|
update_post_meta($page_id, '_hvac_required_capability', $config['capability']);
|
|
}
|
|
|
|
HVAC_Logger::info("Created page: {$slug} (ID: {$page_id})", 'Page Manager');
|
|
return $page_id;
|
|
}
|
|
|
|
/**
|
|
* Get page content
|
|
*
|
|
* @param string $slug Page slug
|
|
* @param array $config Page configuration
|
|
* @return string Page content
|
|
*/
|
|
private static function get_page_content($slug, $config) {
|
|
// If content file is specified, load it
|
|
if (!empty($config['content_file'])) {
|
|
$content_path = HVAC_PLUGIN_DIR . 'templates/' . $config['content_file'];
|
|
if (file_exists($content_path)) {
|
|
$content = file_get_contents($content_path);
|
|
|
|
// Replace placeholders
|
|
$replacements = [
|
|
'{home_url}' => home_url(),
|
|
'{logout_url}' => wp_logout_url(home_url()),
|
|
'{login_url}' => home_url('/training-login/'),
|
|
'{site_name}' => get_bloginfo('name'),
|
|
'{support_email}' => get_option('hvac_support_email', 'support@upskillevents.com')
|
|
];
|
|
|
|
$content = str_replace(array_keys($replacements), array_values($replacements), $content);
|
|
|
|
return $content;
|
|
}
|
|
}
|
|
|
|
// Define shortcode mappings for specific pages
|
|
$shortcode_mappings = [
|
|
'trainer/profile' => '[hvac_trainer_profile_view]',
|
|
'trainer/profile/edit' => '[hvac_trainer_profile_edit]',
|
|
'trainer/venue/list' => '[hvac_trainer_venues_list]',
|
|
'trainer/venue/manage' => '[hvac_trainer_venue_manage]',
|
|
'trainer/organizer/list' => '[hvac_trainer_organizers_list]',
|
|
'trainer/organizer/manage' => '[hvac_trainer_organizer_manage]',
|
|
'trainer/certificate-reports' => '[hvac_certificate_reports]',
|
|
'trainer/generate-certificates' => '[hvac_generate_certificates]'
|
|
];
|
|
|
|
// Return shortcode if mapped
|
|
if (isset($shortcode_mappings[$slug])) {
|
|
return $shortcode_mappings[$slug];
|
|
}
|
|
|
|
// For pages with templates, use a placeholder
|
|
if (!empty($config['template'])) {
|
|
return '<!-- This page uses a custom template -->';
|
|
}
|
|
|
|
// Default content for parent pages
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Get page definition by slug
|
|
*
|
|
* @param string $slug Page slug
|
|
* @return array|null Page configuration or null if not found
|
|
*/
|
|
public static function get_page_config($slug) {
|
|
return isset(self::$pages[$slug]) ? self::$pages[$slug] : null;
|
|
}
|
|
|
|
/**
|
|
* Check if a page requires authentication
|
|
*
|
|
* @param string $slug Page slug
|
|
* @return bool
|
|
*/
|
|
public static function requires_auth($slug) {
|
|
$config = self::get_page_config($slug);
|
|
return $config && !empty($config['capability']);
|
|
}
|
|
|
|
/**
|
|
* Get required capability for a page
|
|
*
|
|
* @param string $slug Page slug
|
|
* @return string|null Required capability or null if none
|
|
*/
|
|
public static function get_required_capability($slug) {
|
|
$config = self::get_page_config($slug);
|
|
return $config ? $config['capability'] : null;
|
|
}
|
|
|
|
/**
|
|
* Delete all plugin pages
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function delete_pages() {
|
|
HVAC_Logger::info('Starting page deletion process', 'Page Manager');
|
|
|
|
foreach (self::$pages as $slug => $config) {
|
|
$page = get_page_by_path($slug);
|
|
if ($page) {
|
|
wp_delete_post($page->ID, true);
|
|
HVAC_Logger::info("Deleted page: {$slug}", 'Page Manager');
|
|
}
|
|
}
|
|
|
|
HVAC_Logger::info('Completed page deletion process', 'Page Manager');
|
|
}
|
|
|
|
/**
|
|
* Update all existing pages with proper layout settings
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function update_existing_page_layouts() {
|
|
HVAC_Logger::info('Updating page layouts and templates', 'Page Manager');
|
|
|
|
foreach (self::$pages as $slug => $config) {
|
|
$page = get_page_by_path($slug);
|
|
if ($page) {
|
|
// Update page template if specified
|
|
if (!empty($config['template'])) {
|
|
$current_template = get_post_meta($page->ID, '_wp_page_template', true);
|
|
if ($current_template !== $config['template']) {
|
|
update_post_meta($page->ID, '_wp_page_template', $config['template']);
|
|
HVAC_Logger::info("Updated template for page {$slug}: {$config['template']}", 'Page Manager');
|
|
}
|
|
}
|
|
|
|
// Set Astra theme layout to full-width
|
|
update_post_meta($page->ID, 'ast-site-content-layout', 'page-builder');
|
|
update_post_meta($page->ID, 'site-post-title', 'disabled');
|
|
update_post_meta($page->ID, 'site-sidebar-layout', 'no-sidebar');
|
|
update_post_meta($page->ID, 'theme-transparent-header-meta', 'disabled');
|
|
|
|
HVAC_Logger::info("Updated layout settings for page: {$slug}", 'Page Manager');
|
|
}
|
|
}
|
|
|
|
HVAC_Logger::info('Completed page layout and template updates', 'Page Manager');
|
|
}
|
|
} |