Skip to content

Commit ba16f73

Browse files
zeus2611kraftbj
authored andcommitted
feat: add specific time scheduling to preload
1 parent a67014c commit ba16f73

3 files changed

Lines changed: 142 additions & 10 deletions

File tree

partials/preload.php

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<div class="wpsc-settings-inner">
22
<?php
3-
global $wp_cache_preload_posts;
3+
global $wp_cache_preload_posts, $preload_schedule_type, $preload_scheduled_time, $preload_schedule_interval;
44

55
echo '<a name="preload"></a>';
66
if ( ! $cache_enabled || ! $super_cache_enabled || true === defined( 'DISABLESUPERCACHEPRELOADING' ) ) {
@@ -17,6 +17,17 @@
1717

1818
$min_refresh_interval = wpsc_get_minimum_preload_interval();
1919

20+
// Set defaults for preload scheduler variables if not set.
21+
if ( ! isset( $preload_schedule_type ) ) {
22+
$preload_schedule_type = 'interval';
23+
}
24+
if ( ! isset( $preload_scheduled_time ) ) {
25+
$preload_scheduled_time = '00:00';
26+
}
27+
if ( ! isset( $preload_schedule_interval ) ) {
28+
$preload_schedule_interval = 'daily';
29+
}
30+
2031
echo '<div class="wpsc-card">';
2132
echo '<p>' . __( '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' ) . '</p>';
2233
echo '<p>' . __( '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' ) . '</p>';
@@ -26,7 +37,6 @@
2637
echo '<input type="hidden" name="page" value="wpsupercache" />';
2738
echo '</div>';
2839
echo '<div class="wpsc-card">';
29-
echo '<p>' . sprintf( __( 'Refresh preloaded cache files every %s minutes. (0 to disable, minimum %d minutes.)', 'wp-super-cache' ), "<input type='text' size=4 name='wp_cache_preload_interval' value='" . (int) $wp_cache_preload_interval . "' />", $min_refresh_interval ) . '</p>';
3040
if ( $count > 100 ) {
3141
$step = (int)( $count / 10 );
3242

@@ -66,6 +76,36 @@
6676
echo '<input type="hidden" name="wp_cache_preload_posts" value="' . $count . '" />';
6777
}
6878

79+
// Preload Scheduler UI
80+
echo "<script type='text/javascript'>";
81+
echo "jQuery(function () {
82+
jQuery('#preload_interval_time').on('click',function () {
83+
jQuery('#preload_schedule_interval_radio').attr('checked', true);
84+
});
85+
jQuery('#preload_scheduled_time').on('click',function () {
86+
jQuery('#preload_schedule_time_radio').attr('checked', true);
87+
});
88+
jQuery('#preload_scheduled_select').on('click',function () {
89+
jQuery('#preload_schedule_time_radio').attr('checked', true);
90+
});
91+
});";
92+
echo "</script>";
93+
94+
echo '<table class="form-table">';
95+
echo '<tr><td valign="top"><strong>' . esc_html__( 'Scheduler', 'wp-super-cache' ) . '</strong></td><td><table cellpadding=0 cellspacing=0><tr><td valign="top"><input type="radio" id="preload_schedule_interval_radio" name="preload_schedule_type" value="interval" ' . checked( 'interval', $preload_schedule_type, false ) . ' /></td><td valign="top"><label for="preload_schedule_interval_radio">' . esc_html__( 'Timer:', 'wp-super-cache' ) . '</label></td>';
96+
echo "<td><input type='text' id='preload_interval_time' size=6 name='wp_cache_preload_interval' value='" . esc_attr( $wp_cache_preload_interval ) . "' /> " . esc_html__( 'minutes', 'wp-super-cache' ) . '<br />' . sprintf( esc_html__( 'Refresh preloaded cache files at this interval. (0 to disable, minimum %d minutes)', 'wp-super-cache' ), $min_refresh_interval ) . '</td></tr>';
97+
echo '<tr><td valign="top"><input type="radio" id="preload_schedule_time_radio" name="preload_schedule_type" value="time" ' . checked( 'time', $preload_schedule_type, false ) . ' /></td><td valign="top"><label for="preload_schedule_time_radio">' . esc_html__( 'Clock:', 'wp-super-cache' ) . '</label></td>';
98+
echo "<td><input type=\"text\" size=5 id='preload_scheduled_time' name='preload_scheduled_time' value=\"" . esc_attr( $preload_scheduled_time ) . "\" /> " . esc_html__( "HH:MM", 'wp-super-cache' ) . "<br />" . esc_html__( 'Start preloading at this time (UTC) or starting at this time every interval below.', 'wp-super-cache' ) . "</td></tr>";
99+
$schedules = wp_get_schedules();
100+
echo "<tr><td><br /></td><td><label for='preload_scheduled_select'>" . esc_html__( 'Interval:', 'wp-super-cache' ) . "</label></td><td><select id='preload_scheduled_select' name='preload_schedule_interval' size=1>";
101+
foreach( $schedules as $desc => $details ) {
102+
echo "<option value='$desc' " . selected( $desc, $preload_schedule_interval, false ) . " /> {$details[ 'display' ]}</option>";
103+
}
104+
echo "</select></td></tr>";
105+
echo '</table></td></tr>';
106+
echo '</table>';
107+
108+
69109
echo '<input type="checkbox" name="wp_cache_preload_on" value="1" ';
70110
echo $wp_cache_preload_on == 1 ? 'checked=1' : '';
71111
echo ' /> ' . __( 'Preload mode (garbage collection disabled. Recommended.)', 'wp-super-cache' ) . '<br />';

wp-cache-config-sample.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@
9494
$wp_cache_preload_taxonomies = 0;
9595
$wp_cache_preload_email_me = 0;
9696
$wp_cache_preload_email_volume = 'none';
97+
$preload_schedule_type = 'interval';
98+
$preload_scheduled_time = '00:00';
99+
$preload_schedule_interval = 'daily';
97100
$wp_cache_mobile_prefixes = '';
98101
$cached_direct_pages = array();
99102
$wpsc_served_header = false;

wp-cache.php

Lines changed: 97 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

40144042
function 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

Comments
 (0)