- Created Find a Trainer page with interactive map and trainer directory - Integrated MapGeo plugin for displaying 45+ geocoded trainer locations - Built advanced filtering system (State/Province, Business Type, Training Format, Training Resources) - Implemented trainer profile cards with View Profile and See Events buttons - Added contact form handler with validation and email notifications - Created database table for tracking contact submissions - Responsive design with mobile-friendly layout - AJAX-powered search and filter functionality - Pagination support for trainer directory - Call to action for trainer registration Technical Implementation: - HVAC_Find_Trainer_Page: Main page handler with custom template - HVAC_MapGeo_Integration: Map marker management for trainer locations - HVAC_Contact_Form_Handler: Form processing with rate limiting - HVAC_Trainer_Directory_Query: Advanced querying with caching - HVAC_Contact_Submissions_Table: Database operations for submissions Tested with existing 53 trainer profiles, 45 geocoded locations Page live at: /find-a-trainer/ Co-Authored-By: Ben Reed <ben@tealmaker.com>
		
			
				
	
	
		
			98 lines
		
	
	
		
			No EOL
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			No EOL
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| # Verify existing trainer data on staging
 | |
| # Usage: ./scripts/verify-trainer-data.sh
 | |
| 
 | |
| source .env
 | |
| 
 | |
| echo "=== Verifying Existing Trainer Data on Staging ==="
 | |
| 
 | |
| ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" << 'ENDSSH'
 | |
| cd /home/974670.cloudwaysapps.com/uberrxmprk/public_html
 | |
| 
 | |
| wp eval '
 | |
| // Check trainer profiles
 | |
| $profiles = get_posts([
 | |
|     "post_type" => "trainer_profile",
 | |
|     "post_status" => "publish",
 | |
|     "posts_per_page" => -1
 | |
| ]);
 | |
| 
 | |
| echo "=== Trainer Profile Statistics ===\n";
 | |
| echo "Total trainer profiles: " . count($profiles) . "\n";
 | |
| 
 | |
| // Check for geocoded profiles
 | |
| $geocoded = 0;
 | |
| $public = 0;
 | |
| $with_events = 0;
 | |
| 
 | |
| foreach ($profiles as $profile) {
 | |
|     $lat = get_post_meta($profile->ID, "latitude", true);
 | |
|     $lng = get_post_meta($profile->ID, "longitude", true);
 | |
|     if ($lat && $lng) {
 | |
|         $geocoded++;
 | |
|     }
 | |
|     
 | |
|     $is_public = get_post_meta($profile->ID, "is_public_profile", true);
 | |
|     if ($is_public == "1") {
 | |
|         $public++;
 | |
|     }
 | |
|     
 | |
|     $user_id = get_post_meta($profile->ID, "user_id", true);
 | |
|     if ($user_id && function_exists("tribe_get_events")) {
 | |
|         $events = tribe_get_events([
 | |
|             "author" => $user_id,
 | |
|             "posts_per_page" => 1
 | |
|         ]);
 | |
|         if (!empty($events)) {
 | |
|             $with_events++;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| echo "Geocoded profiles: $geocoded\n";
 | |
| echo "Public profiles: $public\n";
 | |
| echo "Profiles with events: $with_events\n";
 | |
| 
 | |
| // Check users with trainer roles
 | |
| $trainers = get_users(["role" => "hvac_trainer"]);
 | |
| $master_trainers = get_users(["role" => "hvac_master_trainer"]);
 | |
| 
 | |
| echo "\n=== User Statistics ===\n";
 | |
| echo "Users with hvac_trainer role: " . count($trainers) . "\n";
 | |
| echo "Users with hvac_master_trainer role: " . count($master_trainers) . "\n";
 | |
| 
 | |
| // Check taxonomies
 | |
| $taxonomies = ["business_type", "training_formats", "training_resources", "training_audience"];
 | |
| echo "\n=== Taxonomy Statistics ===\n";
 | |
| 
 | |
| foreach ($taxonomies as $tax) {
 | |
|     if (taxonomy_exists($tax)) {
 | |
|         $terms = get_terms(["taxonomy" => $tax, "hide_empty" => false]);
 | |
|         if (!is_wp_error($terms)) {
 | |
|             echo "$tax: " . count($terms) . " terms\n";
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Sample some trainer data
 | |
| echo "\n=== Sample Trainer Data (First 5) ===\n";
 | |
| $sample_profiles = array_slice($profiles, 0, 5);
 | |
| foreach ($sample_profiles as $profile) {
 | |
|     $name = get_post_meta($profile->ID, "trainer_display_name", true);
 | |
|     $city = get_post_meta($profile->ID, "trainer_city", true);
 | |
|     $state = get_post_meta($profile->ID, "trainer_state", true);
 | |
|     $lat = get_post_meta($profile->ID, "latitude", true);
 | |
|     $lng = get_post_meta($profile->ID, "longitude", true);
 | |
|     
 | |
|     echo "- $name ($city, $state)";
 | |
|     if ($lat && $lng) {
 | |
|         echo " [Geocoded]";
 | |
|     }
 | |
|     echo "\n";
 | |
| }
 | |
| '
 | |
| 
 | |
| ENDSSH
 | |
| 
 | |
| echo "=== Data Verification Complete ===" |