@@ -1083,6 +1083,7 @@ function toggleLayer( whichLayer ) {
10831083 if ( 'preload ' === $ curr_tab ) {
10841084 if ( true == $ super_cache_enabled && ! defined ( 'DISABLESUPERCACHEPRELOADING ' ) ) {
10851085 global $ wp_cache_preload_interval , $ wp_cache_preload_on , $ wp_cache_preload_taxonomies , $ wp_cache_preload_email_me , $ wp_cache_preload_email_volume , $ wp_cache_preload_posts , $ wpdb ;
1086+ global $ preload_schedule_type , $ preload_scheduled_time , $ preload_schedule_interval ;
10861087 wpsc_preload_settings ();
10871088 $ currently_preloading = false ;
10881089
@@ -3678,11 +3679,38 @@ function wp_cron_preload_cache() {
36783679 } else {
36793680 $ msg = '' ;
36803681 wpsc_reset_preload_counter ();
3681- if ( (int )$ wp_cache_preload_interval && defined ( 'DOING_CRON ' ) ) {
3682- if ( $ wp_cache_preload_email_me )
3683- $ msg = sprintf ( __ ( 'Scheduling next preload refresh in %d minutes. ' , 'wp-super-cache ' ), (int )$ wp_cache_preload_interval );
3684- wp_cache_debug ( "wp_cron_preload_cache: no more posts. scheduling next preload in $ wp_cache_preload_interval minutes. " , 5 );
3685- wp_schedule_single_event ( time () + ( (int )$ wp_cache_preload_interval * 60 ), 'wp_cache_full_preload_hook ' );
3682+ global $ preload_schedule_type , $ preload_scheduled_time , $ preload_schedule_interval ;
3683+
3684+ // Set defaults if not set
3685+ if ( ! isset ( $ preload_schedule_type ) ) {
3686+ $ preload_schedule_type = 'interval ' ;
3687+ }
3688+
3689+ if ( defined ( 'DOING_CRON ' ) ) {
3690+ if ( $ preload_schedule_type === 'interval ' && (int )$ wp_cache_preload_interval ) {
3691+ // Interval-based scheduling
3692+ if ( $ wp_cache_preload_email_me )
3693+ $ msg = sprintf ( __ ( 'Scheduling next preload refresh in %d minutes. ' , 'wp-super-cache ' ), (int )$ wp_cache_preload_interval );
3694+ wp_cache_debug ( "wp_cron_preload_cache: no more posts. scheduling next preload in $ wp_cache_preload_interval minutes. " , 5 );
3695+ wp_schedule_single_event ( time () + ( (int )$ wp_cache_preload_interval * 60 ), 'wp_cache_full_preload_hook ' );
3696+ } elseif ( $ preload_schedule_type === 'time ' ) {
3697+ // Time-based scheduling - the event will already be scheduled as recurring
3698+ // Check if already scheduled, if not schedule it
3699+ if ( ! wp_next_scheduled ( 'wp_cache_full_preload_hook ' ) ) {
3700+ if ( ! isset ( $ preload_scheduled_time ) ) {
3701+ $ preload_scheduled_time = '00:00 ' ;
3702+ }
3703+ if ( ! isset ( $ preload_schedule_interval ) ) {
3704+ $ preload_schedule_interval = 'daily ' ;
3705+ }
3706+ $ schedules = wp_get_schedules ();
3707+ $ interval_display = isset ( $ schedules [ $ preload_schedule_interval ]['display ' ] ) ? $ schedules [ $ preload_schedule_interval ]['display ' ] : $ preload_schedule_interval ;
3708+ if ( $ wp_cache_preload_email_me )
3709+ $ msg = sprintf ( __ ( 'Scheduling next preload at %s (%s). ' , 'wp-super-cache ' ), $ preload_scheduled_time , $ interval_display );
3710+ wp_cache_debug ( "wp_cron_preload_cache: no more posts. scheduling next preload at $ preload_scheduled_time ( $ preload_schedule_interval). " , 5 );
3711+ wp_schedule_event ( strtotime ( $ preload_scheduled_time ), $ preload_schedule_interval , 'wp_cache_full_preload_hook ' );
3712+ }
3713+ }
36863714 }
36873715 global $ file_prefix , $ cache_max_time ;
36883716 if ( $ wp_cache_preload_interval > 0 ) {
@@ -4013,6 +4041,7 @@ function wpsc_get_minimum_preload_interval() {
40134041
40144042function wpsc_preload_settings () {
40154043 global $ wp_cache_preload_interval , $ wp_cache_preload_on , $ wp_cache_preload_taxonomies , $ wp_cache_preload_email_me , $ wp_cache_preload_email_volume , $ wp_cache_preload_posts , $ wpdb ;
4044+ global $ preload_schedule_type , $ preload_scheduled_time , $ preload_schedule_interval , $ wp_cache_config_file ;
40164045
40174046 if ( isset ( $ _POST [ 'action ' ] ) == false || $ _POST [ 'action ' ] != 'preload ' )
40184047 return ;
@@ -4036,6 +4065,40 @@ function wpsc_preload_settings() {
40364065 // Set to true if the preload interval is changed, and a reschedule is required.
40374066 $ force_preload_reschedule = false ;
40384067
4068+ // Handle preload schedule type (interval vs time)
4069+ if ( isset ( $ _POST ['preload_schedule_type ' ] ) ) {
4070+ $ new_schedule_type = in_array ( $ _POST ['preload_schedule_type ' ], array ( 'interval ' , 'time ' ), true ) ? $ _POST ['preload_schedule_type ' ] : 'interval ' ;
4071+ if ( ! isset ( $ preload_schedule_type ) || $ preload_schedule_type !== $ new_schedule_type ) {
4072+ $ force_preload_reschedule = true ;
4073+ }
4074+ $ preload_schedule_type = $ new_schedule_type ;
4075+ wp_cache_setting ( 'preload_schedule_type ' , $ preload_schedule_type );
4076+ }
4077+
4078+ // Handle preload scheduled time (HH:MM format)
4079+ if ( isset ( $ _POST ['preload_scheduled_time ' ] ) ) {
4080+ $ new_scheduled_time = sanitize_text_field ( $ _POST ['preload_scheduled_time ' ] );
4081+ if ( ! preg_match ( '/^[0-9]{2}:[0-9]{2}$/ ' , $ new_scheduled_time ) ) {
4082+ $ new_scheduled_time = '00:00 ' ;
4083+ }
4084+ if ( ! isset ( $ preload_scheduled_time ) || $ preload_scheduled_time !== $ new_scheduled_time ) {
4085+ $ force_preload_reschedule = true ;
4086+ }
4087+ $ preload_scheduled_time = $ new_scheduled_time ;
4088+ wp_cache_setting ( 'preload_scheduled_time ' , $ preload_scheduled_time );
4089+ }
4090+
4091+ // Handle preload schedule interval (hourly, twicedaily, daily, etc.)
4092+ if ( isset ( $ _POST ['preload_schedule_interval ' ] ) ) {
4093+ $ schedules = wp_get_schedules ();
4094+ $ new_schedule_interval = isset ( $ schedules [ $ _POST ['preload_schedule_interval ' ] ] ) ? $ _POST ['preload_schedule_interval ' ] : 'daily ' ;
4095+ if ( ! isset ( $ preload_schedule_interval ) || $ preload_schedule_interval !== $ new_schedule_interval ) {
4096+ $ force_preload_reschedule = true ;
4097+ }
4098+ $ preload_schedule_interval = $ new_schedule_interval ;
4099+ wp_cache_setting ( 'preload_schedule_interval ' , $ preload_schedule_interval );
4100+ }
4101+
40394102 if ( isset ( $ _POST [ 'wp_cache_preload_interval ' ] ) && ( $ _POST [ 'wp_cache_preload_interval ' ] == 0 || $ _POST [ 'wp_cache_preload_interval ' ] >= $ min_refresh_interval ) ) {
40404103 $ _POST [ 'wp_cache_preload_interval ' ] = (int )$ _POST [ 'wp_cache_preload_interval ' ];
40414104 if ( $ wp_cache_preload_interval != $ _POST [ 'wp_cache_preload_interval ' ] ) {
@@ -4080,24 +4143,50 @@ function wpsc_preload_settings() {
40804143 }
40814144 wp_cache_setting ( 'wp_cache_preload_on ' , $ wp_cache_preload_on );
40824145
4146+ // Set defaults if not set
4147+ if ( ! isset ( $ preload_schedule_type ) ) {
4148+ $ preload_schedule_type = 'interval ' ;
4149+ }
4150+
40834151 // Ensure that preload settings are applied to scheduled cron.
4084- $ next_preload = wp_next_scheduled ( 'wp_cache_full_preload_hook ' );
4085- $ should_schedule = ( $ wp_cache_preload_on === 1 && $ wp_cache_preload_interval > 0 );
4152+ $ next_preload = wp_next_scheduled ( 'wp_cache_full_preload_hook ' );
4153+
4154+ // Determine if we should schedule based on schedule type
4155+ if ( $ preload_schedule_type === 'interval ' ) {
4156+ $ should_schedule = ( $ wp_cache_preload_on === 1 && $ wp_cache_preload_interval > 0 );
4157+ } else {
4158+ // For time-based scheduling, we schedule if preload mode is on
4159+ $ should_schedule = ( $ wp_cache_preload_on === 1 );
4160+ }
40864161
40874162 // If forcing a reschedule, or preload is disabled, clear the next scheduled event.
40884163 if ( $ next_preload && ( ! $ should_schedule || $ force_preload_reschedule ) ) {
40894164 wp_cache_debug ( 'Clearing old preload event ' );
40904165 wpsc_reset_preload_counter ();
40914166 wpsc_create_stop_preload_flag ();
40924167 wp_unschedule_event ( $ next_preload , 'wp_cache_full_preload_hook ' );
4168+ wp_clear_scheduled_hook ( 'wp_cache_full_preload_hook ' );
40934169
40944170 $ next_preload = 0 ;
40954171 }
40964172
40974173 // Ensure a preload is scheduled if it should be.
40984174 if ( ! $ next_preload && $ should_schedule ) {
40994175 wp_cache_debug ( 'Scheduling new preload event ' );
4100- wp_schedule_single_event ( time () + ( $ wp_cache_preload_interval * 60 ), 'wp_cache_full_preload_hook ' );
4176+
4177+ if ( $ preload_schedule_type === 'interval ' ) {
4178+ // Interval-based: schedule single event X minutes from now
4179+ wp_schedule_single_event ( time () + ( $ wp_cache_preload_interval * 60 ), 'wp_cache_full_preload_hook ' );
4180+ } else {
4181+ // Time-based: schedule recurring event at specific time
4182+ if ( ! isset ( $ preload_scheduled_time ) ) {
4183+ $ preload_scheduled_time = '00:00 ' ;
4184+ }
4185+ if ( ! isset ( $ preload_schedule_interval ) ) {
4186+ $ preload_schedule_interval = 'daily ' ;
4187+ }
4188+ wp_schedule_event ( strtotime ( $ preload_scheduled_time ), $ preload_schedule_interval , 'wp_cache_full_preload_hook ' );
4189+ }
41014190 }
41024191}
41034192
0 commit comments