From 9ff4de31632a09aa25e98ef6629650d25ba034f7 Mon Sep 17 00:00:00 2001 From: Nischay Date: Sat, 7 Feb 2026 19:20:43 +0530 Subject: [PATCH 1/2] [WP Super Cache] Add time-based scheduling option for cache preloading alongside existing interval-based refresh. --- .../plugins/super-cache/partials/preload.php | 44 +++++++- .../super-cache/wp-cache-config-sample.php | 3 + projects/plugins/super-cache/wp-cache.php | 105 ++++++++++++++++-- 3 files changed, 142 insertions(+), 10 deletions(-) diff --git a/projects/plugins/super-cache/partials/preload.php b/projects/plugins/super-cache/partials/preload.php index 34b8cbb664ac..36e2cf91e5cf 100644 --- a/projects/plugins/super-cache/partials/preload.php +++ b/projects/plugins/super-cache/partials/preload.php @@ -1,6 +1,6 @@
'; if ( ! $cache_enabled || ! $super_cache_enabled || true === defined( 'DISABLESUPERCACHEPRELOADING' ) ) { @@ -17,6 +17,17 @@ $min_refresh_interval = wpsc_get_minimum_preload_interval(); +// Set defaults for preload scheduler variables if not set. +if ( ! isset( $preload_schedule_type ) ) { + $preload_schedule_type = 'interval'; +} +if ( ! isset( $preload_scheduled_time ) ) { + $preload_scheduled_time = '00:00'; +} +if ( ! isset( $preload_schedule_interval ) ) { + $preload_schedule_interval = 'daily'; +} + echo '
'; echo '

' . __( 'This will cache every published post and page on your site. It will create supercache static files so unknown visitors (including bots) will hit a cached page. This will probably help your Google ranking as they are using speed as a metric when judging websites now.', 'wp-super-cache' ) . '

'; echo '

' . __( 'Preloading creates lots of files however. Caching is done from the newest post to the oldest so please consider only caching the newest if you have lots (10,000+) of posts. This is especially important on shared hosting.', 'wp-super-cache' ) . '

'; @@ -26,7 +37,6 @@ echo ''; echo '
'; echo '
'; -echo '

' . sprintf( __( 'Refresh preloaded cache files every %s minutes. (0 to disable, minimum %d minutes.)', 'wp-super-cache' ), "", $min_refresh_interval ) . '

'; if ( $count > 100 ) { $step = (int)( $count / 10 ); @@ -66,6 +76,36 @@ echo ''; } +// Preload Scheduler UI +echo ""; + +echo ''; +echo ''; +echo '
' . esc_html__( 'Scheduler', 'wp-super-cache' ) . ''; +echo "'; +echo ''; +echo ""; +$schedules = wp_get_schedules(); +echo ""; +echo '
" . esc_html__( 'minutes', 'wp-super-cache' ) . '
' . sprintf( esc_html__( 'Refresh preloaded cache files at this interval. (0 to disable, minimum %d minutes)', 'wp-super-cache' ), $min_refresh_interval ) . '
" . esc_html__( "HH:MM", 'wp-super-cache' ) . "
" . esc_html__( 'Start preloading at this time (UTC) or starting at this time every interval below.', 'wp-super-cache' ) . "

'; + + echo ' ' . __( 'Preload mode (garbage collection disabled. Recommended.)', 'wp-super-cache' ) . '
'; diff --git a/projects/plugins/super-cache/wp-cache-config-sample.php b/projects/plugins/super-cache/wp-cache-config-sample.php index 67b77b2d7040..ac4beec4f3f4 100644 --- a/projects/plugins/super-cache/wp-cache-config-sample.php +++ b/projects/plugins/super-cache/wp-cache-config-sample.php @@ -94,6 +94,9 @@ $wp_cache_preload_taxonomies = 0; $wp_cache_preload_email_me = 0; $wp_cache_preload_email_volume = 'none'; +$preload_schedule_type = 'interval'; +$preload_scheduled_time = '00:00'; +$preload_schedule_interval = 'daily'; $wp_cache_mobile_prefixes = ''; $cached_direct_pages = array(); $wpsc_served_header = false; diff --git a/projects/plugins/super-cache/wp-cache.php b/projects/plugins/super-cache/wp-cache.php index cca22741fd2b..3fd7ef364ae4 100644 --- a/projects/plugins/super-cache/wp-cache.php +++ b/projects/plugins/super-cache/wp-cache.php @@ -1083,6 +1083,7 @@ function toggleLayer( whichLayer ) { if ( 'preload' === $curr_tab ) { if ( true == $super_cache_enabled && ! defined( 'DISABLESUPERCACHEPRELOADING' ) ) { 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; + global $preload_schedule_type, $preload_scheduled_time, $preload_schedule_interval; wpsc_preload_settings(); $currently_preloading = false; @@ -3668,11 +3669,38 @@ function wp_cron_preload_cache() { } else { $msg = ''; wpsc_reset_preload_counter(); - if ( (int)$wp_cache_preload_interval && defined( 'DOING_CRON' ) ) { - if ( $wp_cache_preload_email_me ) - $msg = sprintf( __( 'Scheduling next preload refresh in %d minutes.', 'wp-super-cache' ), (int)$wp_cache_preload_interval ); - wp_cache_debug( "wp_cron_preload_cache: no more posts. scheduling next preload in $wp_cache_preload_interval minutes.", 5 ); - wp_schedule_single_event( time() + ( (int)$wp_cache_preload_interval * 60 ), 'wp_cache_full_preload_hook' ); + global $preload_schedule_type, $preload_scheduled_time, $preload_schedule_interval; + + // Set defaults if not set + if ( ! isset( $preload_schedule_type ) ) { + $preload_schedule_type = 'interval'; + } + + if ( defined( 'DOING_CRON' ) ) { + if ( $preload_schedule_type === 'interval' && (int)$wp_cache_preload_interval ) { + // Interval-based scheduling + if ( $wp_cache_preload_email_me ) + $msg = sprintf( __( 'Scheduling next preload refresh in %d minutes.', 'wp-super-cache' ), (int)$wp_cache_preload_interval ); + wp_cache_debug( "wp_cron_preload_cache: no more posts. scheduling next preload in $wp_cache_preload_interval minutes.", 5 ); + wp_schedule_single_event( time() + ( (int)$wp_cache_preload_interval * 60 ), 'wp_cache_full_preload_hook' ); + } elseif ( $preload_schedule_type === 'time' ) { + // Time-based scheduling - the event will already be scheduled as recurring + // Check if already scheduled, if not schedule it + if ( ! wp_next_scheduled( 'wp_cache_full_preload_hook' ) ) { + if ( ! isset( $preload_scheduled_time ) ) { + $preload_scheduled_time = '00:00'; + } + if ( ! isset( $preload_schedule_interval ) ) { + $preload_schedule_interval = 'daily'; + } + $schedules = wp_get_schedules(); + $interval_display = isset( $schedules[ $preload_schedule_interval ]['display'] ) ? $schedules[ $preload_schedule_interval ]['display'] : $preload_schedule_interval; + if ( $wp_cache_preload_email_me ) + $msg = sprintf( __( 'Scheduling next preload at %s (%s).', 'wp-super-cache' ), $preload_scheduled_time, $interval_display ); + wp_cache_debug( "wp_cron_preload_cache: no more posts. scheduling next preload at $preload_scheduled_time ($preload_schedule_interval).", 5 ); + wp_schedule_event( strtotime( $preload_scheduled_time ), $preload_schedule_interval, 'wp_cache_full_preload_hook' ); + } + } } global $file_prefix, $cache_max_time; if ( $wp_cache_preload_interval > 0 ) { @@ -4003,6 +4031,7 @@ function wpsc_get_minimum_preload_interval() { function wpsc_preload_settings() { 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; + global $preload_schedule_type, $preload_scheduled_time, $preload_schedule_interval, $wp_cache_config_file; if ( isset( $_POST[ 'action' ] ) == false || $_POST[ 'action' ] != 'preload' ) return; @@ -4026,6 +4055,40 @@ function wpsc_preload_settings() { // Set to true if the preload interval is changed, and a reschedule is required. $force_preload_reschedule = false; + // Handle preload schedule type (interval vs time) + if ( isset( $_POST['preload_schedule_type'] ) ) { + $new_schedule_type = in_array( $_POST['preload_schedule_type'], array( 'interval', 'time' ), true ) ? $_POST['preload_schedule_type'] : 'interval'; + if ( ! isset( $preload_schedule_type ) || $preload_schedule_type !== $new_schedule_type ) { + $force_preload_reschedule = true; + } + $preload_schedule_type = $new_schedule_type; + wp_cache_setting( 'preload_schedule_type', $preload_schedule_type ); + } + + // Handle preload scheduled time (HH:MM format) + if ( isset( $_POST['preload_scheduled_time'] ) ) { + $new_scheduled_time = sanitize_text_field( $_POST['preload_scheduled_time'] ); + if ( ! preg_match( '/^[0-9]{2}:[0-9]{2}$/', $new_scheduled_time ) ) { + $new_scheduled_time = '00:00'; + } + if ( ! isset( $preload_scheduled_time ) || $preload_scheduled_time !== $new_scheduled_time ) { + $force_preload_reschedule = true; + } + $preload_scheduled_time = $new_scheduled_time; + wp_cache_setting( 'preload_scheduled_time', $preload_scheduled_time ); + } + + // Handle preload schedule interval (hourly, twicedaily, daily, etc.) + if ( isset( $_POST['preload_schedule_interval'] ) ) { + $schedules = wp_get_schedules(); + $new_schedule_interval = isset( $schedules[ $_POST['preload_schedule_interval'] ] ) ? $_POST['preload_schedule_interval'] : 'daily'; + if ( ! isset( $preload_schedule_interval ) || $preload_schedule_interval !== $new_schedule_interval ) { + $force_preload_reschedule = true; + } + $preload_schedule_interval = $new_schedule_interval; + wp_cache_setting( 'preload_schedule_interval', $preload_schedule_interval ); + } + if ( isset( $_POST[ 'wp_cache_preload_interval' ] ) && ( $_POST[ 'wp_cache_preload_interval' ] == 0 || $_POST[ 'wp_cache_preload_interval' ] >= $min_refresh_interval ) ) { $_POST[ 'wp_cache_preload_interval' ] = (int)$_POST[ 'wp_cache_preload_interval' ]; if ( $wp_cache_preload_interval != $_POST[ 'wp_cache_preload_interval' ] ) { @@ -4070,9 +4133,21 @@ function wpsc_preload_settings() { } wp_cache_setting( 'wp_cache_preload_on', $wp_cache_preload_on ); + // Set defaults if not set + if ( ! isset( $preload_schedule_type ) ) { + $preload_schedule_type = 'interval'; + } + // Ensure that preload settings are applied to scheduled cron. - $next_preload = wp_next_scheduled( 'wp_cache_full_preload_hook' ); - $should_schedule = ( $wp_cache_preload_on === 1 && $wp_cache_preload_interval > 0 ); + $next_preload = wp_next_scheduled( 'wp_cache_full_preload_hook' ); + + // Determine if we should schedule based on schedule type + if ( $preload_schedule_type === 'interval' ) { + $should_schedule = ( $wp_cache_preload_on === 1 && $wp_cache_preload_interval > 0 ); + } else { + // For time-based scheduling, we schedule if preload mode is on + $should_schedule = ( $wp_cache_preload_on === 1 ); + } // If forcing a reschedule, or preload is disabled, clear the next scheduled event. if ( $next_preload && ( ! $should_schedule || $force_preload_reschedule ) ) { @@ -4080,6 +4155,7 @@ function wpsc_preload_settings() { wpsc_reset_preload_counter(); wpsc_create_stop_preload_flag(); wp_unschedule_event( $next_preload, 'wp_cache_full_preload_hook' ); + wp_clear_scheduled_hook( 'wp_cache_full_preload_hook' ); $next_preload = 0; } @@ -4087,7 +4163,20 @@ function wpsc_preload_settings() { // Ensure a preload is scheduled if it should be. if ( ! $next_preload && $should_schedule ) { wp_cache_debug( 'Scheduling new preload event' ); - wp_schedule_single_event( time() + ( $wp_cache_preload_interval * 60 ), 'wp_cache_full_preload_hook' ); + + if ( $preload_schedule_type === 'interval' ) { + // Interval-based: schedule single event X minutes from now + wp_schedule_single_event( time() + ( $wp_cache_preload_interval * 60 ), 'wp_cache_full_preload_hook' ); + } else { + // Time-based: schedule recurring event at specific time + if ( ! isset( $preload_scheduled_time ) ) { + $preload_scheduled_time = '00:00'; + } + if ( ! isset( $preload_schedule_interval ) ) { + $preload_schedule_interval = 'daily'; + } + wp_schedule_event( strtotime( $preload_scheduled_time ), $preload_schedule_interval, 'wp_cache_full_preload_hook' ); + } } } From dda60b36371ca1dff0460e2a6dab464534251936 Mon Sep 17 00:00:00 2001 From: Nischay Date: Sat, 7 Feb 2026 19:29:08 +0530 Subject: [PATCH 2/2] Changelog --- .../super-cache/changelog/update-wpsc-preload-schedule | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 projects/plugins/super-cache/changelog/update-wpsc-preload-schedule diff --git a/projects/plugins/super-cache/changelog/update-wpsc-preload-schedule b/projects/plugins/super-cache/changelog/update-wpsc-preload-schedule new file mode 100644 index 000000000000..1861db17828f --- /dev/null +++ b/projects/plugins/super-cache/changelog/update-wpsc-preload-schedule @@ -0,0 +1,4 @@ +Significance: minor +Type: added + +Preload: Add option to schedule preloading at a specific time.