upskill-event-manager/docs/TRAINER-API-REFERENCE.md
bengizmo 705e6b563c feat: Implement Training Leads system and restructure navigation menu
- Add comprehensive Training Leads system for HVAC trainers
  * New /trainer/training-leads/ page with tabular contact submission display
  * HVAC_Training_Leads class with AJAX status updates and filtering
  * Empty state messaging and profile sharing CTA
  * Database integration with existing contact forms system

- Restructure trainer navigation menu for better UX
  * Rename "Customize" to "Profile" with logical groupings
  * Move "Logout" under "Profile" submenu
  * Change "Personal Profile" to "Trainer Profile"
  * Add "Training Leads" under Profile section
  * Update help menu to show only question mark icon positioned far right

- Enhance documentation system
  * Fix /trainer/documentation/ page styling and navigation integration
  * Update content to reflect current platform features
  * Add Training Leads documentation and navigation guide
  * Implement proper WordPress template structure

- Update user management
  * Change joe@upskillhvac.com display name to "Joe Medosch"
  * Assign Joe as author of measureQuick headquarters venue
  * Assign Joe as author of measureQuick and Upskill HVAC organizers

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-05 16:02:57 -03:00

1039 lines
No EOL
25 KiB
Markdown

# HVAC Trainer System API Reference
This document provides detailed API reference for developers working with the HVAC Trainer system, including PHP classes, JavaScript APIs, AJAX endpoints, and database schemas.
## Table of Contents
1. [PHP Classes](#php-classes)
2. [AJAX Endpoints](#ajax-endpoints)
3. [JavaScript APIs](#javascript-apis)
4. [Database Schema](#database-schema)
5. [Hooks & Filters](#hooks--filters)
6. [Constants & Configuration](#constants--configuration)
7. [Error Codes](#error-codes)
## PHP Classes
### HVAC_Trainer_Profile_Manager
**File**: `includes/class-hvac-trainer-profile-manager.php`
**Purpose**: Core trainer profile management functionality
#### Class Methods
##### `get_instance()`
Returns singleton instance of the profile manager.
```php
$manager = HVAC_Trainer_Profile_Manager::get_instance();
```
**Returns**: `HVAC_Trainer_Profile_Manager` - Singleton instance
##### `create_profile($data)`
Creates a new trainer profile.
```php
$profile_data = [
'trainer_first_name' => 'John',
'trainer_last_name' => 'Smith',
'trainer_city' => 'Chicago',
'trainer_state' => 'Illinois',
'user_id' => 123,
'certification_type' => 'Certified measureQuick Trainer'
];
$profile_id = $manager->create_profile($profile_data);
```
**Parameters**:
- `$data` (array) - Profile data array
**Returns**: `int|false` - Profile post ID on success, false on failure
**Data Fields**:
- `trainer_first_name` (string) - First name
- `trainer_last_name` (string) - Last name
- `trainer_display_name` (string) - Display name
- `trainer_city` (string) - City
- `trainer_state` (string) - State/Province
- `trainer_country` (string) - Country
- `profile_image_url` (string) - Profile image URL
- `certification_type` (string) - Certification level
- `user_id` (int) - WordPress user ID
- `is_public_profile` (string) - Public visibility ('1' or '0')
##### `update_profile($profile_id, $data)`
Updates an existing trainer profile.
```php
$updated_data = [
'trainer_city' => 'New York',
'trainer_state' => 'New York',
'certification_type' => 'Certified measureQuick Champion'
];
$success = $manager->update_profile(5840, $updated_data);
```
**Parameters**:
- `$profile_id` (int) - Profile post ID
- `$data` (array) - Updated profile data
**Returns**: `bool` - Success status
##### `get_profile($profile_id)`
Retrieves a trainer profile.
```php
$profile = $manager->get_profile(5840);
```
**Parameters**:
- `$profile_id` (int) - Profile post ID
**Returns**: `array|false` - Profile data array or false if not found
**Return Structure**:
```php
[
'profile_id' => 5840,
'user_id' => 31,
'name' => 'John Smith',
'city' => 'Chicago',
'state' => 'Illinois',
'certification_type' => 'Certified measureQuick Trainer',
'profile_image' => 'https://...',
'business_type' => 'Independent Contractor',
'event_count' => 5,
'training_formats' => 'In-Person, Virtual',
'training_locations' => 'On-site, Remote'
]
```
##### `get_public_profiles($args = [])`
Retrieves all public trainer profiles.
```php
$profiles = $manager->get_public_profiles([
'posts_per_page' => 20,
'meta_query' => [
[
'key' => 'trainer_state',
'value' => 'Illinois',
'compare' => '='
]
]
]);
```
**Parameters**:
- `$args` (array) - WP_Query arguments
**Returns**: `array` - Array of profile data
##### `delete_profile($profile_id)`
Deletes a trainer profile.
```php
$success = $manager->delete_profile(5840);
```
**Parameters**:
- `$profile_id` (int) - Profile post ID
**Returns**: `bool` - Success status
##### `migrate_certification_colors()`
Migrates existing profiles to add certification color fields.
```php
$manager->migrate_certification_colors();
```
**Returns**: `void`
##### `get_certification_color($certification_type)`
Gets the color code for a certification type.
```php
$color = $manager->get_certification_color('Certified measureQuick Trainer');
// Returns: '#5077bb'
```
**Parameters**:
- `$certification_type` (string) - Certification type
**Returns**: `string` - Hex color code
**Color Mapping**:
- `'Certified measureQuick Champion'``'#f19a42'`
- `'Certified measureQuick Trainer'``'#5077bb'`
- Default → `'#f0f7e8'`
### HVAC_Find_Trainer_Page
**File**: `includes/find-trainer/class-hvac-find-trainer-page.php`
**Purpose**: Find A Trainer page functionality
#### Class Methods
##### `get_instance()`
Returns singleton instance.
```php
$page = HVAC_Find_Trainer_Page::get_instance();
```
##### `render_page()`
Renders the complete Find A Trainer page.
```php
$page->render_page();
```
**Returns**: `void` - Outputs HTML directly
##### `get_filter_options()`
Gets available filter options for the directory.
```php
$options = $page->get_filter_options();
```
**Returns**: `array` - Filter options structure
**Return Structure**:
```php
[
'states' => ['Illinois', 'New York', 'California'],
'business_types' => ['Contractor', 'Distributor', 'Consultant'],
'training_formats' => ['In-person', 'Virtual', 'Hybrid'],
'training_resources' => ['Classroom', 'Training Lab', 'Online']
]
```
##### `build_query_args($filters, $page = 1, $per_page = 12)`
Builds WP_Query arguments from filter criteria.
```php
$filters = [
'state' => 'Illinois',
'business_type' => ['Contractor', 'Consultant'],
'search' => 'John'
];
$args = $page->build_query_args($filters, 1, 20);
```
**Parameters**:
- `$filters` (array) - Filter criteria
- `$page` (int) - Page number
- `$per_page` (int) - Results per page
**Returns**: `array` - WP_Query arguments
##### `render_trainer_cards($trainers)`
Renders HTML for trainer cards.
```php
$trainers = $page->get_filtered_trainers($filters);
$page->render_trainer_cards($trainers);
```
**Parameters**:
- `$trainers` (array) - Array of trainer data
**Returns**: `void` - Outputs HTML directly
### HVAC_MapGeo_Integration
**File**: `includes/find-trainer/class-hvac-mapgeo-integration.php`
**Purpose**: MapGeo plugin integration for interactive maps
#### Class Methods
##### `get_instance()`
Returns singleton instance.
```php
$integration = HVAC_MapGeo_Integration::get_instance();
```
##### `modify_map_layout($meta, $map_id = null)`
Modifies MapGeo map layout to add trainer profile data.
```php
add_filter('igm_add_meta', [$integration, 'modify_map_layout'], 10, 2);
```
**Parameters**:
- `$meta` (array) - MapGeo metadata
- `$map_id` (string) - Map ID
**Returns**: `array` - Modified metadata
##### `ajax_get_trainer_profile()`
AJAX handler for retrieving complete trainer profile data.
```php
add_action('wp_ajax_hvac_get_trainer_profile', [$integration, 'ajax_get_trainer_profile']);
add_action('wp_ajax_nopriv_hvac_get_trainer_profile', [$integration, 'ajax_get_trainer_profile']);
```
**Expected POST Data**:
- `profile_id` (int) - Trainer profile ID
- `nonce` (string) - Security nonce
**Response Format**:
```json
{
"success": true,
"data": {
"profile_id": 5840,
"user_id": "31",
"name": "John Smith",
"city": "Chicago",
"state": "Illinois",
"certification_type": "Certified measureQuick Trainer",
"profile_image": "https://...",
"business_type": "Independent Contractor",
"event_count": 5,
"training_formats": "In-Person, Virtual",
"training_locations": "On-site, Remote",
"upcoming_events": []
}
}
```
##### `ajax_get_trainer_certification()`
AJAX handler for getting trainer certification information.
```php
add_action('wp_ajax_hvac_get_trainer_certification', [$integration, 'ajax_get_trainer_certification']);
```
**Expected POST Data**:
- `profile_id` (int) - Trainer profile ID
- `nonce` (string) - Security nonce
**Response Format**:
```json
{
"success": true,
"data": {
"certification_type": "Certified measureQuick Trainer",
"certification_color": "#5077bb"
}
}
```
## AJAX Endpoints
### Trainer Profile Management
#### `hvac_save_trainer_profile`
Saves trainer profile changes.
**URL**: `wp-admin/admin-ajax.php`
**Method**: POST
**Auth**: Required (logged in user)
**Parameters**:
```php
[
'action' => 'hvac_save_trainer_profile',
'profile_id' => 5840,
'nonce' => 'security_nonce',
'trainer_first_name' => 'John',
'trainer_last_name' => 'Smith',
'trainer_city' => 'Chicago',
// ... other profile fields
]
```
**Response**:
```json
{
"success": true,
"data": {
"message": "Profile saved successfully",
"profile_id": 5840
}
}
```
#### `hvac_auto_save_profile`
Auto-saves profile during editing.
**Parameters**: Same as `hvac_save_trainer_profile`
**Response**: Same format with auto-save confirmation
### Find A Trainer Directory
#### `hvac_filter_trainers`
Filters trainers by multiple criteria.
**URL**: `wp-admin/admin-ajax.php`
**Method**: POST
**Auth**: Not required (public)
**Parameters**:
```php
[
'action' => 'hvac_filter_trainers',
'nonce' => 'security_nonce',
'filters' => [
'state' => ['Illinois', 'New York'],
'business_type' => ['Contractor'],
'training_format' => ['In-person', 'Virtual']
],
'page' => 1,
'per_page' => 12
]
```
**Response**:
```json
{
"success": true,
"data": {
"html": "<div class='hvac-trainer-card'>...</div>",
"pagination": "<div class='hvac-pagination'>...</div>",
"count": 25,
"page": 1,
"max_pages": 3
}
}
```
#### `hvac_search_trainers`
Searches trainers by text query.
**Parameters**:
```php
[
'action' => 'hvac_search_trainers',
'nonce' => 'security_nonce',
'search' => 'John Smith',
'page' => 1,
'per_page' => 12
]
```
**Response**: Same format as filter trainers
#### `hvac_get_filter_options`
Gets available filter options.
**Parameters**:
```php
[
'action' => 'hvac_get_filter_options',
'nonce' => 'security_nonce'
]
```
**Response**:
```json
{
"success": true,
"data": {
"states": ["Illinois", "New York", "California"],
"business_types": ["Contractor", "Distributor", "Consultant"],
"training_formats": ["In-person", "Virtual", "Hybrid"],
"training_resources": ["Classroom", "Training Lab", "Online"]
}
}
```
### Contact Forms
#### `hvac_submit_contact_form`
Submits contact form to trainer.
**Parameters**:
```php
[
'action' => 'hvac_submit_contact_form',
'nonce' => 'security_nonce',
'trainer_id' => 5840,
'contact_name' => 'Jane Doe',
'contact_email' => 'jane@example.com',
'contact_phone' => '555-1234',
'message' => 'I would like to inquire about training...'
]
```
**Response**:
```json
{
"success": true,
"data": {
"message": "Your message has been sent successfully"
}
}
```
## JavaScript APIs
### HVAC_FindTrainer Object
**File**: `assets/js/find-trainer.js`
**Purpose**: Client-side Find A Trainer functionality
#### Configuration
```javascript
var HVAC_FindTrainer = {
config: {
ajax_url: hvac_find_trainer.ajax_url,
nonce: hvac_find_trainer.nonce,
filters: {},
current_page: 1,
per_page: 12
}
};
```
#### Methods
##### `init(options)`
Initializes the Find A Trainer system.
```javascript
HVAC_FindTrainer.init({
ajax_url: '/wp-admin/admin-ajax.php',
nonce: 'security_nonce',
filters: {
state: [],
business_type: [],
training_format: []
}
});
```
**Parameters**:
- `options` (object) - Configuration options
##### `performSearch(query)`
Performs text search for trainers.
```javascript
HVAC_FindTrainer.performSearch('John Smith');
```
**Parameters**:
- `query` (string) - Search query
##### `applyFilters()`
Applies current filter settings.
```javascript
HVAC_FindTrainer.config.filters.state = ['Illinois'];
HVAC_FindTrainer.applyFilters();
```
##### `updateResults(response)`
Updates the display with new results.
```javascript
HVAC_FindTrainer.updateResults({
success: true,
data: {
html: '<div>...</div>',
pagination: '<div>...</div>',
count: 25
}
});
```
**Parameters**:
- `response` (object) - AJAX response object
##### `showTrainerProfile(profileId)`
Shows trainer profile modal.
```javascript
HVAC_FindTrainer.showTrainerProfile(5840);
```
**Parameters**:
- `profileId` (int) - Trainer profile ID
### MapGeo Integration JavaScript
**File**: Embedded in `class-hvac-mapgeo-integration.php`
**Purpose**: MapGeo map interaction handling
#### Global Functions
##### `window.hvac_show_trainer_modal(markerData)`
Custom MapGeo action handler for trainer markers.
```javascript
window.hvac_show_trainer_modal({
hvac_profile_id: 5840,
id: 'trainer_5840',
title: 'John Smith'
});
```
**Parameters**:
- `markerData` (object) - Marker data from MapGeo
#### Global Variables
##### `window.hvacTrainerDataCache`
Cache object for trainer profile data.
```javascript
// Cache structure
window.hvacTrainerDataCache = {
'5840': {
profile_id: 5840,
name: 'John Smith',
certification_type: 'Certified measureQuick Trainer'
// ... other profile data
}
};
```
##### `window.hvacPendingRequests`
Tracking object for pending AJAX requests.
```javascript
// Pending requests structure
window.hvacPendingRequests = {
'5840': true // Profile ID 5840 has pending request
};
```
##### `window.lastMapGeoTrainerData`
Stores the most recent trainer data logged by MapGeo.
```javascript
window.lastMapGeoTrainerData = {
id: 'trainer_5840',
title: 'John Smith',
latitude: 41.8781,
longitude: -87.6298
};
```
## Database Schema
### Custom Post Type: trainer_profile
#### wp_posts Table Fields
```sql
-- Core post fields for trainer_profile
CREATE TABLE wp_posts (
ID bigint(20) unsigned NOT NULL AUTO_INCREMENT,
post_title tinytext NOT NULL, -- Trainer display name
post_content longtext NOT NULL, -- Profile description
post_status varchar(20) NOT NULL, -- 'publish', 'draft', 'pending'
post_type varchar(20) NOT NULL, -- 'trainer_profile'
post_date datetime NOT NULL,
post_modified datetime NOT NULL,
PRIMARY KEY (ID),
KEY type_status_date (post_type, post_status, post_date, ID)
);
```
#### wp_postmeta Table Fields
```sql
-- Profile metadata structure
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES
-- Personal Information
(5840, 'trainer_first_name', 'John'),
(5840, 'trainer_last_name', 'Smith'),
(5840, 'trainer_display_name', 'John Smith'),
(5840, 'trainer_city', 'Chicago'),
(5840, 'trainer_state', 'Illinois'),
(5840, 'trainer_country', 'USA'),
(5840, 'profile_image_url', 'https://...'),
(5840, 'linkedin_profile_url', 'https://linkedin.com/...'),
-- Certification Information
(5840, 'certification_type', 'Certified measureQuick Trainer'),
(5840, 'certification_status', 'Active'),
(5840, 'certification_color', '#5077bb'),
(5840, 'date_certified', '2024-01-15'),
(5840, 'personal_accreditation', 'Additional certifications'),
-- System Fields
(5840, 'user_id', '31'),
(5840, 'is_public_profile', '1'),
(5840, '_last_geocode_attempt', '1691234567'),
(5840, 'geocoded_lat', '41.8781136'),
(5840, 'geocoded_lng', '-87.6297982'),
-- Business Information
(5840, 'annual_revenue_target', '100000'),
(5840, 'application_details', 'Registration details...');
```
#### Taxonomy Tables
##### Business Type Taxonomy
```sql
-- wp_terms entries for business_type taxonomy
INSERT INTO wp_terms (term_id, name, slug) VALUES
(1, 'Manufacturer', 'manufacturer'),
(2, 'Distributor', 'distributor'),
(3, 'Contractor', 'contractor'),
(4, 'Consultant', 'consultant'),
(5, 'Educator', 'educator'),
(6, 'Government', 'government'),
(7, 'Other', 'other');
-- wp_term_taxonomy entries
INSERT INTO wp_term_taxonomy (term_taxonomy_id, term_id, taxonomy, parent, count) VALUES
(1, 1, 'business_type', 0, 5),
(2, 2, 'business_type', 0, 8),
(3, 3, 'business_type', 0, 12);
-- wp_term_relationships entries (linking posts to terms)
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id, term_order) VALUES
(5840, 3, 0); -- Profile 5840 is linked to Contractor business type
```
### Database Indexes
#### Recommended Indexes for Performance
```sql
-- Optimize meta queries
CREATE INDEX idx_postmeta_profile_queries
ON wp_postmeta (meta_key, meta_value(50), post_id);
-- Optimize trainer profile queries
CREATE INDEX idx_posts_trainer_profile
ON wp_posts (post_type, post_status, post_date);
-- Optimize geocoded trainer queries
CREATE INDEX idx_geocoded_trainers
ON wp_postmeta (meta_key, post_id)
WHERE meta_key IN ('geocoded_lat', 'geocoded_lng', 'is_public_profile');
```
### Common Database Queries
#### Get All Public Trainers
```sql
SELECT p.ID, p.post_title,
lat.meta_value as latitude,
lng.meta_value as longitude,
cert.meta_value as certification_type
FROM wp_posts p
LEFT JOIN wp_postmeta pub ON p.ID = pub.post_id AND pub.meta_key = 'is_public_profile'
LEFT JOIN wp_postmeta lat ON p.ID = lat.post_id AND lat.meta_key = 'geocoded_lat'
LEFT JOIN wp_postmeta lng ON p.ID = lng.post_id AND lng.meta_key = 'geocoded_lng'
LEFT JOIN wp_postmeta cert ON p.ID = cert.post_id AND cert.meta_key = 'certification_type'
WHERE p.post_type = 'trainer_profile'
AND p.post_status = 'publish'
AND pub.meta_value = '1'
AND lat.meta_value IS NOT NULL
AND lng.meta_value IS NOT NULL;
```
#### Get Trainers by State
```sql
SELECT p.ID, p.post_title, state.meta_value as state
FROM wp_posts p
INNER JOIN wp_postmeta state ON p.ID = state.post_id AND state.meta_key = 'trainer_state'
INNER JOIN wp_postmeta pub ON p.ID = pub.post_id AND pub.meta_key = 'is_public_profile'
WHERE p.post_type = 'trainer_profile'
AND p.post_status = 'publish'
AND pub.meta_value = '1'
AND state.meta_value = 'Illinois'
ORDER BY p.post_title;
```
## Hooks & Filters
### Action Hooks
#### `hvac_trainer_profile_created`
Fired when a new trainer profile is created.
```php
add_action('hvac_trainer_profile_created', function($profile_id, $profile_data) {
// Custom logic after profile creation
error_log("New trainer profile created: " . $profile_id);
}, 10, 2);
```
**Parameters**:
- `$profile_id` (int) - Created profile ID
- `$profile_data` (array) - Profile data used for creation
#### `hvac_trainer_profile_updated`
Fired when a trainer profile is updated.
```php
add_action('hvac_trainer_profile_updated', function($profile_id, $old_data, $new_data) {
// Custom logic after profile update
if ($old_data['trainer_city'] !== $new_data['trainer_city']) {
// Location changed - trigger geocoding
do_action('hvac_trigger_geocoding', $profile_id);
}
}, 10, 3);
```
**Parameters**:
- `$profile_id` (int) - Updated profile ID
- `$old_data` (array) - Previous profile data
- `$new_data` (array) - New profile data
#### `hvac_trainer_profile_geocoded`
Fired when a trainer profile is successfully geocoded.
```php
add_action('hvac_trainer_profile_geocoded', function($profile_id, $lat, $lng) {
// Custom logic after geocoding
error_log("Profile {$profile_id} geocoded to: {$lat}, {$lng}");
}, 10, 3);
```
**Parameters**:
- `$profile_id` (int) - Profile ID
- `$lat` (float) - Latitude
- `$lng` (float) - Longitude
### Filter Hooks
#### `hvac_trainer_profile_data`
Filters profile data before saving.
```php
add_filter('hvac_trainer_profile_data', function($data, $profile_id) {
// Modify profile data before saving
if (empty($data['trainer_display_name'])) {
$data['trainer_display_name'] = $data['trainer_first_name'] . ' ' . $data['trainer_last_name'];
}
return $data;
}, 10, 2);
```
**Parameters**:
- `$data` (array) - Profile data
- `$profile_id` (int) - Profile ID (0 for new profiles)
**Returns**: `array` - Modified profile data
#### `hvac_trainer_query_args`
Filters WP_Query arguments for trainer queries.
```php
add_filter('hvac_trainer_query_args', function($args, $context) {
// Modify query arguments
if ($context === 'find_trainer_page') {
$args['posts_per_page'] = 20; // Show more results
}
return $args;
}, 10, 2);
```
**Parameters**:
- `$args` (array) - WP_Query arguments
- `$context` (string) - Query context ('find_trainer_page', 'admin_list', etc.)
**Returns**: `array` - Modified query arguments
#### `hvac_trainer_card_data`
Filters trainer card display data.
```php
add_filter('hvac_trainer_card_data', function($card_data, $profile_id) {
// Add custom fields to card display
$card_data['custom_field'] = get_post_meta($profile_id, 'custom_field', true);
return $card_data;
}, 10, 2);
```
**Parameters**:
- `$card_data` (array) - Card display data
- `$profile_id` (int) - Profile ID
**Returns**: `array` - Modified card data
#### `hvac_mapgeo_marker_data`
Filters MapGeo marker data for trainers.
```php
add_filter('hvac_mapgeo_marker_data', function($marker_data, $profile_id) {
// Customize marker appearance
$cert_type = get_post_meta($profile_id, 'certification_type', true);
if ($cert_type === 'Certified measureQuick Champion') {
$marker_data['icon'] = 'champion_icon';
$marker_data['fill'] = '#f19a42';
}
return $marker_data;
}, 10, 2);
```
**Parameters**:
- `$marker_data` (array) - Marker data
- `$profile_id` (int) - Profile ID
**Returns**: `array` - Modified marker data
## Constants & Configuration
### Plugin Constants
```php
// Plugin version
define('HVAC_PLUGIN_VERSION', '1.0.0');
// Plugin paths
define('HVAC_PLUGIN_PATH', plugin_dir_path(__FILE__));
define('HVAC_PLUGIN_URL', plugin_dir_url(__FILE__));
// MapGeo configuration
define('HVAC_MAPGEO_MAP_ID', '5872');
// Performance settings
define('HVAC_TRAINER_CACHE_TIMEOUT', HOUR_IN_SECONDS);
define('HVAC_TRAINER_GEOCODING_TIMEOUT', 30); // seconds
// Debug mode
define('HVAC_DEBUG', false);
```
### Configuration Options
#### WordPress Options
```php
// Google Maps API key for geocoding
update_option('hvac_google_maps_api_key', 'your_api_key_here');
// Default trainer profile settings
update_option('hvac_trainer_default_settings', [
'auto_geocode' => true,
'public_by_default' => false,
'require_approval' => true
]);
// Find A Trainer page settings
update_option('hvac_find_trainer_settings', [
'results_per_page' => 12,
'enable_map' => true,
'enable_contact_forms' => true,
'cache_timeout' => 3600
]);
```
## Error Codes
### AJAX Error Codes
| Code | Constant | Description |
|------|----------|-------------|
| 1001 | `HVAC_ERROR_INVALID_NONCE` | Nonce verification failed |
| 1002 | `HVAC_ERROR_INSUFFICIENT_PERMISSIONS` | User lacks required permissions |
| 1003 | `HVAC_ERROR_PROFILE_NOT_FOUND` | Trainer profile not found |
| 1004 | `HVAC_ERROR_INVALID_DATA` | Invalid or missing data |
| 1005 | `HVAC_ERROR_SAVE_FAILED` | Profile save operation failed |
| 1006 | `HVAC_ERROR_GEOCODING_FAILED` | Geocoding service error |
| 1007 | `HVAC_ERROR_EMAIL_FAILED` | Email delivery failed |
### Error Handling Example
```php
// In AJAX handler
public function ajax_save_trainer_profile() {
// Verify nonce
if (!wp_verify_nonce($_POST['nonce'], 'hvac_trainer_profile')) {
wp_send_json_error([
'code' => 1001,
'message' => 'Security verification failed'
]);
return;
}
// Check permissions
if (!current_user_can('edit_hvac_profile')) {
wp_send_json_error([
'code' => 1002,
'message' => 'Insufficient permissions'
]);
return;
}
// Validate profile ID
$profile_id = intval($_POST['profile_id']);
if (!$profile_id || get_post_type($profile_id) !== 'trainer_profile') {
wp_send_json_error([
'code' => 1003,
'message' => 'Trainer profile not found'
]);
return;
}
// Process save operation
$result = $this->save_profile($profile_id, $_POST);
if (is_wp_error($result)) {
wp_send_json_error([
'code' => 1005,
'message' => $result->get_error_message()
]);
return;
}
wp_send_json_success([
'message' => 'Profile saved successfully',
'profile_id' => $profile_id
]);
}
```
### JavaScript Error Handling
```javascript
// Client-side error handling
function handleAjaxError(response) {
if (!response.success && response.data.code) {
switch (response.data.code) {
case 1001:
// Nonce error - refresh page
location.reload();
break;
case 1002:
// Permission error
alert('You do not have permission to perform this action.');
break;
case 1003:
// Profile not found
alert('Trainer profile not found.');
break;
default:
// Generic error
alert('An error occurred: ' + response.data.message);
}
}
}
// Usage in AJAX calls
jQuery.ajax({
url: hvac_trainer.ajax_url,
method: 'POST',
data: requestData,
success: function(response) {
if (response.success) {
// Handle success
} else {
handleAjaxError(response);
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.error('AJAX Error:', textStatus, errorThrown);
alert('Network error occurred. Please try again.');
}
});
```
This API reference provides comprehensive technical documentation for developers working with the HVAC Trainer system. For additional examples and use cases, refer to the main system documentation.