Update README.md with comprehensive documentation and cleanup test files
- Added Discord & Slack notifications section with configuration guide - Documented multiple phone numbers per workflow feature - Updated version to 2.1.0 with full changelog - Enhanced configuration sections for new features - Added database structure documentation for twp_workflow_phones table - Removed obsolete test files (test-sdk.php, test-capabilities.php, test-ajax-response.php) - Updated plugin header with new version and repository URL 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
		
							
								
								
									
										57
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								README.md
									
									
									
									
									
								
							@@ -81,6 +81,14 @@ This plugin **requires** the Twilio PHP SDK v8.7.0 to function. The plugin will
 | 
			
		||||
- **Command System**: Text commands to manage availability
 | 
			
		||||
- **SMS Logging**: Complete history of all SMS interactions
 | 
			
		||||
 | 
			
		||||
### 🔔 Discord & Slack Notifications
 | 
			
		||||
- **Real-time Alerts**: Instant notifications to Discord channels and Slack workspaces
 | 
			
		||||
- **Multiple Event Types**: Incoming calls, queue timeouts, and missed calls
 | 
			
		||||
- **Rich Formatting**: Structured messages with caller info, queue details, and timestamps
 | 
			
		||||
- **Webhook Integration**: Simple configuration with webhook URLs
 | 
			
		||||
- **Configurable Options**: Enable/disable specific notification types
 | 
			
		||||
- **Automatic Monitoring**: Background checks for queue timeout situations
 | 
			
		||||
 | 
			
		||||
### 📊 Real-time Dashboard
 | 
			
		||||
- **Queue Monitor**: Live view of waiting calls
 | 
			
		||||
- **Agent Status**: Track agent availability
 | 
			
		||||
@@ -92,9 +100,10 @@ This plugin **requires** the Twilio PHP SDK v8.7.0 to function. The plugin will
 | 
			
		||||
- **Voicemail Transcription**: Automatic speech-to-text
 | 
			
		||||
- **Callback System**: Offer callbacks instead of long holds
 | 
			
		||||
- **Outbound Calling**: Click-to-call with proper caller ID
 | 
			
		||||
- **Multiple Phone Numbers**: Support for multiple business lines
 | 
			
		||||
- **Multiple Phone Numbers**: Support for multiple business lines per workflow
 | 
			
		||||
- **Agent Phone Management**: Store and validate agent phone numbers
 | 
			
		||||
- **Duplicate Prevention**: Ensures unique phone numbers per agent
 | 
			
		||||
- **Enhanced Notifications**: Discord and Slack integration for real-time alerts
 | 
			
		||||
 | 
			
		||||
## Recent Updates
 | 
			
		||||
 | 
			
		||||
@@ -119,6 +128,19 @@ This plugin **requires** the Twilio PHP SDK v8.7.0 to function. The plugin will
 | 
			
		||||
- **Queue Selection**: Proper queue routing based on digit selection
 | 
			
		||||
- **Voice Selection**: Fixed voice dropdown persistence issues
 | 
			
		||||
 | 
			
		||||
### Multiple Phone Numbers Support
 | 
			
		||||
- **Workflow Enhancement**: Workflows can now be assigned to multiple phone numbers
 | 
			
		||||
- **Junction Table**: New `twp_workflow_phones` table for many-to-many relationships
 | 
			
		||||
- **Backward Compatibility**: Existing single-number workflows continue to work
 | 
			
		||||
- **Validation Fixes**: Proper validation for multiple phone number selections
 | 
			
		||||
 | 
			
		||||
### Discord & Slack Notifications
 | 
			
		||||
- **Real-time Integration**: Instant notifications to Discord channels and Slack workspaces
 | 
			
		||||
- **Event Monitoring**: Automated tracking of incoming calls, queue timeouts, and missed calls
 | 
			
		||||
- **Rich Message Format**: Structured notifications with caller details, queue info, and timestamps
 | 
			
		||||
- **Configurable Settings**: Toggle notification types and set custom webhook URLs
 | 
			
		||||
- **Background Processing**: Cron-based monitoring for queue timeout alerts
 | 
			
		||||
 | 
			
		||||
## How It Works
 | 
			
		||||
 | 
			
		||||
### Call Flow
 | 
			
		||||
@@ -168,13 +190,13 @@ This plugin **requires** the Twilio PHP SDK v8.7.0 to function. The plugin will
 | 
			
		||||
2. **In WordPress Admin**:
 | 
			
		||||
   - Go to **Twilio** → **Phone Numbers**
 | 
			
		||||
   - Verify numbers are synchronized
 | 
			
		||||
   - Assign workflows to numbers
 | 
			
		||||
   - Assign workflows to numbers (multiple numbers per workflow supported)
 | 
			
		||||
 | 
			
		||||
### Creating Workflows
 | 
			
		||||
1. **Navigate to** Twilio → Workflows
 | 
			
		||||
2. **Create New Workflow**:
 | 
			
		||||
   - Name your workflow
 | 
			
		||||
   - Select phone number to assign
 | 
			
		||||
   - Select phone numbers to assign (multiple selection supported)
 | 
			
		||||
   - Add steps using the builder
 | 
			
		||||
 | 
			
		||||
3. **Configure Steps**:
 | 
			
		||||
@@ -218,6 +240,24 @@ This plugin **requires** the Twilio PHP SDK v8.7.0 to function. The plugin will
 | 
			
		||||
4. **Configure Call Mode**: Browser or cell phone
 | 
			
		||||
5. **Train Agents** on SMS commands and browser phone
 | 
			
		||||
 | 
			
		||||
### Discord & Slack Setup
 | 
			
		||||
1. **Discord Configuration**:
 | 
			
		||||
   - Create a webhook URL in your Discord server settings
 | 
			
		||||
   - Navigate to **Twilio** → **Settings** → **Notifications**
 | 
			
		||||
   - Paste Discord webhook URL
 | 
			
		||||
   - Enable desired notification types
 | 
			
		||||
 | 
			
		||||
2. **Slack Configuration**:
 | 
			
		||||
   - Create a webhook URL in your Slack workspace
 | 
			
		||||
   - Navigate to **Twilio** → **Settings** → **Notifications**
 | 
			
		||||
   - Paste Slack webhook URL
 | 
			
		||||
   - Configure notification preferences
 | 
			
		||||
 | 
			
		||||
3. **Notification Types**:
 | 
			
		||||
   - **Incoming Calls**: Alert when calls enter queues
 | 
			
		||||
   - **Queue Timeouts**: Alert when calls wait too long (configurable threshold)
 | 
			
		||||
   - **Missed Calls**: Alert when calls are abandoned or timeout
 | 
			
		||||
 | 
			
		||||
## Voice Configuration
 | 
			
		||||
 | 
			
		||||
### ElevenLabs Integration
 | 
			
		||||
@@ -296,6 +336,7 @@ The plugin creates these tables:
 | 
			
		||||
- `twp_call_queues` - Queue configurations (uses notification_number)
 | 
			
		||||
- `twp_queued_calls` - Active calls in queues
 | 
			
		||||
- `twp_workflows` - Call flow definitions with voice persistence
 | 
			
		||||
- `twp_workflow_phones` - Junction table for multiple phone numbers per workflow
 | 
			
		||||
- `twp_call_log` - Complete call history
 | 
			
		||||
- `twp_sms_log` - SMS message tracking
 | 
			
		||||
- `twp_voicemails` - Recordings and transcriptions
 | 
			
		||||
@@ -338,7 +379,15 @@ All webhooks are REST API endpoints under `/wp-json/twilio-webhook/v1/`:
 | 
			
		||||
 | 
			
		||||
## Version History
 | 
			
		||||
 | 
			
		||||
### v2.0.0 (Current)
 | 
			
		||||
### v2.1.0 (Current)
 | 
			
		||||
- **Multiple Phone Numbers**: Workflows can now handle multiple phone numbers
 | 
			
		||||
- **Discord & Slack Integration**: Real-time notifications for call events
 | 
			
		||||
- **Enhanced Monitoring**: Automated queue timeout tracking and alerts
 | 
			
		||||
- **Notification System**: Configurable webhook-based notifications
 | 
			
		||||
- **Background Processing**: Cron jobs for timeout monitoring
 | 
			
		||||
- **Database Enhancements**: New junction table for phone number relationships
 | 
			
		||||
 | 
			
		||||
### v2.0.0
 | 
			
		||||
- Upgraded to Twilio Voice SDK v2 for browser phone
 | 
			
		||||
- Fixed queue notification_number field naming
 | 
			
		||||
- Enhanced voice selection persistence
 | 
			
		||||
 
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * Test what the AJAX method actually returns
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// Load WordPress
 | 
			
		||||
$wp_load_path = dirname(dirname(dirname(dirname(__FILE__)))) . '/wp-load.php';
 | 
			
		||||
require_once $wp_load_path;
 | 
			
		||||
 | 
			
		||||
// Load the plugin
 | 
			
		||||
require_once __DIR__ . '/includes/class-twp-twilio-api.php';
 | 
			
		||||
 | 
			
		||||
// Create API instance
 | 
			
		||||
$api = new TWP_Twilio_API();
 | 
			
		||||
 | 
			
		||||
// Get phone numbers
 | 
			
		||||
$response = $api->get_phone_numbers();
 | 
			
		||||
 | 
			
		||||
echo "API Response:\n";
 | 
			
		||||
echo "=============\n";
 | 
			
		||||
print_r($response);
 | 
			
		||||
 | 
			
		||||
if ($response['success'] && !empty($response['data']['incoming_phone_numbers'])) {
 | 
			
		||||
    echo "\nFirst phone number data:\n";
 | 
			
		||||
    echo "========================\n";
 | 
			
		||||
    $first = $response['data']['incoming_phone_numbers'][0];
 | 
			
		||||
    foreach ($first as $key => $value) {
 | 
			
		||||
        if (is_array($value)) {
 | 
			
		||||
            echo "$key: " . json_encode($value) . "\n";
 | 
			
		||||
        } else {
 | 
			
		||||
            echo "$key: $value\n";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,37 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * Test script to check PhoneNumberCapabilities methods
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// Load the autoloader
 | 
			
		||||
require_once __DIR__ . '/vendor/autoload.php';
 | 
			
		||||
 | 
			
		||||
// Create a mock capabilities object to test available methods
 | 
			
		||||
echo "Testing PhoneNumberCapabilities methods:\n";
 | 
			
		||||
echo "========================================\n";
 | 
			
		||||
 | 
			
		||||
// We'll check what methods are available
 | 
			
		||||
$reflection = new ReflectionClass('Twilio\Base\PhoneNumberCapabilities');
 | 
			
		||||
$methods = $reflection->getMethods(ReflectionMethod::IS_PUBLIC);
 | 
			
		||||
 | 
			
		||||
echo "Public methods available:\n";
 | 
			
		||||
foreach ($methods as $method) {
 | 
			
		||||
    if (!$method->isConstructor() && !$method->isDestructor()) {
 | 
			
		||||
        echo "- " . $method->getName() . "()\n";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
echo "\nProperties:\n";
 | 
			
		||||
$properties = $reflection->getProperties();
 | 
			
		||||
foreach ($properties as $property) {
 | 
			
		||||
    echo "- " . $property->getName() . " (" . ($property->isPublic() ? 'public' : ($property->isProtected() ? 'protected' : 'private')) . ")\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Check if we can access via array notation
 | 
			
		||||
echo "\nTesting array access:\n";
 | 
			
		||||
try {
 | 
			
		||||
    // This won't work, but let's see what happens
 | 
			
		||||
    echo "ArrayAccess interface: " . (in_array('ArrayAccess', class_implements('Twilio\Base\PhoneNumberCapabilities')) ? 'YES' : 'NO') . "\n";
 | 
			
		||||
} catch (Exception $e) {
 | 
			
		||||
    echo "Error: " . $e->getMessage() . "\n";
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										71
									
								
								test-sdk.php
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								test-sdk.php
									
									
									
									
									
								
							@@ -1,71 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * Simple test script to verify Twilio SDK installation
 | 
			
		||||
 * Run this from command line: php test-sdk.php
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
echo "Twilio SDK Installation Test\n";
 | 
			
		||||
echo "===========================\n\n";
 | 
			
		||||
 | 
			
		||||
// Check if autoloader exists
 | 
			
		||||
$autoloader = __DIR__ . '/vendor/autoload.php';
 | 
			
		||||
echo "1. Checking autoloader...\n";
 | 
			
		||||
echo "   Path: $autoloader\n";
 | 
			
		||||
 | 
			
		||||
if (!file_exists($autoloader)) {
 | 
			
		||||
    echo "   ❌ FAIL: Autoloader not found\n";
 | 
			
		||||
    echo "   Please run: ./install-twilio-sdk.sh\n";
 | 
			
		||||
    exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
echo "   ✅ OK: Autoloader exists\n\n";
 | 
			
		||||
 | 
			
		||||
// Load autoloader
 | 
			
		||||
echo "2. Loading autoloader...\n";
 | 
			
		||||
require_once $autoloader;
 | 
			
		||||
echo "   ✅ OK: Autoloader loaded\n\n";
 | 
			
		||||
 | 
			
		||||
// Check for Twilio classes
 | 
			
		||||
echo "3. Checking Twilio classes...\n";
 | 
			
		||||
 | 
			
		||||
$classes_to_check = [
 | 
			
		||||
    'Twilio\Rest\Client',
 | 
			
		||||
    'Twilio\TwiML\VoiceResponse', 
 | 
			
		||||
    'Twilio\Exceptions\TwilioException',
 | 
			
		||||
    'Twilio\Security\RequestValidator'
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
$all_good = true;
 | 
			
		||||
foreach ($classes_to_check as $class) {
 | 
			
		||||
    if (class_exists($class)) {
 | 
			
		||||
        echo "   ✅ OK: $class\n";
 | 
			
		||||
    } else {
 | 
			
		||||
        echo "   ❌ FAIL: $class not found\n";
 | 
			
		||||
        $all_good = false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
echo "\n";
 | 
			
		||||
 | 
			
		||||
if ($all_good) {
 | 
			
		||||
    echo "🎉 SUCCESS: Twilio SDK is properly installed!\n";
 | 
			
		||||
    echo "\nYou can now use the WordPress plugin.\n";
 | 
			
		||||
    echo "Don't forget to configure your Twilio credentials in WordPress admin.\n";
 | 
			
		||||
} else {
 | 
			
		||||
    echo "❌ FAILURE: SDK installation incomplete\n";
 | 
			
		||||
    echo "\nPlease run: ./install-twilio-sdk.sh\n";
 | 
			
		||||
    exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Try to create a simple TwiML response
 | 
			
		||||
echo "\n4. Testing TwiML generation...\n";
 | 
			
		||||
try {
 | 
			
		||||
    $response = new \Twilio\TwiML\VoiceResponse();
 | 
			
		||||
    $response->say('Hello from Twilio SDK test!');
 | 
			
		||||
    echo "   ✅ OK: TwiML generation works\n";
 | 
			
		||||
    echo "   Generated: " . substr(str_replace(["\n", "\r"], '', $response->asXML()), 0, 100) . "...\n";
 | 
			
		||||
} catch (Exception $e) {
 | 
			
		||||
    echo "   ❌ FAIL: TwiML generation failed: " . $e->getMessage() . "\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
echo "\nInstallation test complete!\n";
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * Plugin Name: Twilio WP Plugin
 | 
			
		||||
 * Plugin URI: https://example.com/twilio-wp-plugin
 | 
			
		||||
 * Plugin URI: https://repo.anhonesthost.net/wp-plugins/twilio-wp-plugin
 | 
			
		||||
 * Description: WordPress plugin for Twilio integration with phone scheduling, call forwarding, queue management, and Eleven Labs TTS
 | 
			
		||||
 * Version: 1.0.0
 | 
			
		||||
 * Author: Your Name
 | 
			
		||||
 * Version: 2.1.0
 | 
			
		||||
 * Author: Josh Knapp
 | 
			
		||||
 * License: GPL v2 or later
 | 
			
		||||
 * Text Domain: twilio-wp-plugin
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user