aggregate_day( $yesterday ); // Re-aggregate the current day's live data as well. $today = current_time( 'Y-m-d' ); $this->aggregate_day( $today ); // Refresh all totals cache rows. $this->refresh_all_totals(); wp_cache_flush_group( 'pulseviews' ); } /** * Aggregate all views for a given date into the aggregates table. * * Uses INSERT ... ON DUPLICATE KEY UPDATE for idempotency — safe to re-run. */ public function aggregate_day( string $date ): void { global $wpdb; $views_table = $wpdb->prefix . 'pulseviews_views'; $agg_table = $wpdb->prefix . 'pulseviews_aggregates'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->query( $wpdb->prepare( "INSERT INTO %i (post_id, period_date, period_type, view_count, unique_count) SELECT post_id, DATE(viewed_at) AS period_date, 'day' AS period_type, COUNT(*) AS view_count, COUNT(DISTINCT ip_hash) AS unique_count FROM %i WHERE DATE(viewed_at) = %s AND is_bot = 0 GROUP BY post_id ON DUPLICATE KEY UPDATE view_count = VALUES(view_count), unique_count = VALUES(unique_count)", $agg_table, $views_table, $date ) ); } // <--- MAKE SURE THIS CLOSING BRACE IS HERE TO CLOSE THE METHOD! /** * Rebuild all pulseviews_post_totals rows from the aggregates table. * * More efficient than recalculating from raw views on large sites. */ private function refresh_all_totals(): void { global $wpdb; $agg_table = $wpdb->prefix . 'pulseviews_aggregates'; $totals_table = $wpdb->prefix . 'pulseviews_post_totals'; $today = current_time( 'Y-m-d' ); $week_start = gmdate( 'Y-m-d', strtotime( 'monday this week', current_time( 'timestamp' ) ) ); $month_start = current_time( 'Y-m' ) . '-01'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->query( $wpdb->prepare( "INSERT INTO %i (post_id, total_views, today_views, week_views, month_views) SELECT post_id, SUM(view_count) AS total_views, SUM(CASE WHEN period_date = %s THEN view_count ELSE 0 END) AS today_views, SUM(CASE WHEN period_date >= %s THEN view_count ELSE 0 END) AS week_views, SUM(CASE WHEN period_date >= %s THEN view_count ELSE 0 END) AS month_views FROM %i WHERE period_type = 'day' GROUP BY post_id ON DUPLICATE KEY UPDATE total_views = VALUES(total_views), today_views = VALUES(today_views), week_views = VALUES(week_views), month_views = VALUES(month_views)", $totals_table, $today, $week_start, $month_start, $agg_table ) ); // phpcs:enable } }