- Added explicit checks to prevent authentication redirects on registration page - Added ensure_registration_page_public() method with priority 1 to run before other auth checks - Included registration-pending and training-login pages in public pages list - Added fallback function in main plugin file to remove auth hooks on registration page This ensures that users can access /trainer/registration/ without being logged in, as intended for new trainer signups.
		
			
				
	
	
		
			504 lines
		
	
	
		
			No EOL
		
	
	
		
			17 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			504 lines
		
	
	
		
			No EOL
		
	
	
		
			17 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Template Name: HVAC Order Summary
 | |
|  * Template for displaying single HVAC Order Summary.
 | |
|  *
 | |
|  * This template displays order and attendee details for a specific order,
 | |
|  * following the Astra theme structure and plugin architecture.
 | |
|  * Design Reference: docs/REQUIREMENTS.md, implementation_plan.md
 | |
|  */
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
| 	exit; // Exit if accessed directly.
 | |
| }
 | |
| 
 | |
| // Ensure the data class is available
 | |
| if ( ! class_exists( 'HVAC_Order_Summary_Data' ) ) {
 | |
|     $class_path = plugin_dir_path( __FILE__ ) . '../includes/community/class-order-summary-data.php';
 | |
|     if ( file_exists( $class_path ) ) {
 | |
|         require_once $class_path;
 | |
|     } else {
 | |
|         echo "<p>Error: Order Summary data handler not found.</p>";
 | |
|         return;
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Check if user is logged in
 | |
| if ( ! is_user_logged_in() ) {
 | |
|     get_header();
 | |
|     echo '<div id="primary" class="content-area primary ast-container">';
 | |
|     echo '<main id="main" class="site-main">';
 | |
|     echo '<div class="hvac-login-required" style="padding: 30px; background-color: #f8f9fa; border: 1px solid #e9ecef; border-radius: 8px; text-align: center; margin: 30px 0;">';
 | |
|     echo '<h2>Authentication Required</h2>';
 | |
|     echo '<p>Please log in to view the order summary.</p>';
 | |
|     echo '<p><a href="' . esc_url(home_url('/community-login/')) . '" class="ast-button ast-button-primary">Log In</a></p>';
 | |
|     echo '</div>';
 | |
|     echo '</main></div>';
 | |
|     get_footer();
 | |
|     exit;
 | |
| }
 | |
| 
 | |
| // Get order ID from query var or context
 | |
| $order_id = isset( $_GET['order_id'] ) ? absint( $_GET['order_id'] ) : 0;
 | |
| 
 | |
| if ( $order_id <= 0 ) {
 | |
|     get_header();
 | |
|     echo '<div id="primary" class="content-area primary ast-container">';
 | |
|     echo '<main id="main" class="site-main">';
 | |
|     echo '<div class="hvac-error">No order specified. Please return to your dashboard.</div>';
 | |
|     echo '<p><a href="' . esc_url(home_url('/hvac-dashboard/')) . '" class="ast-button ast-button-primary">Return to Dashboard</a></p>';
 | |
|     echo '</main></div>';
 | |
|     get_footer();
 | |
|     exit;
 | |
| }
 | |
| 
 | |
| // Initialize order data handler
 | |
| $order_summary = new HVAC_Order_Summary_Data( $order_id );
 | |
| 
 | |
| // Check if order is valid and user has permission to view it
 | |
| if ( ! $order_summary->is_valid_order() || ! $order_summary->user_can_view_order() ) {
 | |
|     get_header();
 | |
|     echo '<div id="primary" class="content-area primary ast-container">';
 | |
|     echo '<main id="main" class="site-main">';
 | |
|     echo '<div class="hvac-error">Order not found or you do not have permission to view this order.</div>';
 | |
|     echo '<p><a href="' . esc_url(home_url('/hvac-dashboard/')) . '" class="ast-button ast-button-primary">Return to Dashboard</a></p>';
 | |
|     echo '</main></div>';
 | |
|     get_footer();
 | |
|     exit;
 | |
| }
 | |
| 
 | |
| // Get order data
 | |
| $order_details = $order_summary->get_order_details();
 | |
| $tickets = $order_details['tickets'];
 | |
| $events = $order_details['events'];
 | |
| $notes = $order_summary->get_order_notes();
 | |
| 
 | |
| get_header();
 | |
| ?>
 | |
| <div id="primary" class="content-area primary ast-container">
 | |
|     <main id="main" class="site-main">
 | |
|         
 | |
|         <!-- Header & Navigation -->
 | |
|         <div class="hvac-dashboard-header">
 | |
|             <h1 class="entry-title">Order Summary: #<?php echo esc_html( $order_details['order_number'] ); ?></h1>
 | |
|             <div class="hvac-dashboard-nav">
 | |
|                 <?php if(!empty($events) && isset($events[0]['id'])): ?>
 | |
|                     <a href="<?php echo esc_url(add_query_arg('event_id', $events[0]['id'], home_url('/event-summary/'))); ?>" class="ast-button ast-button-secondary">Back to Event Summary</a>
 | |
|                 <?php endif; ?>
 | |
|                 <a href="<?php echo esc_url(home_url('/hvac-dashboard/')); ?>" class="ast-button ast-button-primary">Dashboard</a>
 | |
|                 <?php
 | |
|                 // Email attendees link (Phase 2 feature)
 | |
|                 if (count($tickets) > 0) {
 | |
|                     echo '<a href="#" class="ast-button ast-button-secondary">Email Attendees</a>';
 | |
|                 }
 | |
|                 ?>
 | |
|             </div>
 | |
|         </div>
 | |
|         
 | |
|         <!-- Order Overview Section -->
 | |
|         <section class="hvac-summary-section">
 | |
|             <h2>Order Overview</h2>
 | |
|             <div class="hvac-summary-content">
 | |
|                 <!-- Order Details -->
 | |
|                 <div class="hvac-details-card">
 | |
|                     <table class="hvac-details-table">
 | |
|                         <tr>
 | |
|                             <th>Order Number:</th>
 | |
|                             <td><?php echo esc_html( $order_details['order_number'] ); ?></td>
 | |
|                         </tr>
 | |
|                         <tr>
 | |
|                             <th>Purchaser:</th>
 | |
|                             <td>
 | |
|                                 <?php echo esc_html( $order_details['purchaser_name'] ); ?>
 | |
|                                 <?php if (!empty($order_details['purchaser_email'])) : ?>
 | |
|                                     <div class="hvac-detail-subtext"><?php echo esc_html( $order_details['purchaser_email'] ); ?></div>
 | |
|                                 <?php endif; ?>
 | |
|                             </td>
 | |
|                         </tr>
 | |
|                         <?php if (!empty($order_details['organization'])) : ?>
 | |
|                         <tr>
 | |
|                             <th>Organization:</th>
 | |
|                             <td><?php echo esc_html( $order_details['organization'] ); ?></td>
 | |
|                         </tr>
 | |
|                         <?php endif; ?>
 | |
|                         <tr>
 | |
|                             <th>Purchase Date:</th>
 | |
|                             <td><?php echo esc_html( $order_details['purchase_date'] ); ?></td>
 | |
|                         </tr>
 | |
|                         <tr>
 | |
|                             <th>Status:</th>
 | |
|                             <td><?php echo esc_html( ucfirst( $order_details['status'] ) ); ?></td>
 | |
|                         </tr>
 | |
|                         <tr>
 | |
|                             <th>Total Price:</th>
 | |
|                             <td><?php echo esc_html( $order_details['total_price'] ); ?></td>
 | |
|                         </tr>
 | |
|                         <?php if (!empty($order_details['payment_method'])) : ?>
 | |
|                         <tr>
 | |
|                             <th>Payment Method:</th>
 | |
|                             <td><?php echo esc_html( $order_details['payment_method'] ); ?></td>
 | |
|                         </tr>
 | |
|                         <?php endif; ?>
 | |
|                         <?php if (!empty($order_details['billing_address'])) : ?>
 | |
|                         <tr>
 | |
|                             <th>Billing Address:</th>
 | |
|                             <td><?php echo esc_html( $order_details['billing_address'] ); ?></td>
 | |
|                         </tr>
 | |
|                         <?php endif; ?>
 | |
|                     </table>
 | |
|                 </div>
 | |
|             </div>
 | |
|         </section>
 | |
|         
 | |
|         <!-- Events Section -->
 | |
|         <?php if (!empty($events)) : ?>
 | |
|         <section class="hvac-summary-section">
 | |
|             <h2>Events</h2>
 | |
|             <div class="hvac-summary-content">
 | |
|                 <div class="hvac-events-list">
 | |
|                     <?php foreach ($events as $event) : ?>
 | |
|                     <div class="hvac-event-card">
 | |
|                         <h3>
 | |
|                             <a href="<?php echo esc_url(add_query_arg('event_id', $event['id'], home_url('/event-summary/'))); ?>">
 | |
|                                 <?php echo esc_html($event['title']); ?>
 | |
|                             </a>
 | |
|                         </h3>
 | |
|                         <?php if (!empty($event['start_date'])) : ?>
 | |
|                         <div class="hvac-event-date">
 | |
|                             <?php echo esc_html($event['start_date']); ?>
 | |
|                             <?php if (!empty($event['end_date']) && $event['start_date'] !== $event['end_date']) : ?>
 | |
|                                 - <?php echo esc_html($event['end_date']); ?>
 | |
|                             <?php endif; ?>
 | |
|                         </div>
 | |
|                         <?php endif; ?>
 | |
|                         <?php if (!empty($event['venue'])) : ?>
 | |
|                         <div class="hvac-event-venue">
 | |
|                             <i class="fas fa-map-marker-alt"></i> <?php echo esc_html($event['venue']); ?>
 | |
|                         </div>
 | |
|                         <?php endif; ?>
 | |
|                         <div class="hvac-event-links">
 | |
|                             <a href="<?php echo esc_url($event['permalink']); ?>" target="_blank" class="hvac-view-link">View Public Page</a>
 | |
|                             <a href="<?php echo esc_url(add_query_arg('event_id', $event['id'], home_url('/event-summary/'))); ?>" class="hvac-summary-link">Event Summary</a>
 | |
|                         </div>
 | |
|                     </div>
 | |
|                     <?php endforeach; ?>
 | |
|                 </div>
 | |
|             </div>
 | |
|         </section>
 | |
|         <?php endif; ?>
 | |
|         
 | |
|         <!-- Tickets & Attendees Section -->
 | |
|         <section class="hvac-summary-section">
 | |
|             <h2>Tickets & Attendees</h2>
 | |
|             <div class="hvac-summary-content">
 | |
|                 <?php if (!empty($tickets)) : ?>
 | |
|                 <table class="hvac-tickets-table">
 | |
|                     <thead>
 | |
|                         <tr>
 | |
|                             <th>Attendee</th>
 | |
|                             <th>Email</th>
 | |
|                             <th>Ticket Type</th>
 | |
|                             <th>Event</th>
 | |
|                             <th>Price</th>
 | |
|                             <th>Status</th>
 | |
|                         </tr>
 | |
|                     </thead>
 | |
|                     <tbody>
 | |
|                         <?php foreach ($tickets as $ticket) : ?>
 | |
|                         <tr>
 | |
|                             <td><?php echo esc_html($ticket['attendee_name']); ?></td>
 | |
|                             <td><?php echo esc_html($ticket['attendee_email']); ?></td>
 | |
|                             <td><?php echo esc_html($ticket['ticket_type']); ?></td>
 | |
|                             <td>
 | |
|                                 <?php if (!empty($ticket['event_id'])) : ?>
 | |
|                                 <a href="<?php echo esc_url(add_query_arg('event_id', $ticket['event_id'], home_url('/event-summary/'))); ?>">
 | |
|                                     <?php echo esc_html($ticket['event_title']); ?>
 | |
|                                 </a>
 | |
|                                 <?php else : ?>
 | |
|                                 <?php echo esc_html($ticket['event_title'] ?? 'N/A'); ?>
 | |
|                                 <?php endif; ?>
 | |
|                             </td>
 | |
|                             <td><?php echo !empty($ticket['price']) ? '$' . number_format((float)$ticket['price'], 2) : 'N/A'; ?></td>
 | |
|                             <td><?php echo $ticket['checked_in'] ? 'Checked In' : 'Not Checked In'; ?></td>
 | |
|                         </tr>
 | |
|                         <?php if (!empty($ticket['additional_fields'])) : ?>
 | |
|                         <tr class="attendee-additional-fields">
 | |
|                             <td colspan="6">
 | |
|                                 <details>
 | |
|                                     <summary>Additional Information</summary>
 | |
|                                     <div class="additional-fields-content">
 | |
|                                         <table class="additional-fields-table">
 | |
|                                             <?php foreach ($ticket['additional_fields'] as $field) : ?>
 | |
|                                             <tr>
 | |
|                                                 <th><?php echo esc_html($field['label']); ?>:</th>
 | |
|                                                 <td><?php echo esc_html($field['value']); ?></td>
 | |
|                                             </tr>
 | |
|                                             <?php endforeach; ?>
 | |
|                                         </table>
 | |
|                                     </div>
 | |
|                                 </details>
 | |
|                             </td>
 | |
|                         </tr>
 | |
|                         <?php endif; ?>
 | |
|                         <?php endforeach; ?>
 | |
|                     </tbody>
 | |
|                 </table>
 | |
|                 <?php else : ?>
 | |
|                 <p>No tickets or attendees found for this order.</p>
 | |
|                 <?php endif; ?>
 | |
|             </div>
 | |
|         </section>
 | |
|         
 | |
|         <!-- Order Notes Section -->
 | |
|         <?php if (!empty($notes)) : ?>
 | |
|         <section class="hvac-summary-section">
 | |
|             <h2>Order Notes</h2>
 | |
|             <div class="hvac-summary-content">
 | |
|                 <div class="hvac-notes-list">
 | |
|                     <?php foreach ($notes as $note) : ?>
 | |
|                     <div class="hvac-note-item">
 | |
|                         <div class="hvac-note-content"><?php echo wp_kses_post($note['content']); ?></div>
 | |
|                         <div class="hvac-note-meta">
 | |
|                             <span class="hvac-note-date"><?php echo esc_html($note['date']); ?></span>
 | |
|                             <?php if (!empty($note['author'])) : ?>
 | |
|                             <span class="hvac-note-author">by <?php echo esc_html($note['author']); ?></span>
 | |
|                             <?php endif; ?>
 | |
|                         </div>
 | |
|                     </div>
 | |
|                     <?php endforeach; ?>
 | |
|                 </div>
 | |
|             </div>
 | |
|         </section>
 | |
|         <?php endif; ?>
 | |
|         
 | |
|     </main>
 | |
| </div>
 | |
| 
 | |
| <style>
 | |
|     /* Order Summary Styles */
 | |
|     .hvac-dashboard-header {
 | |
|         display: flex;
 | |
|         justify-content: space-between;
 | |
|         align-items: center;
 | |
|         margin-bottom: 20px;
 | |
|     }
 | |
|     
 | |
|     .hvac-dashboard-nav {
 | |
|         display: flex;
 | |
|         gap: 10px;
 | |
|     }
 | |
|     
 | |
|     .hvac-summary-section {
 | |
|         margin-bottom: 40px;
 | |
|         background: #f8f9fa;
 | |
|         border-radius: 8px;
 | |
|         padding: 20px;
 | |
|         border: 1px solid #e9ecef;
 | |
|     }
 | |
|     
 | |
|     .hvac-summary-section h2 {
 | |
|         margin-top: 0;
 | |
|         margin-bottom: 20px;
 | |
|         border-bottom: 1px solid #eee;
 | |
|         padding-bottom: 10px;
 | |
|     }
 | |
|     
 | |
|     .hvac-summary-content {
 | |
|         margin-top: 10px;
 | |
|     }
 | |
|     
 | |
|     /* Order Details Table */
 | |
|     .hvac-details-table {
 | |
|         width: 100%;
 | |
|         border-collapse: collapse;
 | |
|     }
 | |
|     
 | |
|     .hvac-details-table th,
 | |
|     .hvac-details-table td {
 | |
|         padding: 10px;
 | |
|         text-align: left;
 | |
|         border-bottom: 1px solid #eee;
 | |
|     }
 | |
|     
 | |
|     .hvac-details-table th {
 | |
|         width: 150px;
 | |
|         font-weight: bold;
 | |
|         vertical-align: top;
 | |
|     }
 | |
|     
 | |
|     .hvac-detail-subtext {
 | |
|         font-size: 0.9em;
 | |
|         color: #666;
 | |
|         margin-top: 5px;
 | |
|     }
 | |
|     
 | |
|     /* Events List */
 | |
|     .hvac-events-list {
 | |
|         display: flex;
 | |
|         flex-wrap: wrap;
 | |
|         gap: 20px;
 | |
|     }
 | |
|     
 | |
|     .hvac-event-card {
 | |
|         flex: 1;
 | |
|         min-width: 250px;
 | |
|         background: #fff;
 | |
|         border: 1px solid #e9ecef;
 | |
|         border-radius: 5px;
 | |
|         padding: 15px;
 | |
|     }
 | |
|     
 | |
|     .hvac-event-card h3 {
 | |
|         margin-top: 0;
 | |
|         margin-bottom: 10px;
 | |
|     }
 | |
|     
 | |
|     .hvac-event-date,
 | |
|     .hvac-event-venue {
 | |
|         margin-bottom: 10px;
 | |
|         color: #666;
 | |
|         font-size: 0.9em;
 | |
|     }
 | |
|     
 | |
|     .hvac-event-links {
 | |
|         display: flex;
 | |
|         justify-content: space-between;
 | |
|         margin-top: 15px;
 | |
|     }
 | |
|     
 | |
|     .hvac-event-links a {
 | |
|         display: inline-block;
 | |
|         font-size: 0.9em;
 | |
|         text-decoration: none;
 | |
|     }
 | |
|     
 | |
|     /* Tickets Table */
 | |
|     .hvac-tickets-table {
 | |
|         width: 100%;
 | |
|         border-collapse: collapse;
 | |
|     }
 | |
|     
 | |
|     .hvac-tickets-table th,
 | |
|     .hvac-tickets-table td {
 | |
|         padding: 12px;
 | |
|         text-align: left;
 | |
|         border-bottom: 1px solid #eee;
 | |
|     }
 | |
|     
 | |
|     .hvac-tickets-table th {
 | |
|         background-color: #f1f1f1;
 | |
|         font-weight: bold;
 | |
|     }
 | |
|     
 | |
|     .hvac-tickets-table tr:nth-child(even) {
 | |
|         background-color: #f8f8f8;
 | |
|     }
 | |
|     
 | |
|     .hvac-tickets-table tr:hover {
 | |
|         background-color: #f0f0f0;
 | |
|     }
 | |
|     
 | |
|     .attendee-additional-fields {
 | |
|         background-color: #f5f5f5;
 | |
|     }
 | |
|     
 | |
|     .attendee-additional-fields td {
 | |
|         padding: 0;
 | |
|     }
 | |
|     
 | |
|     .attendee-additional-fields details {
 | |
|         padding: 10px;
 | |
|     }
 | |
|     
 | |
|     .attendee-additional-fields summary {
 | |
|         cursor: pointer;
 | |
|         padding: 5px;
 | |
|         color: #0073aa;
 | |
|     }
 | |
|     
 | |
|     .additional-fields-content {
 | |
|         padding: 10px;
 | |
|         background: #fff;
 | |
|         border-radius: 5px;
 | |
|         margin-top: 10px;
 | |
|     }
 | |
|     
 | |
|     .additional-fields-table {
 | |
|         width: 100%;
 | |
|         border-collapse: collapse;
 | |
|     }
 | |
|     
 | |
|     .additional-fields-table th,
 | |
|     .additional-fields-table td {
 | |
|         padding: 5px;
 | |
|         text-align: left;
 | |
|         border-bottom: 1px solid #eee;
 | |
|     }
 | |
|     
 | |
|     .additional-fields-table th {
 | |
|         width: 150px;
 | |
|         font-weight: normal;
 | |
|         color: #666;
 | |
|     }
 | |
|     
 | |
|     /* Order Notes */
 | |
|     .hvac-notes-list {
 | |
|         border: 1px solid #e0e0e0;
 | |
|         border-radius: 5px;
 | |
|         background: #fff;
 | |
|     }
 | |
|     
 | |
|     .hvac-note-item {
 | |
|         padding: 15px;
 | |
|         border-bottom: 1px solid #e0e0e0;
 | |
|     }
 | |
|     
 | |
|     .hvac-note-item:last-child {
 | |
|         border-bottom: none;
 | |
|     }
 | |
|     
 | |
|     .hvac-note-content {
 | |
|         margin-bottom: 5px;
 | |
|     }
 | |
|     
 | |
|     .hvac-note-meta {
 | |
|         font-size: 0.85em;
 | |
|         color: #777;
 | |
|     }
 | |
|     
 | |
|     .hvac-note-date {
 | |
|         margin-right: 10px;
 | |
|     }
 | |
|     
 | |
|     /* Responsive adjustments */
 | |
|     @media (max-width: 768px) {
 | |
|         .hvac-dashboard-header {
 | |
|             flex-direction: column;
 | |
|             align-items: flex-start;
 | |
|         }
 | |
|         
 | |
|         .hvac-dashboard-nav {
 | |
|             margin-top: 15px;
 | |
|             flex-wrap: wrap;
 | |
|         }
 | |
|         
 | |
|         .hvac-dashboard-nav a {
 | |
|             margin-bottom: 5px;
 | |
|         }
 | |
|         
 | |
|         .hvac-details-table th {
 | |
|             width: 120px;
 | |
|         }
 | |
|         
 | |
|         .hvac-tickets-table {
 | |
|             display: block;
 | |
|             overflow-x: auto;
 | |
|         }
 | |
|         
 | |
|         .hvac-event-card {
 | |
|             flex: 1 0 100%;
 | |
|         }
 | |
|     }
 | |
| </style>
 | |
| 
 | |
| <?php get_footer(); ?>
 |