automatewoo/includes/NotificationsInitializer.php
fei-source 47d3c9a8b6 Update to v6.2.2
Source: GrootMade/Festinger Vault
2026-03-15 08:31:15 +08:00

196 lines
5.1 KiB
PHP

<?php
namespace AutomateWoo\Notifications;
use AutomateWoo\ActionScheduler\ActionScheduler;
use Automattic\WooCommerce\Admin\Notes\NotesUnavailableException;
defined( 'ABSPATH' ) || exit;
/**
* Setup inbox notifications.
*
* @since 5.8.5
*/
class NotificationsInitializer {
/**
* The type of notification.
*
* @var array
*/
public $notification_types = array(
Notifications::INSTANT,
Notifications::ACTIVATION_OR_UPDATE,
Notifications::SCHEDULED,
);
/**
* @var ActionScheduler
*/
private $action_scheduler;
/**
* Hook name for the Action Scheduler recurring action.
*
* @var string
*/
protected const ACTION_SCHEDULER_HOOK = 'automatewoo_scheduled_notifications';
/**
* Hook name for the Action Scheduler action to run one time.
* Used for activation and update notifications.
*
* @var string
*/
protected const ACTION_SCHEDULER_SINGLE_HOOK = 'automatewoo_scheduled_notifications_once';
/**
* Interval in seconds for scheduled action.
*
* @var int
*/
protected const ACTION_SCHEDULER_INTERVAL = 3600;
/**
* Construct
*
* @param ActionScheduler $action_scheduler Action scheduler.
*/
public function __construct( ActionScheduler $action_scheduler ) {
$this->action_scheduler = $action_scheduler;
}
/**
* Add actions for Action Scheduler registration and admin notification processing.
*
* @return void
*/
public function init(): void {
add_action( 'admin_init', array( $this, 'maybe_add_scheduled_action' ) );
add_action( 'admin_init', array( $this, 'process_instant_notifications' ) );
// Register Action Scheduler callback to process scheduled notifications.
add_action( self::ACTION_SCHEDULER_HOOK, array( $this, 'process_scheduled_notifications' ) );
// Schedule single run action to process activation or update notifications.
add_action( 'automatewoo_activated', array( $this, 'schedule_activate_or_update_notifications' ) );
add_action( 'automatewoo_installed', array( $this, 'schedule_activate_or_update_notifications' ) );
add_action( self::ACTION_SCHEDULER_SINGLE_HOOK, array( $this, 'process_activate_or_update_notifications' ) );
// Delete the scheduled action if AutomateWoo is deactivated.
register_deactivation_hook( AUTOMATEWOO_FILE, array( $this, 'maybe_remove_scheduled_action' ) );
register_deactivation_hook( AUTOMATEWOO_FILE, array( $this, 'maybe_delete_notes' ) );
}
/**
* Process immediate and scheduled notifications.
*
* @return void
*/
public function process_scheduled_notifications(): void {
$this->run( Notifications::SCHEDULED );
}
/**
* Process immediate notifications.
*
* @return void
*/
public function process_instant_notifications(): void {
$this->run( Notifications::INSTANT );
}
/**
* Process activation or upgrade notifications.
*
* @return void
*/
public function process_activate_or_update_notifications(): void {
$this->run( Notifications::ACTIVATION_OR_UPDATE );
}
/**
* Loop through all notifications to add any that should be added.
*
* @param string $notification_type What types of notifications should be processed
*
* @return void|bool
*/
public function run( $notification_type = false ) {
if ( ! in_array( $notification_type, $this->notification_types, true ) ) {
return false;
}
// Get all Notifications from the Registry.
$notes = apply_filters( 'automatewoo/notifications/loaded', Notifications::get_all() );
foreach ( $notes as $note ) {
try {
if ( $note->notification_type() === $notification_type ) {
/**
* Process each individual notification to see if a Note needs to be added.
*
* @var AbstractNotification $note.
*/
$note->process();
}
} catch ( NotesUnavailableException $e ) {
continue;
}
}
}
/**
* Add a single action to Action Scheduler to run as soon as possible.
*
* @return void
*/
public function schedule_activate_or_update_notifications(): void {
if ( ! $this->action_scheduler->has_scheduled_action( self::ACTION_SCHEDULER_SINGLE_HOOK ) ) {
AW()->action_scheduler()->enqueue_async_action( self::ACTION_SCHEDULER_SINGLE_HOOK );
}
}
/**
* Add recurring action to Action Scheduler if it doesn't exist.
*
* @return void
*/
public function maybe_add_scheduled_action(): void {
if ( ! $this->action_scheduler->has_scheduled_action( self::ACTION_SCHEDULER_HOOK ) ) {
$this->action_scheduler->schedule_recurring_action( time(), self::ACTION_SCHEDULER_INTERVAL, self::ACTION_SCHEDULER_HOOK );
}
}
/**
* Remove recurring action in Action Scheduler if it exists.
*
* @return void
*/
public function maybe_remove_scheduled_action(): void {
$this->action_scheduler->cancel( self::ACTION_SCHEDULER_HOOK );
}
/**
* Delete any existing Notes when AutomateWoo extension is deactivated.
*
* @return void
*/
public function maybe_delete_notes(): void {
$notes = Notifications::get_all();
foreach ( $notes as $note ) {
try {
/**
* Check each Note to see if it needs to be deleted.
*
* @var AbstractNotification $note.
*/
$note->deactivation();
$note->possibly_delete_note();
} catch ( NotesUnavailableException $e ) {
continue;
}
}
}
}