- 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.
		
			
				
	
	
		
			243 lines
		
	
	
		
			No EOL
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			No EOL
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * HVAC Community Events Dashboard Data Handler - Fixed Version
 | |
|  *
 | |
|  * Consistently queries by post_author for trainer's events
 | |
|  *
 | |
|  * @package    HVAC_Community_Events
 | |
|  * @subpackage Includes
 | |
|  * @since      1.1.0
 | |
|  */
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
| 	exit;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Class HVAC_Dashboard_Data_Fixed
 | |
|  */
 | |
| class HVAC_Dashboard_Data_Fixed {
 | |
| 
 | |
| 	/**
 | |
| 	 * The ID of the trainer user.
 | |
| 	 *
 | |
| 	 * @var int
 | |
| 	 */
 | |
| 	private int $user_id;
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor.
 | |
| 	 *
 | |
| 	 * @param int $user_id The ID of the trainer user.
 | |
| 	 */
 | |
| 	public function __construct( int $user_id ) {
 | |
| 		$this->user_id = $user_id;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get the total number of events created by the trainer.
 | |
| 	 *
 | |
| 	 * @return int
 | |
| 	 */
 | |
| 	public function get_total_events_count() : int {
 | |
| 		$args = array(
 | |
| 			'post_type'      => Tribe__Events__Main::POSTTYPE,
 | |
| 			'author'         => $this->user_id,
 | |
| 			'post_status'    => array( 'publish', 'future', 'draft', 'pending', 'private' ),
 | |
| 			'posts_per_page' => -1,
 | |
| 			'fields'         => 'ids',
 | |
| 		);
 | |
| 		$query = new WP_Query( $args );
 | |
| 		return (int) $query->found_posts;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get the number of upcoming events for the trainer.
 | |
| 	 *
 | |
| 	 * @return int
 | |
| 	 */
 | |
| 	public function get_upcoming_events_count() : int {
 | |
| 		$today = current_time( 'mysql' );
 | |
| 		$args  = array(
 | |
| 			'post_type'      => Tribe__Events__Main::POSTTYPE,
 | |
| 			'author'         => $this->user_id, // Use author consistently
 | |
| 			'post_status'    => array( 'publish', 'future' ),
 | |
| 			'posts_per_page' => -1,
 | |
| 			'fields'         => 'ids',
 | |
| 			'meta_query'     => array(
 | |
| 				array(
 | |
| 					'key'     => '_EventStartDate',
 | |
| 					'value'   => $today,
 | |
| 					'compare' => '>=',
 | |
| 					'type'    => 'DATETIME',
 | |
| 				),
 | |
| 			),
 | |
| 			'orderby'        => 'meta_value',
 | |
| 			'meta_key'       => '_EventStartDate',
 | |
| 			'order'          => 'ASC',
 | |
| 		);
 | |
| 		$query = new WP_Query( $args );
 | |
| 		return (int) $query->found_posts;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get the number of past events for the trainer.
 | |
| 	 *
 | |
| 	 * @return int
 | |
| 	 */
 | |
| 	public function get_past_events_count() : int {
 | |
| 		$today = current_time( 'mysql' );
 | |
| 		$args  = array(
 | |
| 			'post_type'      => Tribe__Events__Main::POSTTYPE,
 | |
| 			'author'         => $this->user_id, // Use author consistently
 | |
| 			'post_status'    => array( 'publish', 'private' ),
 | |
| 			'posts_per_page' => -1,
 | |
| 			'fields'         => 'ids',
 | |
| 			'meta_query'     => array(
 | |
| 				array(
 | |
| 					'key'     => '_EventEndDate',
 | |
| 					'value'   => $today,
 | |
| 					'compare' => '<',
 | |
| 					'type'    => 'DATETIME',
 | |
| 				),
 | |
| 			),
 | |
| 		);
 | |
| 		$query = new WP_Query( $args );
 | |
| 		return (int) $query->found_posts;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get the total number of tickets sold across all the trainer's events.
 | |
| 	 *
 | |
| 	 * @return int
 | |
| 	 */
 | |
| 	public function get_total_tickets_sold() : int {
 | |
| 		$total_tickets = 0;
 | |
| 		$args = array(
 | |
| 			'post_type'      => Tribe__Events__Main::POSTTYPE,
 | |
| 			'author'         => $this->user_id, // Use author consistently
 | |
| 			'post_status'    => array( 'publish', 'future', 'draft', 'pending', 'private' ),
 | |
| 			'posts_per_page' => -1,
 | |
| 			'fields'         => 'ids',
 | |
| 		);
 | |
| 		$event_ids = get_posts( $args );
 | |
| 
 | |
| 		if ( ! empty( $event_ids ) ) {
 | |
| 			foreach ( $event_ids as $event_id ) {
 | |
| 				$sold = get_post_meta( $event_id, '_tribe_tickets_sold', true );
 | |
| 				if ( is_numeric( $sold ) ) {
 | |
| 					$total_tickets += (int) $sold;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return $total_tickets;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get the total revenue generated across all the trainer's events.
 | |
| 	 *
 | |
| 	 * @return float
 | |
| 	 */
 | |
| 	public function get_total_revenue() : float {
 | |
| 		$total_revenue = 0.0;
 | |
| 		$args = array(
 | |
| 			'post_type'      => Tribe__Events__Main::POSTTYPE,
 | |
| 			'author'         => $this->user_id, // Use author consistently
 | |
| 			'post_status'    => array( 'publish', 'future', 'draft', 'pending', 'private' ),
 | |
| 			'posts_per_page' => -1,
 | |
| 			'fields'         => 'ids',
 | |
| 		);
 | |
| 		$event_ids = get_posts( $args );
 | |
| 
 | |
| 		if ( ! empty( $event_ids ) ) {
 | |
| 			foreach ( $event_ids as $event_id ) {
 | |
| 				$revenue = get_post_meta( $event_id, '_tribe_revenue_total', true );
 | |
| 				if ( is_numeric( $revenue ) ) {
 | |
| 					$total_revenue += (float) $revenue;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return $total_revenue;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get the annual revenue target set by the trainer.
 | |
| 	 *
 | |
| 	 * @return float|null Returns the target as a float, or null if not set.
 | |
| 	 */
 | |
| 	public function get_annual_revenue_target() : ?float {
 | |
| 		$target = get_user_meta( $this->user_id, 'annual_revenue_target', true );
 | |
| 		return ! empty( $target ) && is_numeric( $target ) ? (float) $target : null;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get the data needed for the events table on the dashboard.
 | |
| 	 *
 | |
| 	 * @param string $filter_status The status to filter events by.
 | |
| 	 * @return array An array of event data arrays.
 | |
| 	 */
 | |
| 	public function get_events_table_data( string $filter_status = 'all' ) : array {
 | |
| 		$events_data = [];
 | |
| 		$valid_statuses = array( 'publish', 'future', 'draft', 'pending', 'private' );
 | |
| 		$post_status = ( 'all' === $filter_status || ! in_array( $filter_status, $valid_statuses, true ) )
 | |
| 			? $valid_statuses
 | |
| 			: array( $filter_status );
 | |
| 
 | |
| 		$args = array(
 | |
| 			'post_type'      => Tribe__Events__Main::POSTTYPE,
 | |
| 			'author'         => $this->user_id, // Use author consistently
 | |
| 			'post_status'    => $post_status,
 | |
| 			'posts_per_page' => -1,
 | |
| 			'orderby'        => 'meta_value',
 | |
| 			'meta_key'       => '_EventStartDate',
 | |
| 			'order'          => 'DESC',
 | |
| 		);
 | |
| 
 | |
| 		$query = new WP_Query( $args );
 | |
| 
 | |
| 		if ( $query->have_posts() ) {
 | |
| 			while ( $query->have_posts() ) {
 | |
| 				$query->the_post();
 | |
| 				$event_id = get_the_ID();
 | |
| 
 | |
| 				// Get Capacity
 | |
| 				$total_capacity = 0;
 | |
| 				if ( function_exists( 'tribe_get_tickets' ) ) {
 | |
| 					$tickets = tribe_get_tickets( $event_id );
 | |
| 					if ( $tickets ) {
 | |
| 						foreach ( $tickets as $ticket ) {
 | |
| 							$capacity = $ticket->capacity();
 | |
| 							if ( $capacity === -1 ) {
 | |
| 								$total_capacity = -1;
 | |
| 								break;
 | |
| 							}
 | |
| 							if ( is_numeric( $capacity ) ) {
 | |
| 								$total_capacity += $capacity;
 | |
| 							}
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				$sold = get_post_meta( $event_id, '_tribe_tickets_sold', true );
 | |
| 				$revenue = get_post_meta( $event_id, '_tribe_revenue_total', true );
 | |
| 
 | |
| 				$events_data[] = array(
 | |
| 					'id'        => $event_id,
 | |
| 					'status'    => get_post_status( $event_id ),
 | |
| 					'name'      => get_the_title(),
 | |
| 					'link'      => get_permalink( $event_id ),
 | |
| 					'start_date_ts' => strtotime( get_post_meta( $event_id, '_EventStartDate', true ) ),
 | |
| 					'organizer_id' => (int) get_post_meta( $event_id, '_EventOrganizerID', true ),
 | |
| 					'capacity'  => ( $total_capacity === -1 ) ? 'Unlimited' : (int) $total_capacity,
 | |
| 					'sold'      => is_numeric( $sold ) ? (int) $sold : 0,
 | |
| 					'revenue'   => is_numeric( $revenue ) ? (float) $revenue : 0.0,
 | |
| 				);
 | |
| 			}
 | |
| 			wp_reset_postdata();
 | |
| 		}
 | |
| 
 | |
| 		return $events_data;
 | |
| 	}
 | |
| } |