387 lines
13 KiB
PHP
387 lines
13 KiB
PHP
<?php
|
|
|
|
if (!defined('WPVIVID_PLUGIN_DIR')){
|
|
die;
|
|
}
|
|
|
|
class WPvivid_Schedule
|
|
{
|
|
protected $schedule_type = array(
|
|
'wpvivid_12hours' => '12Hours',
|
|
'twicedaily' => '12Hours',
|
|
'wpvivid_daily' => 'Daily',
|
|
'daily' => 'Daily',
|
|
'onceday' => 'Daily',
|
|
'wpvivid_weekly' => 'Weekly',
|
|
'weekly' => 'Weekly',
|
|
'wpvivid_fortnightly' => 'Fortnightly',
|
|
'fortnightly' => 'Fortnightly',
|
|
'wpvivid_monthly' => 'Monthly',
|
|
'monthly' => 'Monthly',
|
|
'montly' => 'Monthly'
|
|
);
|
|
|
|
public function __construct()
|
|
{
|
|
add_action('wpvivid_reset_schedule', array($this, 'wpvivid_reset_schedule'), 10);
|
|
}
|
|
|
|
public function wpvivid_cron_schedules($schedules)
|
|
{
|
|
if(!isset($schedules["wpvivid_12hours"])){
|
|
$schedules["wpvivid_12hours"] = array(
|
|
'interval' => 3600*12,
|
|
'display' => __('12 Hours', 'wpvivid-backuprestore'));
|
|
}
|
|
|
|
if(!isset($schedules["wpvivid_daily"])){
|
|
$schedules["wpvivid_daily"] = array(
|
|
'interval' => 86400 ,
|
|
'display' => __('Daily', 'wpvivid-backuprestore'));
|
|
}
|
|
|
|
if(!isset($schedules["wpvivid_weekly"])){
|
|
$schedules["wpvivid_weekly"] = array(
|
|
'interval' => 604800 ,
|
|
'display' => __('Weekly', 'wpvivid-backuprestore'));
|
|
}
|
|
|
|
if(!isset($schedules["wpvivid_fortnightly"])){
|
|
$schedules["wpvivid_fortnightly"] = array(
|
|
'interval' => 604800*2 ,
|
|
'display' => __('Fortnightly', 'wpvivid-backuprestore'));
|
|
}
|
|
|
|
if(!isset($schedules["wpvivid_monthly"])){
|
|
$schedules["wpvivid_monthly"] = array(
|
|
'interval' => 2592000 ,
|
|
'display' => __('Monthly', 'wpvivid-backuprestore'));
|
|
}
|
|
|
|
return $schedules;
|
|
}
|
|
|
|
public function check_schedule_type($display){
|
|
$schedules = wp_get_schedules();
|
|
$check_res = false;
|
|
$ret = array();
|
|
foreach ($this->schedule_type as $key => $value){
|
|
if($value == $display){
|
|
if(isset($schedules[$key])){
|
|
$check_res = true;
|
|
$ret['type']=$key;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
$ret['result']=$check_res;
|
|
return $ret;
|
|
}
|
|
|
|
public function output($html)
|
|
{
|
|
$html='';
|
|
|
|
$display_array = array("12Hours", "Daily", "Weekly", "Fortnightly", "Monthly");
|
|
foreach($display_array as $display){
|
|
$schedule_check = $this->check_schedule_type($display);
|
|
if($schedule_check['result']){
|
|
$html.=' <label><input type="radio" option="schedule" name="recurrence" value="'.$schedule_check['type'].'" />';
|
|
if($display === '12Hours'){
|
|
$html.='<span>'.__('12Hours', 'wpvivid-backuprestore').'</span></label><br>';
|
|
}
|
|
if($display === 'Daily'){
|
|
$html.='<span>'.__('Daily', 'wpvivid-backuprestore').'</span></label><br>';
|
|
}
|
|
if($display === 'Weekly'){
|
|
$html.='<span>'.__('Weekly', 'wpvivid-backuprestore').'</span></label><br>';
|
|
}
|
|
if($display === 'Fortnightly'){
|
|
$html.='<span>'.__('Fortnightly', 'wpvivid-backuprestore').'</span></label><br>';
|
|
}
|
|
if($display === 'Monthly'){
|
|
$html.='<span>'.__('Monthly', 'wpvivid-backuprestore').'</span></label><br>';
|
|
}
|
|
}
|
|
else{
|
|
$html.='<p>Warning: Unable to set '.$display.' backup schedule</p>';
|
|
}
|
|
}
|
|
$html.='<label>';
|
|
$html.='<div style="float: left;">';
|
|
$html.='<input type="radio" disabled />';
|
|
$html.='<span class="wpvivid-element-space-right" style="color: #ddd;">'.__('Custom', 'wpvivid-backuprestore').'</span>';
|
|
$html.='</div>';
|
|
$html.='<div style="float: left; height: 32px; line-height: 32px;">';
|
|
$html.='<span class="wpvivid-feature-pro">';
|
|
$html.='<a href="https://docs.wpvivid.com/wpvivid-backup-pro-customize-start-time.html" style="text-decoration: none; margin-top: 10px;">'.__('Pro feature: learn more', 'wpvivid-backuprestore').'</a>';
|
|
$html.='</span>';
|
|
$html.='</div>';
|
|
$html.='</label><br>';
|
|
return $html;
|
|
}
|
|
|
|
public static function get_start_time($time)
|
|
{
|
|
if(!is_array( $time ) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if(!isset($time['type']))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
$week=$time['start_time']['week'];
|
|
$day=$time['start_time']['day'];
|
|
$current_day=$time['start_time']['current_day'];
|
|
|
|
if(strtotime('now')>strtotime($current_day)){
|
|
$daily_start_time = $current_day.' +1 day';
|
|
}
|
|
else{
|
|
$daily_start_time = $current_day;
|
|
}
|
|
|
|
$weekly_tmp = $week.' '.$current_day;
|
|
if(strtotime('now')>strtotime($weekly_tmp)) {
|
|
$weekly_start_time = $week.' '.$weekly_tmp.' next week';
|
|
}
|
|
else{
|
|
$weekly_start_time = $weekly_tmp;
|
|
}
|
|
|
|
$date_now = gmdate("Y-m-",time());
|
|
$monthly_tmp = $date_now.$day.' '.$current_day;
|
|
if(strtotime('now')>strtotime($monthly_tmp)){
|
|
$date_now = gmdate("Y-m-",strtotime('+1 month'));
|
|
$monthly_start_time = $date_now.$day.' '.$current_day;
|
|
}
|
|
else{
|
|
$monthly_start_time = $monthly_tmp;
|
|
}
|
|
|
|
$schedule_type_ex = array(
|
|
'wpvivid_12hours' => '12Hours',
|
|
'twicedaily' => '12Hours',
|
|
'wpvivid_daily' => 'Daily',
|
|
'daily' => 'Daily',
|
|
'onceday' => 'Daily',
|
|
'wpvivid_weekly' => 'Weekly',
|
|
'weekly' => 'Weekly',
|
|
'wpvivid_fortnightly' => 'Fortnightly',
|
|
'fortnightly' => 'Fortnightly',
|
|
'wpvivid_monthly' => 'Monthly',
|
|
'monthly' => 'Monthly',
|
|
'montly' => 'Monthly'
|
|
);
|
|
|
|
$display_array = array(
|
|
"12Hours" => $daily_start_time,
|
|
"Daily" => $daily_start_time,
|
|
"Weekly" => $weekly_start_time,
|
|
"Fortnightly" => $weekly_start_time,
|
|
"Monthly" => $monthly_start_time
|
|
);
|
|
foreach ($schedule_type_ex as $key => $value){
|
|
if($key == $time['type']){
|
|
foreach ($display_array as $display_key => $display_value){
|
|
if($value == $display_key){
|
|
$base_ts = strtotime($display_value);
|
|
$jitter = function_exists('wp_rand') ? wp_rand(0, 15 * 60) : rand(0, 15 * 60);
|
|
return $base_ts + $jitter;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static function get_schedule($schedule_id = '')
|
|
{
|
|
add_filter('wpvivid_get_schedule', array('WPvivid_Schedule', 'get_schedule_ex'),10,2);
|
|
$schedule=array();
|
|
$schedule=apply_filters('wpvivid_get_schedule',$schedule,$schedule_id);
|
|
return $schedule;
|
|
}
|
|
|
|
public static function get_schedule_ex($schedule,$schedule_id)
|
|
{
|
|
$schedule=WPvivid_Setting::get_option('wpvivid_schedule_setting');
|
|
|
|
if(empty($schedule['backup']))
|
|
{
|
|
$schedule['backup']['backup_files']='files+db';
|
|
$schedule['backup']['local']=1;
|
|
$schedule['backup']['remote']=0;
|
|
$schedule['backup']['ismerge']=1;
|
|
$schedule['backup']['lock']=0;
|
|
}
|
|
|
|
$recurrence = wp_get_schedule(WPVIVID_MAIN_SCHEDULE_EVENT);
|
|
|
|
if(!wp_get_schedule(WPVIVID_MAIN_SCHEDULE_EVENT))
|
|
{
|
|
$schedule['enable']=false;
|
|
return $schedule;
|
|
}
|
|
|
|
$schedule['enable']=true;
|
|
$schedule['recurrence']=$recurrence;
|
|
$timestamp=wp_next_scheduled(WPVIVID_MAIN_SCHEDULE_EVENT);
|
|
|
|
$schedule['next_start']=$timestamp;
|
|
return $schedule;
|
|
}
|
|
|
|
public static function set_schedule($schedule_data,$schedule)
|
|
{
|
|
if($schedule['enable']==1)
|
|
{
|
|
$schedule_data['enable']=$schedule['enable'];
|
|
|
|
$schedule_data['type']=$schedule['recurrence'];
|
|
$schedule_data['event']=WPVIVID_MAIN_SCHEDULE_EVENT;
|
|
$time['type']=$schedule['recurrence'];
|
|
$time['start_time']['week']='mon';
|
|
$time['start_time']['day']='01';
|
|
$time['start_time']['current_day']="00:00";
|
|
$timestamp=WPvivid_Schedule::get_start_time($time);
|
|
$schedule_data['start_time']=$timestamp;
|
|
|
|
$schedule_data['backup']['backup_files']=$schedule['backup_type'];
|
|
if($schedule['save_local_remote']=='remote')
|
|
{
|
|
$schedule_data['backup']['local']=0;
|
|
$schedule_data['backup']['remote']=1;
|
|
}
|
|
else
|
|
{
|
|
$schedule_data['backup']['local']=1;
|
|
$schedule_data['backup']['remote']=0;
|
|
}
|
|
$schedule_data['backup']['ismerge']=1;
|
|
$schedule_data['backup']['lock']=$schedule['lock'];
|
|
}
|
|
else
|
|
{
|
|
$schedule_data['enable']=$schedule['enable'];
|
|
}
|
|
|
|
return $schedule_data;
|
|
}
|
|
|
|
public static function set_schedule_ex($schedule)
|
|
{
|
|
add_filter('wpvivid_set_schedule', array('WPvivid_Schedule', 'set_schedule'),10,2);
|
|
$schedule_data=array();
|
|
$schedule_data= apply_filters('wpvivid_set_schedule',$schedule_data, $schedule);
|
|
WPvivid_Setting::update_option('wpvivid_schedule_setting',$schedule_data);
|
|
if($schedule_data===false)
|
|
{
|
|
$ret['result']='failed';
|
|
$ret['error']=__('Creating scheduled tasks failed. Please try again later.', 'wpvivid-backuprestore');
|
|
return $ret;
|
|
}
|
|
|
|
if($schedule_data['enable']==1)
|
|
{
|
|
if(wp_get_schedule($schedule_data['event']))
|
|
{
|
|
$timestamp = wp_next_scheduled($schedule_data['event']);
|
|
wp_unschedule_event($timestamp,$schedule_data['event']);
|
|
}
|
|
if(wp_schedule_event($schedule_data['start_time'], $schedule_data['type'], $schedule_data['event'])===false)
|
|
{
|
|
$ret['result']='failed';
|
|
$ret['error']=__('Creating scheduled tasks failed. Please try again later.', 'wpvivid-backuprestore');
|
|
$ret['data']=$schedule_data;
|
|
return $ret;
|
|
}
|
|
else
|
|
{
|
|
$ret['result']='success';
|
|
$ret['data']=$schedule_data;
|
|
return $ret;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(wp_get_schedule(WPVIVID_MAIN_SCHEDULE_EVENT))
|
|
{
|
|
wp_clear_scheduled_hook(WPVIVID_MAIN_SCHEDULE_EVENT);
|
|
$timestamp = wp_next_scheduled(WPVIVID_MAIN_SCHEDULE_EVENT);
|
|
wp_unschedule_event($timestamp,WPVIVID_MAIN_SCHEDULE_EVENT);
|
|
}
|
|
$ret['result']='success';
|
|
$ret['data']=$schedule_data;
|
|
return $ret;
|
|
}
|
|
|
|
}
|
|
|
|
public function wpvivid_reset_schedule()
|
|
{
|
|
self::reset_schedule();
|
|
return true;
|
|
}
|
|
|
|
public static function reset_schedule()
|
|
{
|
|
$schedule=WPvivid_Setting::get_option('wpvivid_schedule_setting');
|
|
if(!empty($schedule))
|
|
{
|
|
if($schedule['enable'])
|
|
{
|
|
self::set_schedule_ex($schedule);
|
|
}
|
|
else
|
|
{
|
|
self::disable_schedule();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self::disable_schedule();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public static function disable_schedule()
|
|
{
|
|
$schedule=WPvivid_Setting::get_option('wpvivid_schedule_setting');
|
|
$schedule['enable']=false;
|
|
WPvivid_Setting::update_option('wpvivid_schedule_setting',$schedule);
|
|
if(wp_get_schedule(WPVIVID_MAIN_SCHEDULE_EVENT))
|
|
{
|
|
wp_clear_scheduled_hook(WPVIVID_MAIN_SCHEDULE_EVENT);
|
|
$timestamp = wp_next_scheduled(WPVIVID_MAIN_SCHEDULE_EVENT);
|
|
wp_unschedule_event($timestamp,WPVIVID_MAIN_SCHEDULE_EVENT);
|
|
}
|
|
}
|
|
|
|
public static function clear_monitor_schedule($id)
|
|
{
|
|
$timestamp =wp_next_scheduled(WPVIVID_TASK_MONITOR_EVENT,array($id));
|
|
if($timestamp!==false)
|
|
{
|
|
wp_unschedule_event($timestamp,WPVIVID_TASK_MONITOR_EVENT,array($id));
|
|
}
|
|
}
|
|
|
|
public static function get_next_resume_time($id)
|
|
{
|
|
$timestamp=wp_next_scheduled(WPVIVID_RESUME_SCHEDULE_EVENT,array($id));
|
|
if($timestamp!==false)
|
|
{
|
|
return $timestamp-time();
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|