Bundle Twilio + AWS SDKs in releases, add SNS install path
Gitea release workflow now runs composer install --no-dev before zipping, so
each release ships vendor/ with both Twilio and AWS SDKs. The plugin's loader
priority is flipped to match: internal vendor/autoload.php first (always
current after every plugin update), external wp-content/twilio-sdk/ second
(legacy/manual install fallback).
AWS SDK detection wired in alongside Twilio: composer's bundled autoloader
covers Aws\… natively when present; otherwise plugin falls back to a new
external location wp-content/aws-sdk/ via install-aws-sdk-external.sh, which
drops the AWS SDK PHAR with a tiny autoload shim. AWS-missing admin notice
fires only when twp_sms_provider === 'aws_sns' so existing Twilio SMS users
see no new noise.
Loader priority flip applied in three places that all had the same
external-first pattern: twilio-wp-plugin.php (twp_check_sdk_installation),
class-twp-twilio-api.php (init_sdk_client), class-twp-webhooks.php
(constructor). twp_check_sdk_after_update messaging updated to reflect that
plugin updates now bundle the SDK.
Files:
.gitea/workflows/release.yml — composer install before ZIP
twilio-wp-plugin.php — TWP_EXTERNAL_AWS_SDK_DIR, dual-SDK
detection, twp_aws_sdk_missing_notice
includes/class-twp-twilio-api.php — internal-first autoloader
includes/class-twp-webhooks.php — internal-first autoloader
install-aws-sdk-external.sh — new AWS SDK PHAR installer
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -20,8 +20,11 @@ define('TWP_DB_VERSION', '1.6.2'); // Track database version separately
|
||||
define('TWP_PLUGIN_DIR', plugin_dir_path(__FILE__));
|
||||
define('TWP_PLUGIN_URL', plugin_dir_url(__FILE__));
|
||||
define('TWP_PLUGIN_BASENAME', plugin_basename(__FILE__));
|
||||
// External SDK location - survives plugin updates (wp-content/twilio-sdk/)
|
||||
// External SDK location - legacy/manual install path (wp-content/twilio-sdk/)
|
||||
// Bundled vendor/ inside the plugin (shipped via release zip) is now the primary source.
|
||||
define('TWP_EXTERNAL_SDK_DIR', dirname(dirname(TWP_PLUGIN_DIR)) . '/twilio-sdk/');
|
||||
// External AWS SDK location - installed via install-aws-sdk-external.sh (wp-content/aws-sdk/)
|
||||
define('TWP_EXTERNAL_AWS_SDK_DIR', dirname(dirname(TWP_PLUGIN_DIR)) . '/aws-sdk/');
|
||||
|
||||
/**
|
||||
* Plugin activation hook
|
||||
@@ -32,47 +35,91 @@ function twp_activate() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if Twilio SDK is installed and show admin notice if not
|
||||
* Checks external location first (survives plugin updates), then internal fallback
|
||||
* Check if Twilio (and optionally AWS) SDKs are available, load them, and
|
||||
* register admin notices if anything required is missing.
|
||||
*
|
||||
* Priority for the Twilio autoloader:
|
||||
* 1. Internal bundled `vendor/autoload.php` (shipped with release zip — always current)
|
||||
* 2. External legacy `wp-content/twilio-sdk/autoload.php` (manual install fallback)
|
||||
*
|
||||
* Composer's bundled autoloader handles BOTH `Twilio\…` and `Aws\…` via PSR-4. If
|
||||
* the bundled vendor doesn't supply Aws (e.g. someone installed Twilio-only
|
||||
* externally), we fall back to `wp-content/aws-sdk/autoload.php`.
|
||||
*/
|
||||
function twp_check_sdk_installation() {
|
||||
$sdk_installed = false;
|
||||
$twilio_sdk_installed = false;
|
||||
$aws_sdk_installed = false;
|
||||
|
||||
// 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;
|
||||
$sdk_installed = class_exists('Twilio\Rest\Client');
|
||||
// --- Twilio SDK ---
|
||||
// Priority 1: Internal bundled vendor (shipped via release zip)
|
||||
$internal_autoloader = TWP_PLUGIN_DIR . 'vendor/autoload.php';
|
||||
if (file_exists($internal_autoloader)) {
|
||||
require_once $internal_autoloader;
|
||||
$twilio_sdk_installed = class_exists('Twilio\Rest\Client');
|
||||
}
|
||||
|
||||
// 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');
|
||||
// Priority 2: External legacy location (manual installs)
|
||||
if (!$twilio_sdk_installed) {
|
||||
$external_autoloader = TWP_EXTERNAL_SDK_DIR . 'autoload.php';
|
||||
if (file_exists($external_autoloader)) {
|
||||
require_once $external_autoloader;
|
||||
$twilio_sdk_installed = class_exists('Twilio\Rest\Client');
|
||||
}
|
||||
}
|
||||
|
||||
if (!$sdk_installed) {
|
||||
// --- AWS SDK ---
|
||||
// The bundled composer vendor may already provide it (if shipped with release).
|
||||
$aws_sdk_installed = class_exists('Aws\Sns\SnsClient');
|
||||
if (!$aws_sdk_installed) {
|
||||
$aws_external_autoloader = TWP_EXTERNAL_AWS_SDK_DIR . 'autoload.php';
|
||||
if (file_exists($aws_external_autoloader)) {
|
||||
require_once $aws_external_autoloader;
|
||||
$aws_sdk_installed = class_exists('Aws\Sns\SnsClient');
|
||||
}
|
||||
}
|
||||
|
||||
// Twilio is the hard requirement — always notify if missing.
|
||||
if (!$twilio_sdk_installed) {
|
||||
add_action('admin_notices', 'twp_sdk_missing_notice');
|
||||
}
|
||||
|
||||
// AWS is only required when the SNS provider is selected.
|
||||
if (!$aws_sdk_installed && get_option('twp_sms_provider') === 'aws_sns') {
|
||||
add_action('admin_notices', 'twp_aws_sdk_missing_notice');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display admin notice for missing SDK
|
||||
* Display admin notice for missing Twilio SDK
|
||||
*/
|
||||
function twp_sdk_missing_notice() {
|
||||
?>
|
||||
<div class="notice notice-error is-dismissible">
|
||||
<h3>Twilio WordPress Plugin - SDK Required</h3>
|
||||
<h3>Twilio WordPress Plugin - Twilio SDK Required</h3>
|
||||
<p><strong>The Twilio PHP SDK is required for this plugin to work.</strong></p>
|
||||
<p><strong>Recommended:</strong> Install SDK to external location (survives plugin updates):</p>
|
||||
<p><strong>Recommended:</strong> Reinstall or update the plugin. Plugin updates now bundle the SDK (the release zip ships a pre-built <code>vendor/</code> directory), so a fresh install or update is the simplest fix.</p>
|
||||
<p style="margin-top: 10px;"><strong>Legacy / manual install:</strong> If you can't update the plugin, you can install the SDK to the external location instead:</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>
|
||||
<code>chmod +x install-twilio-sdk.sh && ./install-twilio-sdk.sh</code>
|
||||
<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>
|
||||
<p><em>Bundled vendor path: <?php echo esc_html(TWP_PLUGIN_DIR . 'vendor/'); ?></em></p>
|
||||
<p><em>External SDK fallback path: <?php echo esc_html(TWP_EXTERNAL_SDK_DIR); ?></em></p>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
/**
|
||||
* Display admin notice for missing AWS SDK (only fired when SNS provider is selected)
|
||||
*/
|
||||
function twp_aws_sdk_missing_notice() {
|
||||
?>
|
||||
<div class="notice notice-error is-dismissible">
|
||||
<h3>Twilio WordPress Plugin - AWS SDK Required for SNS SMS</h3>
|
||||
<p><strong>You have selected AWS SNS as your SMS provider, but the AWS PHP SDK is not available.</strong></p>
|
||||
<p><strong>Recommended:</strong> Update the plugin to a release-bundled version — newer release zips bundle the AWS SDK alongside the Twilio SDK in <code>vendor/</code>.</p>
|
||||
<p style="margin-top: 10px;"><strong>Legacy / manual install:</strong> Install the AWS SDK to the external location:</p>
|
||||
<code>chmod +x install-aws-sdk-external.sh && ./install-aws-sdk-external.sh</code>
|
||||
<p style="margin-top: 10px;"><em>External AWS SDK path: <?php echo esc_html(TWP_EXTERNAL_AWS_SDK_DIR); ?></em></p>
|
||||
<p><em>If you don't need AWS SNS, switch the SMS provider back to Twilio under the plugin settings.</em></p>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
@@ -142,7 +189,8 @@ register_deactivation_hook(__FILE__, 'twp_deactivate');
|
||||
|
||||
/**
|
||||
* Check SDK status after plugin updates
|
||||
* Shows warning if SDK was deleted during update and external SDK not available
|
||||
* Shows warning if neither the bundled vendor/ nor the external SDK is available
|
||||
* after an update — this should be rare now that release zips ship vendor/.
|
||||
*/
|
||||
function twp_check_sdk_after_update($upgrader_object, $options) {
|
||||
// Only run for plugin updates
|
||||
@@ -156,11 +204,11 @@ function twp_check_sdk_after_update($upgrader_object, $options) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if SDK is available
|
||||
$external_sdk = file_exists(TWP_EXTERNAL_SDK_DIR . 'autoload.php');
|
||||
// Check if a Twilio SDK autoloader is available anywhere
|
||||
$internal_sdk = file_exists(TWP_PLUGIN_DIR . 'vendor/autoload.php');
|
||||
$external_sdk = file_exists(TWP_EXTERNAL_SDK_DIR . 'autoload.php');
|
||||
|
||||
if (!$external_sdk && !$internal_sdk) {
|
||||
if (!$internal_sdk && !$external_sdk) {
|
||||
// Set a transient to show warning on next admin page load
|
||||
set_transient('twp_sdk_update_warning', true, 60 * 5);
|
||||
}
|
||||
@@ -175,11 +223,13 @@ function twp_show_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>
|
||||
<h3>Twilio WordPress Plugin - SDK Missing After Update</h3>
|
||||
<p><strong>The plugin was updated, but no Twilio SDK could be found.</strong></p>
|
||||
<p>Plugin release zips normally bundle the SDK in <code>vendor/</code>, so this usually means the release was built without dependencies, or the upload was incomplete. Try downloading the release zip again and reinstalling.</p>
|
||||
<p style="margin-top: 10px;"><strong>Manual install fallback:</strong></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>
|
||||
<p style="margin-top: 10px;"><em>Bundled vendor path: <?php echo esc_html(TWP_PLUGIN_DIR . 'vendor/'); ?></em></p>
|
||||
<p><em>External SDK fallback path: <?php echo esc_html(TWP_EXTERNAL_SDK_DIR); ?></em></p>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user