From cb3897c48bb3d0f43f3f1bef5b3ac41a944c7f47 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 7 Jul 2023 13:34:55 +0300 Subject: [PATCH] - UM cron class review; - schedule events on the first install; - make an event's starting time base on recurrence; --- includes/class-init.php | 2 + includes/core/class-cron.php | 92 +++++++++++++++++++----------------- 2 files changed, 50 insertions(+), 44 deletions(-) diff --git a/includes/class-init.php b/includes/class-init.php index 2e40ea66..2cf9fdf6 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -529,6 +529,8 @@ if ( ! class_exists( 'UM' ) ) { //run setup $this->common()->cpt()->create_post_types(); $this->setup()->run_setup(); + + $this->cron()->schedule_events(); } diff --git a/includes/core/class-cron.php b/includes/core/class-cron.php index 93a1083f..63b0ad34 100644 --- a/includes/core/class-cron.php +++ b/includes/core/class-cron.php @@ -1,122 +1,126 @@ - */ - $um_cron = apply_filters( 'um_cron_disable', false ); - if ( $um_cron ) { - return; - } - add_filter( 'cron_schedules', array( $this, 'add_schedules' ) ); - add_action( 'wp', array( $this, 'schedule_Events' ) ); + add_action( 'wp', array( $this, 'schedule_events' ) ); } + /** + * @return bool + */ + private function cron_disabled() { + /** + * Filters variable for disable Ultimate Member WP Cron actions. + * + * @since 2.0 + * @hook um_cron_disable + * + * @param {bool} $is_disabled Shortcode arguments. + * + * @return {bool} Do Cron actions are disabled? True for disable. + * + * @example Disable all Ultimate Member WP Cron actions. + * add_filter( 'um_cron_disable', '__return_true' ); + */ + return apply_filters( 'um_cron_disable', false ); + } /** + * Adds once weekly to the existing schedules. + * * @param array $schedules * * @return array */ public function add_schedules( $schedules = array() ) { + if ( $this->cron_disabled() ) { + return $schedules; + } - // Adds once weekly to the existing schedules. $schedules['weekly'] = array( 'interval' => 604800, - 'display' => __( 'Once Weekly', 'ultimate-member' ) + 'display' => __( 'Once Weekly', 'ultimate-member' ), ); return $schedules; } - /** * */ - public function schedule_Events() { + public function schedule_events() { + if ( $this->cron_disabled() ) { + return; + } + $this->weekly_events(); $this->daily_events(); $this->twicedaily_events(); $this->hourly_events(); } - /** * */ private function weekly_events() { + $sunday_start = wp_date( 'w' ); + $week_start = $sunday_start - absint( get_option( 'start_of_week' ) ); + $week_start_day = strtotime( '-' . $week_start . ' days' ); + $time = mktime( 0, 0, 0, wp_date( 'm', $week_start_day ), wp_date( 'd', $week_start_day ), wp_date( 'Y', $week_start_day ) ); if ( ! wp_next_scheduled( 'um_weekly_scheduled_events' ) ) { - wp_schedule_event( current_time( 'timestamp' ), 'weekly', 'um_weekly_scheduled_events' ); + wp_schedule_event( $time, 'weekly', 'um_weekly_scheduled_events' ); } } - /** * */ private function daily_events() { if ( ! wp_next_scheduled( 'um_daily_scheduled_events' ) ) { - wp_schedule_event( current_time( 'timestamp' ), 'daily', 'um_daily_scheduled_events' ); + $time = mktime( 0, 0, 0, wp_date( 'm' ), wp_date( 'd' ), wp_date( 'Y' ) ); + wp_schedule_event( $time, 'daily', 'um_daily_scheduled_events' ); } } - /** * */ private function twicedaily_events() { if ( ! wp_next_scheduled( 'um_twicedaily_scheduled_events' ) ) { - wp_schedule_event( current_time( 'timestamp' ), 'twicedaily', 'um_twicedaily_scheduled_events' ); + $time = mktime( 0, 0, 0, wp_date( 'm' ), wp_date( 'd' ), wp_date( 'Y' ) ); + wp_schedule_event( $time, 'twicedaily', 'um_twicedaily_scheduled_events' ); } } - /** * */ private function hourly_events() { if ( ! wp_next_scheduled( 'um_hourly_scheduled_events' ) ) { - wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'um_hourly_scheduled_events' ); + $time = mktime( wp_date( 'H' ), 0, 0, wp_date( 'm' ), wp_date( 'd' ), wp_date( 'Y' ) ); + wp_schedule_event( $time, 'hourly', 'um_hourly_scheduled_events' ); } } - + /** + * Breaks all Ultimate Member registered schedule events. + */ public function unschedule_events() { wp_clear_scheduled_hook( 'um_weekly_scheduled_events' ); wp_clear_scheduled_hook( 'um_daily_scheduled_events' );