Skip to content

Commit

Permalink
Improve WP Cron setup and validation of schedules
Browse files Browse the repository at this point in the history
  • Loading branch information
raamdev committed Dec 7, 2015
1 parent 861cc45 commit 7a652a7
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 20 deletions.
21 changes: 5 additions & 16 deletions src/includes/classes/Plugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -255,8 +255,11 @@ public function setup()
/* Core/systematic plugin options. */

'version' => VERSION,
'crons_setup' => '0', // `0` or timestamp.
'welcomed' => '0', // `0|1` welcomed yet?
'crons_setup' => '0', // A timestamp when last set up.
'crons_setup_on_namespace' => '', // The namespace on which they were set up.
'crons_setup_with_cache_cleanup_schedule' => '', // The cleanup schedule selected by site owner during last setup.
'crons_setup_on_wp_with_schedules' => '', // A sha1 hash of `wp_get_schedules()`

/* Primary switch; enable? */

Expand Down Expand Up @@ -428,6 +431,7 @@ public function setup()

add_action('init', array($this, 'checkAdvancedCache'));
add_action('init', array($this, 'checkBlogPaths'));
add_action('init', array($this, 'checkCronSetup'), PHP_INT_MAX);
add_action('wp_loaded', array($this, 'actions'));

add_action('admin_init', array($this, 'checkVersion'));
Expand Down Expand Up @@ -543,21 +547,6 @@ public function setup()

if (!is_multisite() || is_main_site()) { // Main site only.
add_filter('cron_schedules', array($this, 'extendCronSchedules'));

if ($_schedules = wp_get_schedules() && !isset($_schedules[$this->options['cache_cleanup_schedule']])) { // Schedule no longer exists; reset to default
$this->updateOptions(array('cache_cleanup_schedule' => $this->default_options['cache_cleanup_schedule'], 'crons_setup' => '0'));
unset($_schedules);
}
if ((integer) $this->options['crons_setup'] < 1449411081 || substr($this->options['crons_setup'], 10) !== '-'.__NAMESPACE__.'-'.$this->options['cache_cleanup_schedule']) {
wp_clear_scheduled_hook('_cron_'.GLOBAL_NS.'_cleanup');
wp_schedule_event(time() + 60, $this->options['cache_cleanup_schedule'], '_cron_'.GLOBAL_NS.'_cleanup');

/*[pro strip-from="lite"]*/ // Auto-cache engine.
wp_clear_scheduled_hook('_cron_'.GLOBAL_NS.'_auto_cache');
wp_schedule_event(time() + 60, 'every15m', '_cron_'.GLOBAL_NS.'_auto_cache');
/*[/pro]*/
$this->updateOptions(array('crons_setup' => time().'-'.__NAMESPACE__.'-'.$this->options['cache_cleanup_schedule']));
}
add_action('_cron_'.GLOBAL_NS.'_cleanup', array($this, 'cleanupCache'));

/*[pro strip-from="lite"]*/ // Auto-cache engine.
Expand Down
46 changes: 44 additions & 2 deletions src/includes/closures/Plugin/CronUtils.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,49 @@
return $schedules;
};

/*
* Checks Cron setup, validates schedules, and reschedules events if necessary.
*
* @attaches-to `init` hook.
*
* @since 15xxxx Improving WP Cron setup and validation of schedules
*/
$self->checkCronSetup = function () use ($self) {
if ($self->options['crons_setup'] < 1439005906
|| $self->options['crons_setup_on_namespace'] !== __NAMESPACE__
|| $self->options['crons_setup_with_cache_cleanup_schedule'] !== $self->options['cache_cleanup_schedule']
|| $self->options['crons_setup_on_wp_with_schedules'] !== sha1(serialize(wp_get_schedules()))
|| !wp_next_scheduled('_cron_'.GLOBAL_NS.'_cleanup')
|| !wp_next_scheduled('_cron_'.GLOBAL_NS.'_auto_cache')
) {

wp_clear_scheduled_hook('_cron_'.GLOBAL_NS.'_cleanup');
wp_schedule_event(time() + 60, $self->options['cache_cleanup_schedule'], '_cron_'.GLOBAL_NS.'_cleanup');

/*[pro strip-from="lite"]*/ // Auto-cache engine.
wp_clear_scheduled_hook('_cron_'.GLOBAL_NS.'_auto_cache');
wp_schedule_event(time() + 60, 'every15m', '_cron_'.GLOBAL_NS.'_auto_cache');
/*[/pro]*/

$self->updateOptions(
array(
'crons_setup' => time(),
'crons_setup_on_namespace' => __NAMESPACE__,
'crons_setup_with_cache_cleanup_schedule' => $self->options['cache_cleanup_schedule'],
'crons_setup_on_wp_with_schedules' => sha1(serialize(wp_get_schedules()))
)
);
}
};

/*
* Resets `crons_setup` and clears WP-Cron schedules.
*
* @since 15xxxx Fixing bug with Auto-Cache Engine cron disappearing in some scenarios
*
* @note This MUST happen upon uninstall and deactivation due to buggy WP_Cron behavior. Events with a custom schedule will disappear when plugin is not active (see http://bit.ly/1lGdr78).
*/
$self->resetCronsSetup = function ( ) use ($self) {
$self->resetCronSetup = function ( ) use ($self) {
if (is_multisite()) { // Main site CRON jobs.
switch_to_blog(get_current_site()->blog_id);
wp_clear_scheduled_hook('_cron_'.GLOBAL_NS.'_auto_cache');
Expand All @@ -37,5 +72,12 @@
wp_clear_scheduled_hook('_cron_'.GLOBAL_NS.'_auto_cache');
wp_clear_scheduled_hook('_cron_'.GLOBAL_NS.'_cleanup');
}
$self->updateOptions(array('crons_setup' => '0')); // Reset so that crons are rescheduled upon next activation
$self->updateOptions(
array( // Reset so that crons are rescheduled upon next activation
'crons_setup' => $self->default_options['crons_setup'],
'crons_setup_on_namespace' => $self->default_options['crons_setup_on_namespace'],
'crons_setup_with_cache_cleanup_schedule' => $self->default_options['crons_setup_with_cache_cleanup_schedule'],
'crons_setup_on_wp_with_schedules' => $self->default_options['crons_setup_on_wp_with_schedules']
)
);
};
4 changes: 2 additions & 2 deletions src/includes/closures/Plugin/InstallUtils.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
$self->removeWpHtaccess();
$self->removeAdvancedCache();
$self->clearCache();
$self->resetCronsSetup();
$self->resetCronSetup();
};

/*
Expand All @@ -93,7 +93,7 @@
$self->removeWpHtaccess();
$self->removeAdvancedCache();
$self->wipeCache();
$self->resetCronsSetup();
$self->resetCronSetup();

if (!$self->options['uninstall_on_deletion']) {
return; // Nothing to do here.
Expand Down

0 comments on commit 7a652a7

Please sign in to comment.