@@ -64,9 +64,19 @@ public static function get_announcements($request) {
6464 $ active_only = !isset ($ params ['active ' ]) || $ params ['active ' ] !== 'false ' ;
6565 $ orderby = isset ($ params ['orderby ' ]) ? sanitize_text_field ($ params ['orderby ' ]) : 'date ' ;
6666 $ order = isset ($ params ['order ' ]) ? strtoupper (sanitize_text_field ($ params ['order ' ])) : '' ;
67+ $ timezone = isset ($ params ['timezone ' ]) ? urldecode (sanitize_text_field (wp_unslash ($ params ['timezone ' ]))) : wp_timezone_string ();
68+ $ current_time = isset ($ params ['current_time ' ]) ? sanitize_text_field (wp_unslash ($ params ['current_time ' ])) : null ;
6769
6870 $ today = current_time ('Y-m-d ' );
6971
72+ // Create DateTime object for current time with proper timezone
73+ if ($ current_time ) {
74+ $ now = new \DateTime ($ current_time );
75+ $ now ->setTimezone (new \DateTimeZone ($ timezone ));
76+ } else {
77+ $ now = new \DateTime ('now ' , new \DateTimeZone ($ timezone ));
78+ }
79+
7080 $ args = [
7181 'post_type ' => 'mayo_announcement ' ,
7282 'post_status ' => 'publish ' ,
@@ -144,9 +154,46 @@ public static function get_announcements($request) {
144154
145155 $ posts = get_posts ($ args );
146156
157+ // Post-filter based on end time if active_only is enabled
158+ // The meta_query only checks dates, so we need to filter by time here
159+ if ($ active_only ) {
160+ $ posts = array_filter ($ posts , function ($ post ) use ($ now , $ timezone ) {
161+ $ end_date_str = get_post_meta ($ post ->ID , 'display_end_date ' , true );
162+
163+ // If no end date, the announcement is considered active
164+ if (empty ($ end_date_str )) {
165+ return true ;
166+ }
167+
168+ $ end_time_str = get_post_meta ($ post ->ID , 'display_end_time ' , true );
169+
170+ // Use the announcement's own timezone if set, otherwise fall back to request timezone
171+ $ announcement_timezone = get_post_meta ($ post ->ID , 'display_timezone ' , true );
172+ $ effective_timezone = !empty ($ announcement_timezone ) ? $ announcement_timezone : $ timezone ;
173+
174+ // Create end DateTime with proper time and timezone
175+ $ tz = new \DateTimeZone ($ effective_timezone );
176+ $ end_datetime = new \DateTime ($ end_date_str , $ tz );
177+ if (!empty ($ end_time_str )) {
178+ $ time_parts = explode (': ' , $ end_time_str );
179+ $ end_datetime ->setTime (
180+ (int )($ time_parts [0 ] ?? 23 ),
181+ (int )($ time_parts [1 ] ?? 59 ),
182+ (int )($ time_parts [2 ] ?? 59 )
183+ );
184+ } else {
185+ // If no end time specified, use end of day
186+ $ end_datetime ->setTime (23 , 59 , 59 );
187+ }
188+
189+ // Announcement is active if end datetime is in the future
190+ return $ end_datetime >= $ now ;
191+ });
192+ }
193+
147194 $ announcements = [];
148195 foreach ($ posts as $ post ) {
149- $ announcements [] = self ::format_announcement ($ post );
196+ $ announcements [] = self ::format_announcement ($ post, $ now );
150197 }
151198
152199 // Sort announcements
@@ -377,9 +424,10 @@ private static function send_submission_email($post_id, $params) {
377424 * Format announcement data for API response
378425 *
379426 * @param \WP_Post $post
427+ * @param \DateTime|null $now Current DateTime for is_active calculation
380428 * @return array
381429 */
382- public static function format_announcement ($ post ) {
430+ public static function format_announcement ($ post, $ now = null ) {
383431 $ linked_refs = Announcement::get_linked_event_refs ($ post ->ID );
384432 $ linked_event_data = [];
385433
@@ -423,17 +471,57 @@ public static function format_announcement($post) {
423471 }
424472 }
425473
426- // Calculate is_active based on display dates
427- $ today = current_time ('Y-m-d ' );
474+ // Calculate is_active based on display dates and times
428475 $ display_start_date = get_post_meta ($ post ->ID , 'display_start_date ' , true );
476+ $ display_start_time = get_post_meta ($ post ->ID , 'display_start_time ' , true );
429477 $ display_end_date = get_post_meta ($ post ->ID , 'display_end_date ' , true );
478+ $ display_end_time = get_post_meta ($ post ->ID , 'display_end_time ' , true );
479+ $ display_timezone = get_post_meta ($ post ->ID , 'display_timezone ' , true );
480+
481+ // Use provided $now or fall back to current time
482+ if (!$ now ) {
483+ $ now = new \DateTime ('now ' , new \DateTimeZone (wp_timezone_string ()));
484+ }
485+
486+ // Use the announcement's own timezone if set, otherwise get timezone from $now
487+ $ tz = !empty ($ display_timezone ) ? new \DateTimeZone ($ display_timezone ) : $ now ->getTimezone ();
430488
431489 $ is_active = true ;
432- if ($ display_start_date && $ display_start_date > $ today ) {
433- $ is_active = false ;
490+
491+ // Check start date/time
492+ if ($ display_start_date ) {
493+ $ start_datetime = new \DateTime ($ display_start_date , $ tz );
494+ if (!empty ($ display_start_time )) {
495+ $ time_parts = explode (': ' , $ display_start_time );
496+ $ start_datetime ->setTime (
497+ (int )($ time_parts [0 ] ?? 0 ),
498+ (int )($ time_parts [1 ] ?? 0 ),
499+ (int )($ time_parts [2 ] ?? 0 )
500+ );
501+ } else {
502+ $ start_datetime ->setTime (0 , 0 , 0 );
503+ }
504+ if ($ start_datetime > $ now ) {
505+ $ is_active = false ;
506+ }
434507 }
435- if ($ display_end_date && $ display_end_date < $ today ) {
436- $ is_active = false ;
508+
509+ // Check end date/time
510+ if ($ display_end_date && $ is_active ) {
511+ $ end_datetime = new \DateTime ($ display_end_date , $ tz );
512+ if (!empty ($ display_end_time )) {
513+ $ time_parts = explode (': ' , $ display_end_time );
514+ $ end_datetime ->setTime (
515+ (int )($ time_parts [0 ] ?? 23 ),
516+ (int )($ time_parts [1 ] ?? 59 ),
517+ (int )($ time_parts [2 ] ?? 59 )
518+ );
519+ } else {
520+ $ end_datetime ->setTime (23 , 59 , 59 );
521+ }
522+ if ($ end_datetime < $ now ) {
523+ $ is_active = false ;
524+ }
437525 }
438526
439527 $ permalink = get_permalink ($ post ->ID );
@@ -453,6 +541,7 @@ public static function format_announcement($post) {
453541 'display_start_time ' => get_post_meta ($ post ->ID , 'display_start_time ' , true ),
454542 'display_end_date ' => $ display_end_date ,
455543 'display_end_time ' => get_post_meta ($ post ->ID , 'display_end_time ' , true ),
544+ 'display_timezone ' => $ display_timezone ,
456545 'priority ' => get_post_meta ($ post ->ID , 'priority ' , true ) ?: 'normal ' ,
457546 'service_body ' => get_post_meta ($ post ->ID , 'service_body ' , true ) ?: '' ,
458547 'is_active ' => $ is_active ,
0 commit comments