2025-08-06 15:25:47 -07:00
|
|
|
<?php
|
|
|
|
|
/**
|
|
|
|
|
* Plugin Name: Twilio WP Plugin
|
2025-08-13 11:24:29 -07:00
|
|
|
* Plugin URI: https://repo.anhonesthost.net/wp-plugins/twilio-wp-plugin
|
2025-08-06 15:25:47 -07:00
|
|
|
* Description: WordPress plugin for Twilio integration with phone scheduling, call forwarding, queue management, and Eleven Labs TTS
|
2025-12-01 16:32:42 -08:00
|
|
|
* Version: {auto_update_value_on_deploy}
|
2025-08-13 11:24:29 -07:00
|
|
|
* Author: Josh Knapp
|
2025-08-06 15:25:47 -07:00
|
|
|
* License: GPL v2 or later
|
|
|
|
|
* Text Domain: twilio-wp-plugin
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// If this file is called directly, abort.
|
|
|
|
|
if (!defined('WPINC')) {
|
|
|
|
|
die;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Plugin constants
|
2025-12-01 16:32:42 -08:00
|
|
|
define('TWP_VERSION', '{auto_update_value_on_deploy}');
|
2025-09-02 11:03:33 -07:00
|
|
|
define('TWP_DB_VERSION', '1.6.2'); // Track database version separately
|
2025-08-06 15:25:47 -07:00
|
|
|
define('TWP_PLUGIN_DIR', plugin_dir_path(__FILE__));
|
|
|
|
|
define('TWP_PLUGIN_URL', plugin_dir_url(__FILE__));
|
|
|
|
|
define('TWP_PLUGIN_BASENAME', plugin_basename(__FILE__));
|
2026-01-23 18:03:38 -08:00
|
|
|
// External SDK location - survives plugin updates (wp-content/twilio-sdk/)
|
|
|
|
|
define('TWP_EXTERNAL_SDK_DIR', dirname(dirname(TWP_PLUGIN_DIR)) . '/twilio-sdk/');
|
2025-08-06 15:25:47 -07:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Plugin activation hook
|
|
|
|
|
*/
|
|
|
|
|
function twp_activate() {
|
|
|
|
|
require_once TWP_PLUGIN_DIR . 'includes/class-twp-activator.php';
|
|
|
|
|
TWP_Activator::activate();
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-07 15:24:29 -07:00
|
|
|
/**
|
|
|
|
|
* Check if Twilio SDK is installed and show admin notice if not
|
2026-01-23 18:03:38 -08:00
|
|
|
* Checks external location first (survives plugin updates), then internal fallback
|
2025-08-07 15:24:29 -07:00
|
|
|
*/
|
|
|
|
|
function twp_check_sdk_installation() {
|
|
|
|
|
$sdk_installed = false;
|
2026-01-23 18:03:38 -08:00
|
|
|
|
|
|
|
|
// Priority 1: Check external SDK location (survives plugin updates)
|
|
|
|
|
$external_autoloader = TWP_EXTERNAL_SDK_DIR . 'autoload.php';
|
|
|
|
|
if (file_exists($external_autoloader)) {
|
|
|
|
|
require_once $external_autoloader;
|
2025-08-07 15:24:29 -07:00
|
|
|
$sdk_installed = class_exists('Twilio\Rest\Client');
|
|
|
|
|
}
|
2026-01-23 18:03:38 -08:00
|
|
|
|
|
|
|
|
// Priority 2: Fall back to internal vendor directory
|
|
|
|
|
if (!$sdk_installed) {
|
|
|
|
|
$internal_autoloader = TWP_PLUGIN_DIR . 'vendor/autoload.php';
|
|
|
|
|
if (file_exists($internal_autoloader)) {
|
|
|
|
|
require_once $internal_autoloader;
|
|
|
|
|
$sdk_installed = class_exists('Twilio\Rest\Client');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-07 15:24:29 -07:00
|
|
|
if (!$sdk_installed) {
|
|
|
|
|
add_action('admin_notices', 'twp_sdk_missing_notice');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Display admin notice for missing SDK
|
|
|
|
|
*/
|
|
|
|
|
function twp_sdk_missing_notice() {
|
|
|
|
|
?>
|
|
|
|
|
<div class="notice notice-error is-dismissible">
|
|
|
|
|
<h3>Twilio WordPress Plugin - SDK Required</h3>
|
|
|
|
|
<p><strong>The Twilio PHP SDK is required for this plugin to work.</strong></p>
|
2026-01-23 18:03:38 -08:00
|
|
|
<p><strong>Recommended:</strong> Install SDK to external location (survives plugin updates):</p>
|
|
|
|
|
<code>chmod +x install-twilio-sdk-external.sh && ./install-twilio-sdk-external.sh</code>
|
|
|
|
|
<p style="margin-top: 10px;"><strong>Alternative:</strong> Install SDK inside plugin folder:</p>
|
2025-08-07 15:24:29 -07:00
|
|
|
<code>chmod +x install-twilio-sdk.sh && ./install-twilio-sdk.sh</code>
|
2026-01-23 18:03:38 -08:00
|
|
|
<p style="margin-top: 10px;"><em>Plugin path: <?php echo esc_html(TWP_PLUGIN_DIR); ?></em></p>
|
|
|
|
|
<p><em>External SDK path: <?php echo esc_html(TWP_EXTERNAL_SDK_DIR); ?></em></p>
|
2025-08-07 15:24:29 -07:00
|
|
|
</div>
|
|
|
|
|
<?php
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-11 20:31:48 -07:00
|
|
|
// Check SDK installation and database updates on admin pages
|
2025-08-07 15:24:29 -07:00
|
|
|
if (is_admin()) {
|
|
|
|
|
add_action('admin_init', 'twp_check_sdk_installation');
|
2025-08-11 20:31:48 -07:00
|
|
|
add_action('admin_init', 'twp_check_database_updates');
|
2025-09-02 11:03:33 -07:00
|
|
|
add_action('admin_init', 'twp_setup_auto_revert_cron');
|
2025-08-11 20:31:48 -07:00
|
|
|
}
|
|
|
|
|
|
2025-09-02 11:03:33 -07:00
|
|
|
// Hook up cron functions
|
|
|
|
|
add_filter('cron_schedules', 'twp_add_cron_interval');
|
|
|
|
|
add_action('twp_auto_revert_agents', 'twp_handle_auto_revert_agents');
|
|
|
|
|
|
2025-08-11 20:31:48 -07:00
|
|
|
/**
|
|
|
|
|
* Check and perform database updates if needed
|
|
|
|
|
*/
|
|
|
|
|
function twp_check_database_updates() {
|
|
|
|
|
$current_db_version = get_option('twp_db_version', '1.0.0');
|
|
|
|
|
|
|
|
|
|
if (version_compare($current_db_version, TWP_DB_VERSION, '<')) {
|
|
|
|
|
require_once TWP_PLUGIN_DIR . 'includes/class-twp-activator.php';
|
|
|
|
|
TWP_Activator::ensure_tables_exist();
|
|
|
|
|
update_option('twp_db_version', TWP_DB_VERSION);
|
|
|
|
|
}
|
2025-08-07 15:24:29 -07:00
|
|
|
}
|
|
|
|
|
|
2025-09-02 11:03:33 -07:00
|
|
|
/**
|
|
|
|
|
* Setup auto-revert cron job for agent status
|
|
|
|
|
*/
|
|
|
|
|
function twp_setup_auto_revert_cron() {
|
|
|
|
|
if (!wp_next_scheduled('twp_auto_revert_agents')) {
|
|
|
|
|
wp_schedule_event(time(), 'twp_every_minute', 'twp_auto_revert_agents');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Handle auto-revert cron job
|
|
|
|
|
*/
|
|
|
|
|
function twp_handle_auto_revert_agents() {
|
|
|
|
|
require_once TWP_PLUGIN_DIR . 'includes/class-twp-agent-manager.php';
|
|
|
|
|
TWP_Agent_Manager::revert_auto_busy_agents();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Add custom cron schedule
|
|
|
|
|
*/
|
|
|
|
|
function twp_add_cron_interval($schedules) {
|
|
|
|
|
$schedules['twp_every_minute'] = array(
|
|
|
|
|
'interval' => 60, // Every 60 seconds
|
|
|
|
|
'display' => esc_html__('Every Minute (TWP)', 'twilio-wp-plugin')
|
|
|
|
|
);
|
|
|
|
|
return $schedules;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-06 15:25:47 -07:00
|
|
|
/**
|
|
|
|
|
* Plugin deactivation hook
|
|
|
|
|
*/
|
|
|
|
|
function twp_deactivate() {
|
|
|
|
|
require_once TWP_PLUGIN_DIR . 'includes/class-twp-deactivator.php';
|
|
|
|
|
TWP_Deactivator::deactivate();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
register_activation_hook(__FILE__, 'twp_activate');
|
|
|
|
|
register_deactivation_hook(__FILE__, 'twp_deactivate');
|
|
|
|
|
|
2026-01-23 18:03:38 -08:00
|
|
|
/**
|
|
|
|
|
* Check SDK status after plugin updates
|
|
|
|
|
* Shows warning if SDK was deleted during update and external SDK not available
|
|
|
|
|
*/
|
|
|
|
|
function twp_check_sdk_after_update($upgrader_object, $options) {
|
|
|
|
|
// Only run for plugin updates
|
|
|
|
|
if ($options['action'] !== 'update' || $options['type'] !== 'plugin') {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check if this plugin was updated
|
|
|
|
|
$updated_plugins = isset($options['plugins']) ? $options['plugins'] : array();
|
|
|
|
|
if (!in_array(TWP_PLUGIN_BASENAME, $updated_plugins)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check if SDK is available
|
|
|
|
|
$external_sdk = file_exists(TWP_EXTERNAL_SDK_DIR . 'autoload.php');
|
|
|
|
|
$internal_sdk = file_exists(TWP_PLUGIN_DIR . 'vendor/autoload.php');
|
|
|
|
|
|
|
|
|
|
if (!$external_sdk && !$internal_sdk) {
|
|
|
|
|
// Set a transient to show warning on next admin page load
|
|
|
|
|
set_transient('twp_sdk_update_warning', true, 60 * 5);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
add_action('upgrader_process_complete', 'twp_check_sdk_after_update', 10, 2);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Show SDK update warning
|
|
|
|
|
*/
|
|
|
|
|
function twp_show_sdk_update_warning() {
|
|
|
|
|
if (get_transient('twp_sdk_update_warning')) {
|
|
|
|
|
delete_transient('twp_sdk_update_warning');
|
|
|
|
|
?>
|
|
|
|
|
<div class="notice notice-warning is-dismissible">
|
|
|
|
|
<h3>Twilio WordPress Plugin - SDK Reinstall Required</h3>
|
|
|
|
|
<p><strong>The plugin was updated and the Twilio SDK needs to be reinstalled.</strong></p>
|
|
|
|
|
<p>To prevent this in the future, install the SDK to the external location:</p>
|
|
|
|
|
<code>cd <?php echo esc_html(TWP_PLUGIN_DIR); ?> && ./install-twilio-sdk-external.sh</code>
|
|
|
|
|
<p style="margin-top: 10px;">The external SDK at <code><?php echo esc_html(TWP_EXTERNAL_SDK_DIR); ?></code> survives plugin updates.</p>
|
|
|
|
|
</div>
|
|
|
|
|
<?php
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
add_action('admin_notices', 'twp_show_sdk_update_warning');
|
|
|
|
|
|
2025-08-06 15:25:47 -07:00
|
|
|
/**
|
|
|
|
|
* Core plugin class
|
|
|
|
|
*/
|
|
|
|
|
require plugin_dir_path(__FILE__) . 'includes/class-twp-core.php';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Begin execution of the plugin
|
|
|
|
|
*/
|
|
|
|
|
function run_twilio_wp_plugin() {
|
|
|
|
|
$plugin = new TWP_Core();
|
|
|
|
|
$plugin->run();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
run_twilio_wp_plugin();
|