| @@ -5,83 +5,85 @@ | ||
| 5 | 5 | * |
| 6 | 6 | ************************************************************************************************/ |
| 7 | 7 | ?> |
| 8 | 8 | <?php |
| 9 | -class ODB_Scheduler | |
| 10 | -{ | |
| 9 | +class ODB_Scheduler { | |
| 10 | + | |
| 11 | 11 | /******************************************************************************************** |
| 12 | 12 | * CONSTRUCTOR |
| 13 | - ********************************************************************************************/ | |
| 14 | - function __construct() | |
| 15 | - { | |
| 13 | + ********************************************************************************************/ | |
| 14 | + function __construct() { | |
| 16 | 15 | global $odb_class; |
| 17 | - | |
| 16 | + | |
| 18 | 17 | // ADD EXTRA CRON SCHEDULES |
| 19 | 18 | add_filter('cron_schedules', array(&$this, 'odb_extra_cron_schedules')); |
| 20 | - | |
| 19 | + | |
| 21 | 20 | // ADD SCHEDULER |
| 22 | 21 | add_action('odb_scheduler', array(&$odb_class, 'odb_start_scheduler')); |
| 23 | 22 | } // __construct() |
| 24 | - | |
| 25 | - | |
| 23 | + | |
| 24 | + | |
| 26 | 25 | /******************************************************************************* |
| 27 | 26 | * ADD EXTRA SCHEDULE FOR THE CRONTAB |
| 28 | 27 | * http://codex.wordpress.org/Plugin_API/Filter_Reference/cron_schedules |
| 29 | 28 | * |
| 30 | 29 | * v4.0.1 Localization fixed |
| 30 | + * v4.0.3 ($schedules) added as a parameter | |
| 31 | + * v4.2.0 Added monthly | |
| 31 | 32 | *******************************************************************************/ |
| 32 | - function odb_extra_cron_schedules() | |
| 33 | - { | |
| 33 | + function odb_extra_cron_schedules($schedules) { | |
| 34 | 34 | global $odb_class; |
| 35 | - | |
| 35 | + | |
| 36 | 36 | $schedules['weekly'] = array( |
| 37 | 37 | 'interval' => 604800, |
| 38 | - 'display' => __('Once Weekly', $odb_class->odb_txt_domain) | |
| 38 | + 'display' => __('Once Weekly', 'rvg-optimize-database') | |
| 39 | 39 | ); |
| 40 | + $schedules['monthly'] = array( | |
| 41 | + 'interval' => 2628000, // average amount of seconds in a month | |
| 42 | + 'display' => __('Once Monthly', 'rvg-optimize-database') | |
| 43 | + ); | |
| 40 | 44 | // FOR DEBUGGING |
| 41 | 45 | $schedules['fiveminutes'] = array( |
| 42 | 46 | 'interval' => 300, |
| 43 | - 'display' => __('Every Five Minutes', $odb_class->odb_txt_domain) | |
| 44 | - ); | |
| 47 | + 'display' => __('Every Five Minutes', 'rvg-optimize-database') | |
| 48 | + ); | |
| 45 | 49 | return $schedules; |
| 46 | 50 | } // odb_extra_cron_schedules() |
| 47 | - | |
| 48 | - | |
| 51 | + | |
| 52 | + | |
| 49 | 53 | /******************************************************************************* |
| 50 | 54 | * UPDATE SCHEDULER (IF NEEDED) |
| 51 | 55 | *******************************************************************************/ |
| 52 | - function odb_update_scheduler() | |
| 53 | - { | |
| 56 | + function odb_update_scheduler() { | |
| 54 | 57 | global $odb_class; |
| 55 | 58 | |
| 56 | - if($odb_class->odb_rvg_options['schedule_type'] == '') | |
| 57 | - { // SHOULDN'T BE SCHEDULED | |
| 59 | + if($odb_class->odb_rvg_options['schedule_type'] == '') { | |
| 60 | + // SHOULDN'T BE SCHEDULED | |
| 58 | 61 | wp_clear_scheduled_hook('odb_scheduler'); |
| 59 | 62 | $odb_class->odb_rvg_options['schedule_hour'] = ''; |
| 60 | - $odb_class->odb_multisite_obj->odb_ms_update_option('odb_rvg_options', $odb_class->odb_rvg_options); | |
| 61 | - } | |
| 62 | - else | |
| 63 | - { // JOB SHOULD BE SCHEDULED: SCHEDULE IT | |
| 63 | + $odb_class->odb_multisite_obj->odb_ms_update_option('odb_rvg_options', $odb_class->odb_rvg_options); | |
| 64 | + } else { | |
| 65 | + // JOB SHOULD BE SCHEDULED: SCHEDULE IT | |
| 64 | 66 | if($odb_class->odb_rvg_options['schedule_type'] != 'daily' && |
| 65 | - $odb_class->odb_rvg_options['schedule_type'] != 'weekly') | |
| 66 | - { | |
| 67 | + $odb_class->odb_rvg_options['schedule_type'] != 'weekly' && | |
| 68 | + $odb_class->odb_rvg_options['schedule_type'] != 'monthly' | |
| 69 | + ) { | |
| 67 | 70 | $odb_class->odb_rvg_options['schedule_hour'] = ''; |
| 68 | 71 | $odb_class->odb_multisite_obj->odb_ms_update_option('odb_rvg_options', $odb_class->odb_rvg_options); |
| 69 | 72 | } |
| 70 | - | |
| 73 | + | |
| 71 | 74 | if (!wp_next_scheduled('odb_scheduler')) |
| 72 | 75 | wp_schedule_event($this->odb_calculate_time(), $odb_class->odb_rvg_options['schedule_type'], 'odb_scheduler'); |
| 73 | 76 | } // if($odb_class->odb_rvg_options['schedule_type'] == '') |
| 74 | 77 | } // odb_update_scheduler() |
| 75 | - | |
| 76 | 78 | |
| 79 | + | |
| 77 | 80 | /******************************************************************************* |
| 78 | 81 | * SCHEDULE CHANGED ON SETTINGS PAGE: RESCHEDULE |
| 79 | - *******************************************************************************/ | |
| 80 | - function odb_reschedule() | |
| 81 | - { | |
| 82 | + *******************************************************************************/ | |
| 83 | + function odb_reschedule() { | |
| 82 | 84 | global $odb_class; |
| 83 | - | |
| 85 | + | |
| 84 | 86 | wp_clear_scheduled_hook('odb_scheduler'); |
| 85 | 87 | wp_schedule_event($this->odb_calculate_time(), $odb_class->odb_rvg_options['schedule_type'], 'odb_scheduler'); |
| 86 | 88 | } // odb_reschedule() |
| 87 | 89 | |
| @@ -86,34 +88,45 @@ | ||
| 86 | 88 | } // odb_reschedule() |
| 87 | 89 | |
| 88 | 90 | |
| 89 | 91 | /******************************************************************************* |
| 90 | - * CALCULATE SCHEDULE TIME | |
| 91 | - *******************************************************************************/ | |
| 92 | - function odb_calculate_time() | |
| 93 | - { | |
| 92 | + * CALCULATE SCHEDULE TIME, BASED ON THE SCHEDULE TYPE | |
| 93 | + * | |
| 94 | + * v4.5 Fixed time issues | |
| 95 | + *******************************************************************************/ | |
| 96 | + function odb_calculate_time() { | |
| 94 | 97 | global $odb_class; |
| 95 | - | |
| 98 | + | |
| 99 | + // CURRENT TIME (WITH TIMEZONE) | |
| 100 | + $timestamp = current_time('timestamp', 1); | |
| 101 | + // YYYYMMDDHHMMSS | |
| 102 | + $ymdhis = date('YmdHis', $timestamp); | |
| 103 | + | |
| 104 | + // CHOP TIME, YYYYMMDD | |
| 105 | + $current_date = substr($ymdhis, 0, 8); | |
| 106 | + $current_hour = substr($ymdhis, 8, 2); | |
| 107 | + | |
| 96 | 108 | if ($odb_class->odb_rvg_options['schedule_type'] == 'daily' || |
| 97 | - $odb_class->odb_rvg_options['schedule_type'] == 'weekly') | |
| 98 | - { | |
| 99 | - // 'daily' OR 'weekly' | |
| 100 | - $current_datetime = Date('YmdHis'); | |
| 101 | - $current_date = substr($current_datetime, 0, 8); | |
| 102 | - $current_hour = substr($current_datetime, 8, 2); | |
| 103 | - | |
| 104 | - if($odb_class->odb_rvg_options['schedule_hour'] <= $current_hour) | |
| 109 | + $odb_class->odb_rvg_options['schedule_type'] == 'weekly' || | |
| 110 | + $odb_class->odb_rvg_options['schedule_type'] == 'monthly' | |
| 111 | + ) { | |
| 112 | + // 'daily', 'weekly' OR 'monthly' | |
| 113 | + if($odb_class->odb_rvg_options['schedule_hour'] <= $current_hour) { | |
| 105 | 114 | // NEXT RUN WILL BE TOMORROW |
| 106 | 115 | $date = date('YmdHis', strtotime($current_date.$odb_class->odb_rvg_options['schedule_hour'].'0000'.' + 1 day')); |
| 107 | - else | |
| 116 | + } else { | |
| 108 | 117 | // NEXT RUN WILL BE TODAY |
| 109 | 118 | $date = $current_date.$odb_class->odb_rvg_options['schedule_hour'].'0000'; |
| 110 | - $time = strtotime($date); | |
| 111 | - } | |
| 112 | - else | |
| 113 | - // 'hourly' OR 'twicedaily': ONE MINUTE DELAY FOR THE FIRST RUN | |
| 114 | - $time = time(); | |
| 115 | - | |
| 116 | - return $time; | |
| 119 | + } // if($odb_class->odb_rvg_options['schedule_hour'] <= $current_hour) | |
| 120 | + } else { | |
| 121 | + // 'hourly' OR 'twicedaily' | |
| 122 | + | |
| 123 | + // ADD ONE HOUR TO THE CURRENT TIME: IT WILL RUN THE NEXT FULL HOUR (16:00 FOR INSTANCE) | |
| 124 | + $ts = $timestamp + 3600; | |
| 125 | + $date = date('YmdH0000', $ts); | |
| 126 | + } // if ($odb_class->odb_rvg_options['schedule_type'] == 'daily' ... | |
| 127 | + | |
| 128 | + // CONVERT TO TIMESTAMP | |
| 129 | + return strtotime($date); | |
| 117 | 130 | } // odb_calculate_time() |
| 118 | 131 | } // ODB_Scheduler |
| 119 | 132 | ?> |