feat: add S3-compatible storage provider (MinIO, Ceph, R2, etc.)

Adds a new 'S3-Compatible Storage' provider that works with any
S3-API-compatible object storage service, including MinIO, Ceph,
Cloudflare R2, Backblaze B2, and others.

Changes:
- New provider class: classes/providers/storage/s3-compatible-provider.php
  - Provider key: s3compatible
  - Reads user-configured endpoint URL from settings
  - Uses path-style URL access (required by most S3-compatible services)
  - Supports credentials via AS3CF_S3COMPAT_ACCESS_KEY_ID /
    AS3CF_S3COMPAT_SECRET_ACCESS_KEY wp-config.php constants
  - Disables AWS-specific features (Block Public Access, Object Ownership)
- New provider SVG icons (s3compatible.svg, -link.svg, -round.svg)
- Registered provider in main plugin class with endpoint setting support
- Updated StorageProviderSubPage to show endpoint URL input for S3-compatible
- Built pro settings bundle with rollup (Svelte 4.2.19)
- Added package.json and updated rollup.config.mjs for pro-only builds
This commit is contained in:
2026-03-03 12:30:18 +01:00
commit 3248cbb029
2086 changed files with 359427 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
<div class="as3cf-deactivate-plugin-container" style="display: none;">
<h3><?php _e( 'WP Offload Media Uninstall', 'amazon-s3-and-cloudfront' ); ?></h3>
<p><?php _e( 'You have the "Remove Local Media" option ON, which means some media files are likely missing from your local server and deactivating WP Offload Media could result in broken images and file links on your site.', 'amazon-s3-and-cloudfront' ); ?></p>
<p><?php _e( 'We recommend you copy all the media files back to your server from the bucket before deactivating. Would you like to do this now?', 'amazon-s3-and-cloudfront' ); ?></p>
<p class="actions select">
<button type="submit" class="button button-primary right" data-download-tool="1"><?php _e( 'Yes', 'amazon-s3-and-cloudfront' ); ?></button>
<button type="submit" class="button right" data-download-tool="0"><?php _e( 'No', 'amazon-s3-and-cloudfront' ); ?></button>
<span class="spinner right"></span>
</p>
</div>

View File

@@ -0,0 +1,36 @@
<?php
/** @var array $plugins_not_installed */
?>
<div class="notice-info notice as3cf-pro-installer">
<p>
<strong>
<?php printf( __( 'Finish Installing %s', 'amazon-s3-and-cloudfront' ), $this->plugin_name ); ?>
</strong>
</p>
<p>
<?php printf( __( 'The %s plugin requires the following plugins to be installed:', 'amazon-s3-and-cloudfront' ), $this->plugin_name ); ?>
</p>
<ul style="list-style-type: disc; padding: 0 0 0 30px; margin: 5px 0;">
<?php foreach ( $plugins_not_installed as $slug => $plugin_name ) : ?>
<li style="margin: 0;">
<a class="thickbox" style="text-decoration: none;" href="<?php echo $this->get_plugin_info_url( $slug ); ?>">
<?php echo $plugin_name; ?>
</a>
</li>
<?php endforeach; ?>
</ul>
<p>
<a href="#" class="button button-primary button-large install-plugins" data-process="installer"><?php _e( 'Install & Activate Now' ); ?></a>
</p>
<p>
<em>
<?php
$deactivate_url = $this->get_plugin_action_url( 'deactivate' );
$deactivate_link = sprintf( '<a id="' . $this->plugin_slug . '-install-notice-deactivate" style="text-decoration:none;" href="%s">%s</a>', $deactivate_url, __( 'deactivating', 'amazon-s3-and-cloudfront' ) );
printf( __( 'You can also remove this message by %s the %s plugin.', 'amazon-s3-and-cloudfront' ), $deactivate_link, $this->plugin_name );
?>
</em>
</p>
</div>

View File

@@ -0,0 +1,38 @@
<?php
/** @var string $dashboard */
/** @var string $id */
/** @var string $heading */
/** @var string $type */
/** @var string $message */
/** @var string $extra */
/** @var bool $dismissible */
/** @var string $dismiss_url */
/** @var array $links */
?>
<div id="<?php echo "{$id}"; ?>" class="as3cf-pro-licence-notice notice <?php echo $type; ?> important <?php echo $dismissible ? 'is-dismissible' : ''; ?>">
<p>
<strong><?php echo $heading; ?></strong> &mdash; <?php echo $message; ?>
</p>
<?php if ( $extra ) : ?>
<p>
<?php echo $extra; ?>
</p>
<?php endif; ?>
<?php if ( $links ) : ?>
<p class="notice-links">
<?php echo join( ' | ', $links ); ?>
</p>
<?php endif; ?>
<?php if ( $dismissible ) : // use inline script to omit need to enqueue a script dashboard-wide ?>
<script>
(function( $ ) {
$( '#<?php echo "{$id}.is-dismissible"; ?>' ).on( 'click', '.notice-dismiss', function() {
$.get( '<?php echo $dismiss_url; ?>' );
} );
})( jQuery );
</script>
<?php endif ?>
</div>

11
view/pro/settings.php Normal file
View File

@@ -0,0 +1,11 @@
<div id="as3cf-settings" class="wpome wpomepro">
</div>
<script>
new AS3CFPro_Settings( {
target: document.getElementById( 'as3cf-settings' ),
props: {
init: as3cfpro_settings
}
} );
</script>