All checks were successful
Create Release / build (push) Successful in 6s
Server-side: - Add push credential auto-creation for FCM incoming call notifications - Add queue alert FCM notifications (data-only for background delivery) - Add queue alert cancellation on call accept/disconnect - Fix caller ID to show caller's number instead of Twilio number - Fix FCM token storage when refresh_token is null - Add pre_call_status tracking to revert agent status 30s after call ends - Add SSE fallback polling for mobile app connectivity Mobile app: - Add Android telecom permissions and phone account registration - Add VoiceFirebaseMessagingService for incoming call push handling - Add insistent queue alert notifications with custom sound - Fix caller number display on active call screen - Add caller ID selection dropdown on dashboard - Add phone numbers endpoint and provider support - Add unit tests for CallInfo, QueueState, and CallProvider - Remove local.properties from tracking, add .gitignore Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5.9 KiB
5.9 KiB
Twilio WordPress Plugin - Quick Reference
Environment
- Production:
/home/shadowdao/public_html/wp-content/plugins/twilio-wp-plugin/ - Dev:
/home/jknapp/code/twilio-wp-plugin/ - URL:
https://phone.cloud-hosting.io/ - Deployment: rsync to Docker (remote server only, not local)
- SDK: Twilio PHP SDK v8.7.0
- PHP: 8.0+ required
- Optional: AWS SDK (
aws/aws-sdk-php) for SNS SMS provider - External SDK:
wp-content/twilio-sdk/(survives plugin updates)
Commands
- Install SDK (recommended):
./install-twilio-sdk-external.sh(installs towp-content/twilio-sdk/) - Install SDK (internal):
./install-twilio-sdk.sh(installs tovendor/, lost on plugin update) - Test SDK:
php test-sdk.php - Composer install SDK:
composer install-sdk - Deploy: rsync to Docker (remote server, see production path above)
- CI/CD: Gitea workflows in
.gitea/workflows/—release.yml,update-version.yml
Directory Structure
twilio-wp-plugin.php— Main plugin file, constants, SDK loadingincludes/— All backend classes (28 class files)admin/— Admin UI class (TWP_Admin), mobile app settings pageassets/js/— Browser phone JS, service workerassets/images/,assets/sounds/— Static assets.gitea/workflows/— CI/CD (release, version update)
Phone Variable Names
Use: incoming_number, agent_number, customer_number, workflow_number, queue_number, default_number
Don't use: from_number, to_number, phone_number, $agent_phone
Test numbers: Twilio +19516215107, Agent +19095737372
Key Classes
- TWP_Twilio_API: Use
new TWP_Twilio_API()not singleton - TWP_Admin: Has
find_customer_call_leg()- CRITICAL for call control - TWP_TTS_Helper: ElevenLabs/Alice fallback, 30-day cache
- TWP_User_Queue_Manager: Auto-creates queues/extensions (100-9999)
- TWP_Webhooks: 35 endpoints at
twilio-webhook/v1 - TWP_Activator: Creates 16 DB tables, run
ensure_tables_exist()if missing - TWP_Core: Main plugin orchestrator, hooks all classes together
- TWP_SMS_Manager: SMS abstraction with provider interface
- TWP_SMS_Provider_Twilio / TWP_SMS_Provider_SNS: SMS providers (Twilio default, AWS SNS optional)
- TWP_Mobile_API: REST API for mobile app
- TWP_Mobile_Auth / TWP_Mobile_SSE / TWP_FCM: Mobile auth, server-sent events, push notifications
- TWP_Call_Queue: Queue operations and management
- TWP_Callback_Manager: Callback request handling
- TWP_Workflow: Workflow step execution engine
- TWP_Auto_Updater: Plugin auto-update from Gitea releases
Database
16 tables with twp_ prefix. Key notes:
twp_call_queues: User queues (general/personal/hold)twp_agent_status: Hasauto_busy_atfor 1-min auto-reverttwp_queued_calls: Usesenqueued_atnotjoined_at
Critical Functions
Call Control (MUST use call leg detection)
// ALWAYS do this for hold/transfer/requeue:
$customer_call_sid = $this->find_customer_call_leg($call_sid, $twilio);
$api->update_call($customer_call_sid, ['twiml' => $twiml_xml]);
Common Fixes
- Recording: Use
Twilio.CURRENTfor SDK v8 - Queue: Pass
waitUrlas option inenqueue() - TwiML: Use SDK classes, not raw XML
Development Notes
- API: E.164 format (+1XXXXXXXXXX)
- Database: Use
$wpdb, prepared statements - AJAX: Verify nonce, return JSON
- Naming: TWP_ for classes, twp_ for tables/options
- Debugging: Look for "TWP Call Leg Detection" in logs
Features
- Agents accept calls via SMS "1"
- User-specific queues with extensions
- Browser phone at
admin.php?page=twilio-wp-browser-phone - ElevenLabs TTS with Alice fallback
- 77 AJAX actions, 35 REST endpoints
- Browser phone moved to admin-only (v2.3.0)
- Firefox, Chrome, Safari, Edge support
- 1-min agent status auto-revert
SDK Loading
- External SDK (Recommended):
wp-content/twilio-sdk/— survives plugin updates - Internal SDK:
vendor/— deleted on plugin update, needs reinstall - Loading priority: External first (
TWP_EXTERNAL_SDK_DIR), then internal fallback - Post-update hook (
upgrader_process_complete) warns if SDK missing
Browser Phone Configuration
- Edge Location:
twp_twilio_edgeoption, defaultroaming - Options: roaming, ashburn, umatilla, dublin, frankfurt, singapore, sydney, tokyo, sao-paulo
- Wrong edge causes immediate call failures (e.g., US calls with Sydney edge)
Mobile App SSE (Server-Sent Events)
The mobile app uses SSE for real-time updates (queue changes, agent status). If SSE doesn't work (green dot stays red), the app automatically falls back to 5-second polling.
Apache + PHP-FPM Buffering Fix
mod_proxy_fcgi buffers PHP output by default, which breaks SSE streaming. Fix by adding a config file on the server:
echo 'ProxyPassMatch "^/wp-json/twilio-mobile/v1/stream/events$" "unix:/run/php-fpm/www.sock|fcgi://localhost/home/shadowdao/public_html/index.php" flushpackets=on' > /etc/httpd/conf.d/twp-sse.conf
httpd -t && systemctl restart httpd
flushpackets=onis the key — tells Apache to flush PHP-FPM output immediately- This is a
ProxyPassMatchdirective — cannot go in.htaccess, must be server config - The PHP-FPM socket path (
/run/php-fpm/www.sock) must match/etc/httpd/conf.d/php.conf - If the server uses nginx instead of Apache, add
X-Accel-Buffering: noheader (already in PHP code) - If behind HAProxy with HTTP/2, the issue is Apache→client buffering, not HTTP/2 framing
Diagnosis
# Check PHP-FPM proxy config
grep -r "fcgi\|php-fpm" /etc/httpd/conf.d/
# Check if flushpackets is configured
grep -r "flushpackets" /etc/httpd/conf.d/
# Test SSE endpoint (should stream data, not hang)
curl -N -H "Authorization: Bearer TOKEN" https://phone.cloud-hosting.io/wp-json/twilio-mobile/v1/stream/events
Changelog
See README.md for detailed version history. Current version: v2.8.9.
Updated: Mar 2026