fix: resolve container width issues, spa redirects, and appearance settings overwrite. feat: enhance order/sub details and newsletter layout

This commit is contained in:
Dwindi Ramadhana
2026-02-05 00:09:40 +07:00
parent a0b5f8496d
commit 5f08c18ec7
77 changed files with 7027 additions and 4546 deletions

View File

@@ -0,0 +1,57 @@
<?php
/**
* Channel Interface
*
* Contract for implementing custom notification channels (WhatsApp, SMS, Telegram, etc.)
*
* @package WooNooW\Core\Notifications\Channels
*/
namespace WooNooW\Core\Notifications\Channels;
interface ChannelInterface
{
/**
* Get channel unique identifier
*
* @return string Channel ID (e.g., 'whatsapp', 'sms', 'telegram')
*/
public function get_id();
/**
* Get channel display label
*
* @return string Channel label for UI (e.g., 'WhatsApp', 'SMS', 'Telegram')
*/
public function get_label();
/**
* Check if channel is properly configured
*
* Example: API keys are set, credentials are valid, etc.
*
* @return bool True if channel is ready to send notifications
*/
public function is_configured();
/**
* Send notification through this channel
*
* @param string $event_id Event identifier (e.g., 'order_completed', 'newsletter_confirm')
* @param string $recipient Recipient type ('customer', 'staff')
* @param array $data Notification context data (order, user, custom vars, etc.)
* @return bool|array Success status, or array with 'success' and 'message' keys
*/
public function send($event_id, $recipient, $data);
/**
* Get channel configuration fields for admin settings
*
* Optional. Returns array of field definitions for settings UI.
*
* @return array Field definitions (e.g., API key, sender number, etc.)
*/
public function get_config_fields();
}

View File

@@ -0,0 +1,252 @@
<?php
/**
* WhatsApp Channel - Example Implementation
*
* This is a reference implementation showing how to create a custom notification channel.
* Developers can use this as a template for implementing WhatsApp, SMS, Telegram, etc.
*
* @package WooNooW\Core\Notifications\Channels
*/
namespace WooNooW\Core\Notifications\Channels;
/**
* Example WhatsApp Channel Implementation
*
* This channel sends notifications via WhatsApp Business API.
* Replace API calls with your actual WhatsApp service provider (Twilio, MessageBird, etc.)
*/
class WhatsAppChannel implements ChannelInterface
{
/**
* Get channel ID
*/
public function get_id()
{
return 'whatsapp';
}
/**
* Get channel label
*/
public function get_label()
{
return __('WhatsApp', 'woonoow');
}
/**
* Check if channel is configured
*/
public function is_configured()
{
$api_key = get_option('woonoow_whatsapp_api_key', '');
$phone_number = get_option('woonoow_whatsapp_phone_number', '');
return !empty($api_key) && !empty($phone_number);
}
/**
* Send WhatsApp notification
*
* @param string $event_id Event identifier
* @param string $recipient Recipient type ('customer' or 'staff')
* @param array $data Context data (order, user, etc.)
* @return bool|array Success status
*/
public function send($event_id, $recipient, $data)
{
// Get recipient phone number
$phone = $this->get_recipient_phone($recipient, $data);
if (empty($phone)) {
return [
'success' => false,
'message' => 'No phone number available for recipient',
];
}
// Build message content based on event
$message = $this->build_message($event_id, $data);
if (empty($message)) {
return [
'success' => false,
'message' => 'Could not build message for event: ' . $event_id,
];
}
// Send via WhatsApp API
$result = $this->send_whatsapp_message($phone, $message);
// Log the send attempt
do_action('woonoow_whatsapp_sent', $event_id, $recipient, $phone, $result);
return $result;
}
/**
* Get configuration fields for admin settings
*/
public function get_config_fields()
{
return [
[
'id' => 'woonoow_whatsapp_api_key',
'label' => __('WhatsApp API Key', 'woonoow'),
'type' => 'text',
'description' => __('Your WhatsApp Business API key', 'woonoow'),
],
[
'id' => 'woonoow_whatsapp_phone_number',
'label' => __('WhatsApp Business Number', 'woonoow'),
'type' => 'text',
'description' => __('Your WhatsApp Business phone number (with country code)', 'woonoow'),
'placeholder' => '+1234567890',
],
[
'id' => 'woonoow_whatsapp_provider',
'label' => __('Service Provider', 'woonoow'),
'type' => 'select',
'options' => [
'twilio' => 'Twilio',
'messagebird' => 'MessageBird',
'custom' => 'Custom',
],
'default' => 'twilio',
],
];
}
/**
* Get recipient phone number
*
* @param string $recipient Recipient type
* @param array $data Context data
* @return string Phone number or empty string
*/
private function get_recipient_phone($recipient, $data)
{
if ($recipient === 'customer') {
// Get customer phone from order or user data
if (isset($data['order'])) {
return $data['order']->get_billing_phone();
}
if (isset($data['user_id'])) {
return get_user_meta($data['user_id'], 'billing_phone', true);
}
if (isset($data['email'])) {
$user = get_user_by('email', $data['email']);
if ($user) {
return get_user_meta($user->ID, 'billing_phone', true);
}
}
} elseif ($recipient === 'staff') {
// Get admin phone from settings
return get_option('woonoow_whatsapp_admin_phone', '');
}
return '';
}
/**
* Build message content based on event
*
* @param string $event_id Event identifier
* @param array $data Context data
* @return string Message text
*/
private function build_message($event_id, $data)
{
// Allow filtering message content
$message = apply_filters("woonoow_whatsapp_message_{$event_id}", '', $data);
if (!empty($message)) {
return $message;
}
// Default messages for common events
$site_name = get_bloginfo('name');
switch ($event_id) {
case 'order_completed':
if (isset($data['order'])) {
$order = $data['order'];
return sprintf(
"🎉 Your order #%s has been completed! Thank you for shopping with %s.",
$order->get_order_number(),
$site_name
);
}
break;
case 'newsletter_confirm':
if (isset($data['confirmation_url'])) {
return sprintf(
"Please confirm your newsletter subscription by clicking: %s",
$data['confirmation_url']
);
}
break;
// Add more event templates as needed
}
return '';
}
/**
* Send WhatsApp message via API
*
* Replace this with actual API integration for your provider
*
* @param string $phone Recipient phone number
* @param string $message Message text
* @return array Result with 'success' and 'message' keys
*/
private function send_whatsapp_message($phone, $message)
{
$api_key = get_option('woonoow_whatsapp_api_key', '');
$from_number = get_option('woonoow_whatsapp_phone_number', '');
$provider = get_option('woonoow_whatsapp_provider', 'twilio');
// Example: Twilio API (replace with your actual implementation)
if ($provider === 'twilio') {
$endpoint = 'https://api.twilio.com/2010-04-01/Accounts/YOUR_ACCOUNT_SID/Messages.json';
$response = wp_remote_post($endpoint, [
'headers' => [
'Authorization' => 'Basic ' . base64_encode($api_key),
'Content-Type' => 'application/x-www-form-urlencoded',
],
'body' => [
'From' => 'whatsapp:' . $from_number,
'To' => 'whatsapp:' . $phone,
'Body' => $message,
],
]);
if (is_wp_error($response)) {
return [
'success' => false,
'message' => $response->get_error_message(),
];
}
$status_code = wp_remote_retrieve_response_code($response);
return [
'success' => $status_code >= 200 && $status_code < 300,
'message' => $status_code >= 200 && $status_code < 300
? 'WhatsApp message sent successfully'
: 'Failed to send WhatsApp message',
];
}
// For custom providers, implement your own logic here
return [
'success' => false,
'message' => 'Provider not configured',
];
}
}