perf: Add query result caching to master dashboard data methods

- Added wp_cache_get/set with 15-minute TTL to all expensive DB queries:
  - get_total_events_count()
  - get_upcoming_events_count()
  - get_past_events_count()
  - get_total_tickets_sold()
  - get_total_revenue()
- Reduces database load for master dashboard by caching aggregate statistics
- Improves page load performance for master trainer users
- Cache keys use 'hvac_master_dashboard' group for organized cache management

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
bengizmo 2025-08-06 17:02:14 -03:00
parent bffe04200d
commit 8faf2791cd

View file

@ -36,6 +36,14 @@ class HVAC_Master_Dashboard_Data {
* @return int
*/
public function get_total_events_count() {
// Check cache first
$cache_key = 'hvac_master_total_events_count';
$cached_count = wp_cache_get($cache_key, 'hvac_master_dashboard');
if ($cached_count !== false) {
return (int) $cached_count;
}
global $wpdb;
// Get all events from all trainers with hvac_trainer or hvac_master_trainer role
@ -55,6 +63,9 @@ class HVAC_Master_Dashboard_Data {
array_merge([Tribe__Events__Main::POSTTYPE], $trainer_users)
) );
// Cache for 15 minutes
wp_cache_set($cache_key, $count, 'hvac_master_dashboard', 900);
return (int) $count;
}
@ -65,6 +76,15 @@ class HVAC_Master_Dashboard_Data {
*/
public function get_upcoming_events_count() {
global $wpdb;
// Check cache first
$cache_key = 'hvac_master_upcoming_events_count';
$cached_count = wp_cache_get($cache_key, 'hvac_master_dashboard');
if ($cached_count !== false) {
return (int) $cached_count;
}
$today = date( 'Y-m-d H:i:s' );
$trainer_users = $this->get_all_trainer_user_ids();
@ -85,6 +105,9 @@ class HVAC_Master_Dashboard_Data {
array_merge([Tribe__Events__Main::POSTTYPE], $trainer_users, [$today])
) );
// Cache for 15 minutes
wp_cache_set($cache_key, $count, 'hvac_master_dashboard', 900);
return (int) $count;
}
@ -95,6 +118,15 @@ class HVAC_Master_Dashboard_Data {
*/
public function get_past_events_count() {
global $wpdb;
// Check cache first
$cache_key = 'hvac_master_past_events_count';
$cached_count = wp_cache_get($cache_key, 'hvac_master_dashboard');
if ($cached_count !== false) {
return (int) $cached_count;
}
$today = date( 'Y-m-d H:i:s' );
$trainer_users = $this->get_all_trainer_user_ids();
@ -115,6 +147,9 @@ class HVAC_Master_Dashboard_Data {
array_merge([Tribe__Events__Main::POSTTYPE], $trainer_users, [$today])
) );
// Cache for 15 minutes
wp_cache_set($cache_key, $count, 'hvac_master_dashboard', 900);
return (int) $count;
}
@ -126,6 +161,14 @@ class HVAC_Master_Dashboard_Data {
public function get_total_tickets_sold() {
global $wpdb;
// Check cache first
$cache_key = 'hvac_master_total_tickets_sold';
$cached_count = wp_cache_get($cache_key, 'hvac_master_dashboard');
if ($cached_count !== false) {
return (int) $cached_count;
}
$trainer_users = $this->get_all_trainer_user_ids();
if (empty($trainer_users)) {
@ -164,7 +207,12 @@ class HVAC_Master_Dashboard_Data {
// Note: RSVP attendees are not counted as "tickets sold" since they are free registrations
return (int) ($tec_commerce_count + $tribe_tpp_count);
$total_count = (int) ($tec_commerce_count + $tribe_tpp_count);
// Cache for 15 minutes
wp_cache_set($cache_key, $total_count, 'hvac_master_dashboard', 900);
return $total_count;
}
/**
@ -175,6 +223,14 @@ class HVAC_Master_Dashboard_Data {
public function get_total_revenue() {
global $wpdb;
// Check cache first
$cache_key = 'hvac_master_total_revenue';
$cached_revenue = wp_cache_get($cache_key, 'hvac_master_dashboard');
if ($cached_revenue !== false) {
return (float) $cached_revenue;
}
$trainer_users = $this->get_all_trainer_user_ids();
if (empty($trainer_users)) {
@ -226,7 +282,12 @@ class HVAC_Master_Dashboard_Data {
// Note: RSVP attendees typically don't have revenue (free tickets)
return (float) (($tec_commerce_revenue ?: 0.00) + ($tribe_tpp_revenue ?: 0.00));
$total_revenue = (float) (($tec_commerce_revenue ?: 0.00) + ($tribe_tpp_revenue ?: 0.00));
// Cache for 15 minutes
wp_cache_set($cache_key, $total_revenue, 'hvac_master_dashboard', 900);
return $total_revenue;
}
/**