# HVAC Plugin API Reference ## Table of Contents - [PHP Classes](#php-classes) - [JavaScript APIs](#javascript-apis) - [WordPress Hooks](#wordpress-hooks) - [AJAX Endpoints](#ajax-endpoints) - [Shortcodes](#shortcodes) - [Database Schema](#database-schema) ## PHP Classes ### HVAC_Plugin Main plugin initialization class. ```php class HVAC_Plugin { /** * Get plugin instance (Singleton) * @return HVAC_Plugin */ public static function instance() /** * Initialize plugin components * @return void */ public function init() } ``` ### HVAC_Event_Manager Manages event creation and manipulation. ```php class HVAC_Event_Manager { /** * Create a new event * @param array $event_data Event information * @return int|WP_Error Event ID or error */ public static function create_event($event_data) /** * Get trainer events * @param int $trainer_id Trainer user ID * @param array $args Query arguments * @return array Array of event objects */ public static function get_trainer_events($trainer_id, $args = array()) /** * Update event * @param int $event_id Event ID * @param array $data Event data to update * @return bool Success status */ public static function update_event($event_id, $data) } ``` ### HVAC_Certificate_Generator Handles PDF certificate generation. ```php class HVAC_Certificate_Generator { /** * Generate certificate for attendee * @param int $event_id Event ID * @param array $attendee Attendee data * @return string|WP_Error PDF file path or error */ public function generate_certificate($event_id, $attendee) /** * Generate bulk certificates * @param int $event_id Event ID * @param array $attendees Array of attendee data * @return array Results array with successes and failures */ public function generate_bulk_certificates($event_id, $attendees) } ``` ### HVAC_Trainer_Profile Manages trainer profile functionality. ```php class HVAC_Trainer_Profile { /** * Get trainer profile data * @param int $trainer_id User ID * @return array Profile data */ public static function get_profile($trainer_id) /** * Update trainer profile * @param int $trainer_id User ID * @param array $data Profile data * @return bool Success status */ public static function update_profile($trainer_id, $data) /** * Get trainer statistics * @param int $trainer_id User ID * @return array Statistics data */ public static function get_statistics($trainer_id) } ``` ### HVAC_Dashboard_Data Handles dashboard data retrieval with caching support. ```php class HVAC_Dashboard_Data { /** * Constructor * @param int $user_id Trainer user ID */ public function __construct($user_id) /** * Get total events count (cached 1 hour) * @return int Event count */ public function get_total_events_count() /** * Get upcoming events count (cached 15 minutes) * @return int Event count */ public function get_upcoming_events_count() /** * Get past events count (cached 1 hour) * @return int Event count */ public function get_past_events_count() /** * Get total tickets sold (cached 30 minutes) * @return int Ticket count */ public function get_total_tickets_sold() /** * Get total revenue (cached 30 minutes) * @return float Revenue amount */ public function get_total_revenue() /** * Clear all cached data for this user * @return void */ public function clear_cache() /** * Get paginated events table data * @param array $args Query arguments * @return array Events and pagination data */ public function get_events_table_data($args) } ``` ### HVAC_Menu_System Handles navigation menu rendering. ```php class HVAC_Menu_System { /** * Render trainer navigation menu * @return void Outputs HTML */ public function render_trainer_menu() /** * Get menu structure for current user * @return array Menu items array */ private function get_menu_structure() } ``` ## JavaScript APIs ### Global Objects ```javascript // Main HVAC object window.HVAC = { // Initialize components init: function() {}, // Event management events: { create: function(data) {}, update: function(eventId, data) {}, delete: function(eventId) {} }, // Profile management profile: { load: function(userId) {}, save: function(data) {}, uploadPhoto: function(file) {} }, // Utilities utils: { showMessage: function(message, type) {}, confirm: function(message, callback) {}, formatDate: function(date) {} } }; // AJAX helper window.hvacAjax = { post: function(action, data, success, error) {}, get: function(action, data, success, error) {} }; ``` ### jQuery Plugins ```javascript // Dashboard initialization jQuery(document).ready(function($) { // Initialize date pickers $('.hvac-datepicker').datepicker({ dateFormat: 'yy-mm-dd' }); // Initialize form validation $('.hvac-form').validate({ rules: { event_title: 'required', event_date: 'required' } }); }); ``` ## WordPress Hooks ### Actions ```php // Plugin lifecycle do_action('hvac_plugin_activated'); do_action('hvac_plugin_deactivated'); do_action('hvac_plugin_updated', $old_version, $new_version); // Page creation do_action('hvac_before_create_pages'); do_action('hvac_after_create_pages', $page_ids); // Event management do_action('hvac_before_event_save', $event_data); do_action('hvac_after_event_save', $event_id, $event_data); do_action('hvac_event_deleted', $event_id); // Certificate generation do_action('hvac_before_certificate_generate', $event_id, $attendee); do_action('hvac_after_certificate_generate', $certificate_path); // User profile do_action('hvac_profile_updated', $user_id, $profile_data); do_action('hvac_trainer_registered', $user_id); ``` ### Filters ```php // Capability checks apply_filters('hvac_user_can_manage_event', $can_manage, $user_id, $event_id); apply_filters('hvac_user_can_generate_certificates', $can_generate, $user_id); // Data manipulation apply_filters('hvac_event_data', $event_data, $event_id); apply_filters('hvac_certificate_data', $certificate_data, $event_id, $attendee); apply_filters('hvac_profile_fields', $fields, $user_id); // Display filters apply_filters('hvac_menu_items', $menu_items, $user_role); apply_filters('hvac_dashboard_widgets', $widgets, $user_id); apply_filters('hvac_date_format', $format); // Query filters apply_filters('hvac_events_query_args', $args, $context); apply_filters('hvac_trainers_query_args', $args); ``` ## Template System ### HVAC_Community_Events Template Loading The plugin uses a custom template loading system via the `template_include` filter. ```php class HVAC_Community_Events { /** * Load custom templates for HVAC pages * @param string $template Current template path * @return string Modified template path */ public function load_custom_templates($template) } ``` **Template Mappings:** ```php // Certificate pages use full page templates 'trainer/certificate-reports' => 'templates/page-certificate-reports.php' 'trainer/generate-certificates' => 'templates/page-generate-certificates.php' // Dashboard pages 'trainer/dashboard' => 'templates/template-hvac-dashboard.php' 'master-trainer/master-dashboard' => 'templates/template-hvac-master-dashboard.php' // Other pages 'trainer/event/manage' => 'templates/page-manage-event.php' // Event management with creation guide 'trainer/profile' => 'templates/page-trainer-profile.php' ``` **Template Structure Requirements:** All HVAC page templates must include: ```php // Define constant to indicate page template context define('HVAC_IN_PAGE_TEMPLATE', true); get_header(); // Required: WordPress header ?>
render_trainer_menu(); } // Breadcrumbs if (class_exists('HVAC_Breadcrumbs')) { echo HVAC_Breadcrumbs::instance()->render_breadcrumbs(); } ?>
Full announcement content with HTML formatting

", "date": "August 20, 2025", "author": "Admin Name" } } ``` **Security Features:** - Uses separate `hvac_announcements_nonce` to avoid conflicts with other AJAX objects - Rate limiting: 30 requests per minute per user - Permission checks: Only authenticated trainers can view announcements - Content sanitization: All output properly escaped and filtered ### Certificate Generation ```javascript // Generate single certificate { action: 'hvac_generate_certificate', nonce: hvac_ajax.nonce, event_id: 456, attendee_id: 789 } // Generate bulk certificates { action: 'hvac_generate_bulk_certificates', nonce: hvac_ajax.nonce, event_id: 456, attendee_ids: [789, 790, 791] } ``` ## Shortcodes ### Display Shortcodes ```php // Trainer dashboard [hvac_trainer_dashboard] // Event list [hvac_event_list trainer_id="123" limit="10" status="upcoming"] // Profile view [hvac_trainer_profile_view user_id="123"] // Profile edit form [hvac_trainer_profile_edit] // Certificate reports [hvac_certificate_reports] // Event creation form [hvac_event_form] // Venue management [hvac_venue_list] [hvac_venue_form] // Organizer management [hvac_organizer_list] [hvac_organizer_form] ``` ### Shortcode Parameters ```php // Event list parameters [hvac_event_list trainer_id="" // Trainer ID (default: current user) limit="10" // Number of events status="upcoming" // upcoming|past|all orderby="date" // date|title|capacity order="ASC" // ASC|DESC ] // Profile view parameters [hvac_trainer_profile_view user_id="" // User ID (default: current user) show_stats="true" // Show statistics show_events="true" // Show event list ] ``` ## Database Schema ### Post Meta (Events) ```sql -- Event-specific meta keys _EventStartDate -- Event start datetime _EventEndDate -- Event end datetime _EventVenueID -- Venue post ID _EventOrganizerID -- Organizer post ID _EventTrainerID -- Trainer user ID _EventCapacity -- Maximum attendees _EventRegisteredCount -- Current registration count _EventCertificateTemplate -- Certificate template ID ``` ### User Meta (Trainers) ```sql -- Profile information role -- User's HVAC industry role (technician, installer, etc.) hvac_bio -- Trainer biography hvac_certifications -- Serialized array of certifications hvac_trainer_photo -- Attachment ID of profile photo hvac_website -- Trainer website URL hvac_location -- Trainer location hvac_phone -- Contact phone -- Certification information (admin/master trainer editable only) date_certified -- Date when trainer was certified (YYYY-MM-DD) certification_type -- Type of certification ('Certified measureQuick Trainer', 'Certified measureQuick Champion') certification_status -- Current certification status ('Active', 'Expired', 'Pending', 'Disabled') -- Training preferences hvac_training_formats -- Serialized array of formats hvac_training_audience -- Target audience hvac_training_topics -- Specialized topics -- Statistics (cached) hvac_total_events -- Total events created hvac_total_students -- Total students trained hvac_total_revenue -- Total revenue generated ``` ### Options Table ```sql -- Plugin settings hvac_plugin_version -- Current plugin version hvac_settings -- Serialized settings array hvac_email_templates -- Email template configurations hvac_certificate_settings -- Certificate generation settings -- Feature flags hvac_enable_zoho -- Zoho CRM integration hvac_enable_analytics -- Analytics tracking hvac_maintenance_mode -- Maintenance mode flag ``` ## Manual Geocoding API Endpoints ### Trigger Manual Geocoding **Endpoint**: `hvac_trigger_geocoding` **Method**: POST (AJAX) **Permissions**: `hvac_master_trainer` or `administrator` Manually triggers geocoding for all trainer profiles using Google Maps API. **Parameters**: None (uses AJAX nonce for security) **Response**: ```json { "success": true, "data": { "total_profiles": 53, "geocoded_count": 45, "skipped_count": 7, "error_count": 1, "api_key_valid": true, "start_time": "2025-08-01 20:34:36", "end_time": "2025-08-01 20:34:36", "duration": 21600, "details": [ { "id": 5868, "title": "William Ramsey - Trainer Profile", "status": "already_geocoded", "coordinates": {"lat": 33.9532531, "lng": -84.5499358} } ] } } ``` **Status Values**: - `geocoded` - Successfully geocoded in this operation - `already_geocoded` - Profile already has valid coordinates - `no_address` - Profile missing location data - `error` - Geocoding failed with error - `failed` - Google Maps API returned no results ### Enhanced CSV Import **Endpoint**: `hvac_run_enhanced_import` **Method**: POST (AJAX) **Permissions**: `hvac_master_trainer` or `administrator` Imports trainer location data from embedded CSV data with field mapping. **Parameters**: None (uses embedded CSV data) **Response**: ```json { "success": true, "data": { "total_rows": 43, "users_created": 0, "users_updated": 43, "profiles_created": 0, "profiles_updated": 43, "errors": 0, "geocoding_scheduled": 43, "session_id": "enhanced_2025-08-02_02-33-53", "import_log_saved": true, "start_time": "2025-08-01 19:12:36", "end_time": "2025-08-01 19:12:36", "duration": 0 } } ``` ### Get Geocoding Statistics **Endpoint**: `hvac_get_geocoding_stats` **Method**: POST (AJAX) **Permissions**: `hvac_trainer`, `hvac_master_trainer`, or `administrator` Retrieves current geocoding coverage and statistics. **Parameters**: None **Response**: ```json { "success": true, "data": { "total_profiles": "53", "geocoded_profiles": "45", "public_profiles": "53", "sync_issues": 0 } } ``` ## Trainer Profile Sharing API ### HVAC_QR_Generator Class Handles QR code generation and profile sharing functionality. ```php class HVAC_QR_Generator { /** * Generate QR code URL using QR Server API * @param string $data Data to encode in QR code * @param int $size QR code size in pixels (default: 200) * @param string $error_correction Error correction level (L, M, Q, H) * @return string QR code image URL */ public function generate_qr_url($data, $size = 200, $error_correction = 'M') /** * Generate QR code for trainer profile * @param int $profile_id Trainer profile ID * @param int $size QR code size in pixels * @return string|false QR code URL or false on error */ public function generate_trainer_profile_qr($profile_id, $size = 200) /** * Get shareable trainer profile URL * @param int $profile_id Trainer profile ID * @return string|false Profile URL or false on error */ public function get_trainer_profile_share_url($profile_id) /** * Get trainer profile data for sharing * @param int $profile_id Trainer profile ID * @return array|false Profile data or false on error */ public function get_trainer_share_data($profile_id) /** * Generate profile card HTML for sharing * @param int $profile_id Trainer profile ID * @param array $options Display options * @return string|false HTML content or false on error */ public function generate_profile_card_html($profile_id, $options = []) } ``` ### Profile Sharing AJAX Endpoint #### `hvac_get_profile_share_data` **Description:** Retrieve trainer profile sharing data including QR code URL **Method:** POST **Permissions:** Any logged-in user **Nonce:** `hvac_profile_sharing` **Request:** ```javascript jQuery.post(hvac_sharing.ajax_url, { action: 'hvac_get_profile_share_data', profile_id: 5840, nonce: hvac_sharing.nonce }); ``` **Response:** ```json { "success": true, "data": { "profile_id": 5840, "user_id": 123, "trainer_name": "John Smith", "business_name": "HVAC Pro Services", "trainer_city": "Atlanta", "trainer_state": "GA", "certification_type": "Certified measureQuick Trainer", "profile_image": "https://example.com/uploads/profile.jpg", "share_url": "https://example.com/find-a-trainer/profile/5840/", "qr_code_url": "https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=https%3A//example.com/find-a-trainer/profile/5840/&ecc=M" } } ``` **QR Code API Details:** - **Service:** QR Server API (https://api.qrserver.com/v1/create-qr-code/) - **Format:** PNG image - **Default Size:** 200x200 pixels - **Error Correction:** M (Medium, ~15% damage recovery) - **Encoding:** URL-encoded profile share URL **Share URL Structure:** - **Pattern:** `/find-a-trainer/profile/{profile_id}/` - **Rewrite Rule:** `^find-a-trainer/profile/([0-9]+)/?$` - **Query Var:** `trainer_profile_id` - **Requirements:** Must include trailing slash for WordPress rewrite rules **JavaScript Integration:** ```javascript // Profile sharing object var ProfileSharing = { // Open share modal openShareModal: function(profileId) {}, // Load share data via AJAX loadShareData: function(profileId) {}, // Create profile card HTML createProfileCardHtml: function(data) {}, // Copy URL to clipboard copyShareUrl: function() {} }; // Localized variables required hvac_sharing.ajax_url // WordPress AJAX URL hvac_sharing.nonce // Security nonce hvac_sharing.strings // UI messages ``` **Profile Card Features:** - Professional trainer photo or initial placeholder - measureQuick certification badge overlay - Business name and location display - QR code for instant sharing - Responsive design (600x300px default) - Professional styling with rounded corners ## Error Codes ### Geocoding Errors - `GEOCODING_INVALID_NONCE` - Security nonce verification failed - `GEOCODING_INSUFFICIENT_PERMISSIONS` - User lacks required capabilities - `GEOCODING_API_KEY_INVALID` - Google Maps API key missing or invalid - `GEOCODING_NO_PROFILES` - No trainer profiles found to geocode - `GEOCODING_ADDRESS_FAILED` - Address could not be geocoded - `GEOCODING_API_ERROR` - Google Maps API returned an error ### CSV Import Errors - `IMPORT_INVALID_NONCE` - Security nonce verification failed - `IMPORT_INSUFFICIENT_PERMISSIONS` - User lacks required capabilities - `IMPORT_NO_DATA` - No CSV data available to import - `IMPORT_USER_NOT_FOUND` - CSV email doesn't match any WordPress user - `IMPORT_PROFILE_NOT_FOUND` - User doesn't have a trainer profile - `IMPORT_UPDATE_FAILED` - Failed to update profile metadata ### Event Errors - `HVAC001` - Invalid event data - `HVAC002` - Event not found - `HVAC003` - Insufficient permissions to manage event - `HVAC004` - Event capacity exceeded ### User Errors - `HVAC101` - User not found - `HVAC102` - Invalid user role - `HVAC103` - Insufficient permissions - `HVAC104` - Profile update failed ### Certificate Errors - `HVAC201` - Certificate generation failed - `HVAC202` - Invalid attendee data - `HVAC203` - Template not found - `HVAC204` - PDF library error ### System Errors - `HVAC901` - Database connection error - `HVAC902` - File system error - `HVAC903` - Third-party API error - `HVAC904` - Unknown error ## Response Formats ### Success Response ```json { "success": true, "data": { "id": 123, "message": "Operation completed successfully", "additional_data": {} } } ``` ### Error Response ```json { "success": false, "data": { "code": "HVAC001", "message": "Invalid event data", "details": { "field": "event_date", "error": "Date must be in the future" } } } ```