price_updater = $price_updater; // Register cron hook. add_action( self::CRON_HOOK, array( $this, 'run_daily_update' ) ); // Add custom cron schedule if needed. add_filter( 'cron_schedules', array( $this, 'add_custom_cron_schedule' ) ); } /** * Run daily price update. */ public function run_daily_update() { // Check if we should run the update. if ( ! $this->should_run_update() ) { return; } // Set start time. update_option( 'informatiq_sp_last_run_start', current_time( 'mysql' ) ); // Process all products. $results = $this->price_updater->process_all_products(); // Set completion time and results. update_option( 'informatiq_sp_last_run_end', current_time( 'mysql' ) ); update_option( 'informatiq_sp_last_run_results', $results ); } /** * Check if update should run. * * @return bool True if update should run. */ private function should_run_update() { // Check if plugin is properly configured. $merchant_id = get_option( 'informatiq_sp_merchant_id' ); $service_account = get_option( 'informatiq_sp_service_account' ); if ( empty( $merchant_id ) || empty( $service_account ) ) { return false; } // Check if auto-update is enabled. $auto_update_enabled = get_option( 'informatiq_sp_auto_update_enabled', '1' ); if ( $auto_update_enabled !== '1' ) { return false; } return true; } /** * Add custom cron schedule. * * @param array $schedules Existing schedules. * @return array Modified schedules. */ public function add_custom_cron_schedule( $schedules ) { // Add twice daily schedule. $schedules['twice_daily'] = array( 'interval' => 12 * HOUR_IN_SECONDS, 'display' => __( 'Twice Daily', 'informatiq-smart-pricing' ), ); // Add custom hourly schedule. $schedules['every_6_hours'] = array( 'interval' => 6 * HOUR_IN_SECONDS, 'display' => __( 'Every 6 Hours', 'informatiq-smart-pricing' ), ); return $schedules; } /** * Get next scheduled run time. * * @return int|false Timestamp of next run or false if not scheduled. */ public static function get_next_run_time() { return wp_next_scheduled( self::CRON_HOOK ); } /** * Get last run information. * * @return array Last run information. */ public static function get_last_run_info() { $last_run_start = get_option( 'informatiq_sp_last_run_start' ); $last_run_end = get_option( 'informatiq_sp_last_run_end' ); $last_run_results = get_option( 'informatiq_sp_last_run_results', array() ); return array( 'start' => $last_run_start, 'end' => $last_run_end, 'results' => $last_run_results, ); } /** * Manually trigger update (for admin interface). * * @return array Results of the update. */ public function trigger_manual_update() { update_option( 'informatiq_sp_last_run_start', current_time( 'mysql' ) ); $results = $this->price_updater->process_all_products(); update_option( 'informatiq_sp_last_run_end', current_time( 'mysql' ) ); update_option( 'informatiq_sp_last_run_results', $results ); return $results; } /** * Reschedule cron event with new frequency. * * @param string $frequency Frequency (daily, twice_daily, every_6_hours). * @return bool True if rescheduled successfully. */ public static function reschedule( $frequency = 'daily' ) { // Clear existing schedule. $timestamp = wp_next_scheduled( self::CRON_HOOK ); if ( $timestamp ) { wp_unschedule_event( $timestamp, self::CRON_HOOK ); } // Schedule new event. return wp_schedule_event( time(), $frequency, self::CRON_HOOK ); } }