165 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Email Summary Cron Class.
 | |
|  *
 | |
|  * @package     EDD
 | |
|  * @subpackage  Emails
 | |
|  * @copyright   Copyright (c) 2022, Easy Digital Downloads, LLC
 | |
|  * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 | |
|  * @since       3.1
 | |
|  */
 | |
| 
 | |
| // Exit if accessed directly.
 | |
| defined( 'ABSPATH' ) || exit;
 | |
| 
 | |
| /**
 | |
|  * EDD_Email_Summary_Cron Class.
 | |
|  *
 | |
|  * Takes care of scheduling and sending Email Summaries.
 | |
|  *
 | |
|  * @since 3.1
 | |
|  */
 | |
| class EDD_Email_Summary_Cron {
 | |
| 
 | |
| 	/**
 | |
| 	 * Name of the Email Summary cron hook.
 | |
| 	 *
 | |
| 	 * @since 3.1
 | |
| 	 *
 | |
| 	 * @const string
 | |
| 	 */
 | |
| 	const CRON_EVENT_NAME = 'edd_email_summary_cron';
 | |
| 
 | |
| 	/**
 | |
| 	 * Class constructor.
 | |
| 	 *
 | |
| 	 * @since 3.1
 | |
| 	 */
 | |
| 	public function __construct() {
 | |
| 
 | |
| 		// Register daily check.
 | |
| 		add_action( 'edd_daily_scheduled_events', array( $this, 'schedule_cron_events' ) );
 | |
| 
 | |
| 		// User settings changed.
 | |
| 		add_action( 'updated_option', array( $this, 'settings_changed' ), 10, 3 );
 | |
| 
 | |
| 		// Prepare and run cron.
 | |
| 		add_action( self::CRON_EVENT_NAME, array( $this, 'run_cron' ) );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get the current status of email summary.
 | |
| 	 *
 | |
| 	 * @since 3.1
 | |
| 	 *
 | |
| 	 * @return bool True if email summary is enabled, false if disabled.
 | |
| 	 */
 | |
| 	public function is_enabled() {
 | |
| 		return (bool) ! edd_get_option( 'disable_email_summary', false );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Determine when the next cron event
 | |
| 	 * should be and schedule it.
 | |
| 	 *
 | |
| 	 * @since 3.1
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function schedule_cron_events() {
 | |
| 		// Exit if email summary is disabled or event is already scheduled.
 | |
| 		if ( ! $this->is_enabled() || wp_next_scheduled( self::CRON_EVENT_NAME ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the event date based on user settings.
 | |
| 		$days            = EDD()->utils->date()->getDays();
 | |
| 		$email_frequency = edd_get_option( 'email_summary_frequency', 'weekly' );
 | |
| 		$week_start_day  = $days[ (int) get_option( 'start_of_week' ) ];
 | |
| 
 | |
| 		if ( 'monthly' === $email_frequency ) {
 | |
| 			$next_time_string = 'first day of next month 8am';
 | |
| 		} else {
 | |
| 			$next_time_string = "next {$week_start_day} 8am";
 | |
| 		}
 | |
| 
 | |
| 		$date = new \DateTime( $next_time_string, new DateTimeZone( edd_get_timezone_id() ) );
 | |
| 		wp_schedule_single_event( $date->getTimestamp(), self::CRON_EVENT_NAME );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Clear all cron events related to email summary.
 | |
| 	 *
 | |
| 	 * @since 3.1
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function clear_cron_events() {
 | |
| 		wp_clear_scheduled_hook( self::CRON_EVENT_NAME );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Detect when settings that affect the
 | |
| 	 * schedule of email summaries are updated.
 | |
| 	 *
 | |
| 	 * @since 3.1
 | |
| 	 *
 | |
| 	 * @param string $option_name WordPress option that was changed.
 | |
| 	 * @param string $old_value Old option value.
 | |
| 	 * @param string $new_value New option value.
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function settings_changed( $option_name, $old_value, $new_value ) {
 | |
| 		if ( ! in_array( $option_name, array( 'edd_settings', 'start_of_week', 'timezone_string', 'gmt_offset' ), true ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// If `edd_settings` were changed, listen
 | |
| 		// only to changes in specific fields.
 | |
| 		if ( 'edd_settings' === $option_name ) {
 | |
| 			$change_detected = false;
 | |
| 			$field_listeners = array( 'email_summary_frequency', 'disable_email_summary' );
 | |
| 			foreach ( $field_listeners as $field ) {
 | |
| 				if ( ( empty( $old_value[ $field ] ) || empty( $new_value[ $field ] ) ) || ( $old_value[ $field ] !== $new_value[ $field ] ) ) {
 | |
| 					$change_detected = true;
 | |
| 					break;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if ( ! $change_detected ) {
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			// Reload EDD options so that we have the newest values in class methods.
 | |
| 			global $edd_options;
 | |
| 			$edd_options = get_option( 'edd_settings' );
 | |
| 		}
 | |
| 
 | |
| 		$this->clear_cron_events();
 | |
| 		$this->schedule_cron_events();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Initialize the cron with all the proper checks.
 | |
| 	 *
 | |
| 	 * @since 3.1
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function run_cron() {
 | |
| 		// This is not cron, abort!
 | |
| 		if ( ! wp_doing_cron() ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$email = new EDD_Email_Summary();
 | |
| 		$email->send_email();
 | |
| 
 | |
| 		// Schedule the next event.
 | |
| 		$this->schedule_cron_events();
 | |
| 	}
 | |
| 
 | |
| }
 |