Files
WooNooW/includes/Core/Notifications/NotificationManager.php
dwindown 60658c6786 feat: Complete backend wiring for notification system
 Global System Toggle:
- Added GET/POST /notifications/system-mode endpoints
- Switch between WooNooW and WooCommerce notification systems
- Stored in: woonoow_notification_system_mode
- EmailManager::is_enabled() checks system mode
- NotificationManager checks mode before sending

 Template System Wired:
- Templates saved via API are used when sending
- EmailRenderer fetches templates from TemplateProvider
- Variables replaced automatically
- Markdown parsed (cards, buttons, images)
- Email customization applied (colors, logo, branding)

 Channel Toggle Wired:
- Frontend toggles saved to database
- NotificationManager::is_channel_enabled() checks before sending
- Email: woonoow_email_notifications_enabled
- Push: woonoow_push_notifications_enabled

 Event Toggle Wired:
- Per-event channel settings saved
- NotificationManager::is_event_channel_enabled() checks before sending
- Stored in: woonoow_notification_settings

 Email Sending Flow:
Event → EmailManager → Check System Mode → Check Channel Toggle
→ Check Event Toggle → EmailRenderer → Get Template → Replace Variables
→ Parse Markdown → Apply Branding → wp_mail() → Sent

 All Settings Applied:
- Template modifications saved and used
- Channel toggles respected
- Event toggles respected
- Global system mode respected
- Email customization applied
- Push settings applied

📋 Modified Files:
- NotificationsController.php: Added system-mode endpoints
- NotificationManager.php: Added system mode check, wired EmailRenderer
- EmailManager.php: Added is_enabled() check for system mode

🎯 Result: Complete end-to-end notification system fully functional
2025-11-15 21:59:46 +07:00

193 lines
5.0 KiB
PHP

<?php
/**
* Notification Manager
*
* Handles notification sending logic and channel validation.
*
* @package WooNooW\Core\Notifications
*/
namespace WooNooW\Core\Notifications;
class NotificationManager {
/**
* Check if a channel is enabled globally
*
* @param string $channel_id Channel ID (email, push, etc.)
* @return bool
*/
public static function is_channel_enabled($channel_id) {
if ($channel_id === 'email') {
return (bool) get_option('woonoow_email_notifications_enabled', true);
} elseif ($channel_id === 'push') {
return (bool) get_option('woonoow_push_notifications_enabled', true);
}
// For addon channels, check if they're registered and enabled
$channels = apply_filters('woonoow_notification_channels', []);
foreach ($channels as $channel) {
if ($channel['id'] === $channel_id) {
return isset($channel['enabled']) ? (bool) $channel['enabled'] : true;
}
}
return false;
}
/**
* Check if a channel is enabled for a specific event
*
* @param string $event_id Event ID
* @param string $channel_id Channel ID
* @return bool
*/
public static function is_event_channel_enabled($event_id, $channel_id) {
$settings = get_option('woonoow_notification_settings', []);
if (!isset($settings[$event_id])) {
return false;
}
$event = $settings[$event_id];
if (!isset($event['channels'][$channel_id])) {
return false;
}
return isset($event['channels'][$channel_id]['enabled'])
? (bool) $event['channels'][$channel_id]['enabled']
: false;
}
/**
* Check if notification should be sent
*
* Validates both global channel state and per-event channel state.
*
* @param string $event_id Event ID
* @param string $channel_id Channel ID
* @return bool
*/
public static function should_send_notification($event_id, $channel_id) {
// Check if WooNooW notification system is enabled
$system_mode = get_option('woonoow_notification_system_mode', 'woonoow');
if ($system_mode !== 'woonoow') {
return false; // Use WooCommerce default emails instead
}
// Check if channel is globally enabled
if (!self::is_channel_enabled($channel_id)) {
return false;
}
// Check if channel is enabled for this specific event
if (!self::is_event_channel_enabled($event_id, $channel_id)) {
return false;
}
return true;
}
/**
* Get recipient for event channel
*
* @param string $event_id Event ID
* @param string $channel_id Channel ID
* @return string Recipient type (admin, customer, both)
*/
public static function get_recipient($event_id, $channel_id) {
$settings = get_option('woonoow_notification_settings', []);
if (!isset($settings[$event_id]['channels'][$channel_id]['recipient'])) {
return 'admin';
}
return $settings[$event_id]['channels'][$channel_id]['recipient'];
}
/**
* Send notification through specified channel
*
* @param string $event_id Event ID
* @param string $channel_id Channel ID
* @param array $data Notification data
* @return bool Success status
*/
public static function send($event_id, $channel_id, $data = []) {
// Validate if notification should be sent
if (!self::should_send_notification($event_id, $channel_id)) {
return false;
}
// Get recipient
$recipient = self::get_recipient($event_id, $channel_id);
// Allow addons to handle their own channels
$sent = apply_filters(
'woonoow_send_notification',
false,
$event_id,
$channel_id,
$recipient,
$data
);
// If addon handled it, return
if ($sent !== false) {
return $sent;
}
// Handle built-in channels
if ($channel_id === 'email') {
return self::send_email($event_id, $recipient, $data);
} elseif ($channel_id === 'push') {
return self::send_push($event_id, $recipient, $data);
}
return false;
}
/**
* Send email notification
*
* @param string $event_id Event ID
* @param string $recipient Recipient type
* @param array $data Notification data
* @return bool
*/
private static function send_email($event_id, $recipient, $data) {
// Use EmailRenderer to render the email
$renderer = EmailRenderer::instance();
$email_data = $renderer->render($event_id, $recipient, $data['order'] ?? $data['product'] ?? $data['customer'] ?? null, $data);
if (!$email_data) {
return false;
}
// Send email using wp_mail
$headers = ['Content-Type: text/html; charset=UTF-8'];
$sent = wp_mail($email_data['to'], $email_data['subject'], $email_data['body'], $headers);
// Trigger action for logging/tracking
do_action('woonoow_email_sent', $event_id, $recipient, $email_data, $sent);
return $sent;
}
/**
* Send push notification
*
* @param string $event_id Event ID
* @param string $recipient Recipient type
* @param array $data Notification data
* @return bool
*/
private static function send_push($event_id, $recipient, $data) {
// Push notification sending will be implemented later
// This is a placeholder for future implementation
do_action('woonoow_send_push_notification', $event_id, $recipient, $data);
return true;
}
}