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:
258
classes/items/item-handler.php
Normal file
258
classes/items/item-handler.php
Normal file
@@ -0,0 +1,258 @@
|
||||
<?php
|
||||
|
||||
namespace DeliciousBrains\WP_Offload_Media\Items;
|
||||
|
||||
use Amazon_S3_And_CloudFront;
|
||||
use AS3CF_Error;
|
||||
use Exception;
|
||||
use WP_Error;
|
||||
|
||||
/**
|
||||
* Class Item_Handler
|
||||
*
|
||||
* Base class for item handler classes.
|
||||
*
|
||||
* @package DeliciousBrains\WP_Offload_Media\Items
|
||||
*/
|
||||
abstract class Item_Handler {
|
||||
/**
|
||||
* Status codes
|
||||
*/
|
||||
const STATUS_OK = 'ok';
|
||||
const STATUS_FAILED = 'failed';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected static $item_handler_key;
|
||||
|
||||
/**
|
||||
* @var Amazon_S3_And_CloudFront
|
||||
*/
|
||||
protected $as3cf;
|
||||
|
||||
/**
|
||||
* AS3CF_Item_Handler constructor.
|
||||
*
|
||||
* @param Amazon_S3_And_CloudFront $as3cf
|
||||
*/
|
||||
public function __construct( Amazon_S3_And_CloudFront $as3cf ) {
|
||||
$this->as3cf = $as3cf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the item handler key name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function get_item_handler_key_name() {
|
||||
return static::$item_handler_key;
|
||||
}
|
||||
|
||||
/**
|
||||
* The default options that should be used if none supplied.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function default_options() {
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Main entrypoint for handling an item.
|
||||
*
|
||||
* @param Item $as3cf_item
|
||||
* @param array $options
|
||||
*
|
||||
* @return boolean|WP_Error
|
||||
*/
|
||||
public function handle( Item $as3cf_item, array $options = array() ) {
|
||||
// Merge supplied option values into the defaults as long as supplied options are recognised.
|
||||
if ( empty( $options ) || ! is_array( $options ) ) {
|
||||
$options = array();
|
||||
}
|
||||
$options = array_merge( $this->default_options(), array_intersect_key( $options, $this->default_options() ) );
|
||||
|
||||
try {
|
||||
/**
|
||||
* Filter fires before handling an action on an item, allows action to be cancelled.
|
||||
*
|
||||
* This is a generic handler filter that includes the handler's key name as the last param.
|
||||
*
|
||||
* @param bool $cancel Should the action on the item be cancelled?
|
||||
* @param Item $as3cf_item The item that the action is being handled for.
|
||||
* @param array $options Handler dependent options that may have been set for the action.
|
||||
* @param array $handler_key_name The handler's key name as per `Item_Handler::get_item_handler_key_name()`.
|
||||
*
|
||||
* @see Item_Handler::get_item_handler_key_name()
|
||||
*/
|
||||
$cancel = apply_filters(
|
||||
'as3cf_pre_handle_item',
|
||||
/**
|
||||
* Filter fires before handling an action on an item, allows action to be cancelled.
|
||||
*
|
||||
* This is a handler specific filter whose name ends with the handler's key name.
|
||||
* Format is `as3cf_pre_handle_item_{item-handler-key-name}`.
|
||||
*
|
||||
* Example filter names:
|
||||
*
|
||||
* as3cf_pre_handle_item_upload
|
||||
* as3cf_pre_handle_item_download
|
||||
* as3cf_pre_handle_item_remove-local
|
||||
* as3cf_pre_handle_item_remove-provider
|
||||
* as3cf_pre_handle_item_update-acl
|
||||
*
|
||||
* For a more generic filter, use `as3cf_pre_handle_item`.
|
||||
*
|
||||
* @param bool $cancel Should the action on the item be cancelled?
|
||||
* @param Item $as3cf_item The item that the action is being handled for.
|
||||
* @param array $options Handler dependent options that may have been set for the action.
|
||||
*
|
||||
* @see Item_Handler::get_item_handler_key_name()
|
||||
*/
|
||||
apply_filters( 'as3cf_pre_handle_item_' . static::get_item_handler_key_name(), false, $as3cf_item, $options ),
|
||||
$as3cf_item,
|
||||
$options,
|
||||
static::get_item_handler_key_name()
|
||||
);
|
||||
} catch ( Exception $e ) {
|
||||
return $this->return_result( new WP_Error( $e->getMessage() ), $as3cf_item, $options );
|
||||
}
|
||||
|
||||
// Cancelled, let caller know that request was not handled.
|
||||
if ( false !== $cancel ) {
|
||||
// If something unexpected happened, let the caller know.
|
||||
if ( is_wp_error( $cancel ) ) {
|
||||
return $this->return_result( $cancel, $as3cf_item, $options );
|
||||
}
|
||||
|
||||
return $this->return_result( false, $as3cf_item, $options );
|
||||
}
|
||||
|
||||
$manifest = $this->pre_handle( $as3cf_item, $options );
|
||||
if ( is_wp_error( $manifest ) ) {
|
||||
return $this->return_result( $manifest, $as3cf_item, $options );
|
||||
}
|
||||
|
||||
// Nothing to do, let caller know that request was not handled.
|
||||
if ( empty( $manifest ) || empty( $manifest->objects ) ) {
|
||||
return $this->return_result( false, $as3cf_item, $options );
|
||||
}
|
||||
|
||||
$result = $this->handle_item( $as3cf_item, $manifest, $options );
|
||||
if ( is_wp_error( $result ) ) {
|
||||
return $this->return_result( $result, $as3cf_item, $options );
|
||||
}
|
||||
|
||||
$result = $this->post_handle( $as3cf_item, $manifest, $options );
|
||||
|
||||
return $this->return_result( $result, $as3cf_item, $options );
|
||||
}
|
||||
|
||||
/**
|
||||
* Process an Item and options to generate a Manifest for `handle_item`.
|
||||
*
|
||||
* @param Item $as3cf_item
|
||||
* @param array $options
|
||||
*
|
||||
* @return Manifest|WP_Error
|
||||
*/
|
||||
abstract protected function pre_handle( Item $as3cf_item, array $options );
|
||||
|
||||
/**
|
||||
* Perform action for Item using given Manifest.
|
||||
*
|
||||
* @param Item $as3cf_item
|
||||
* @param Manifest $manifest
|
||||
* @param array $options
|
||||
*
|
||||
* @return bool|WP_Error
|
||||
*/
|
||||
abstract protected function handle_item( Item $as3cf_item, Manifest $manifest, array $options );
|
||||
|
||||
/**
|
||||
* Process results of `handle_item` as appropriate.
|
||||
*
|
||||
* @param Item $as3cf_item
|
||||
* @param Manifest $manifest
|
||||
* @param array $options
|
||||
*
|
||||
* @return bool|WP_Error
|
||||
*/
|
||||
abstract protected function post_handle( Item $as3cf_item, Manifest $manifest, array $options );
|
||||
|
||||
/**
|
||||
* Helper to record errors and return them or optional supplied value.
|
||||
*
|
||||
* @param string|WP_Error $error_msg An error message or already constructed WP_Error.
|
||||
* @param mixed|null $return Optional return value instead of WP_Error.
|
||||
*
|
||||
* @return mixed|WP_Error
|
||||
*/
|
||||
protected function return_handler_error( $error_msg, $return = null ) {
|
||||
if ( is_wp_error( $error_msg ) ) {
|
||||
foreach ( $error_msg->get_error_messages() as $msg ) {
|
||||
AS3CF_Error::Log( $msg );
|
||||
}
|
||||
} else {
|
||||
AS3CF_Error::log( $error_msg );
|
||||
}
|
||||
|
||||
if ( is_null( $return ) ) {
|
||||
return is_wp_error( $error_msg ) ? $error_msg : new WP_Error( 'exception', $error_msg );
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fires a couple of actions to let interested parties know that a handler has returned a result.
|
||||
*
|
||||
* @param bool|WP_Error $result Result for the action, either handled (true/false), or an error.
|
||||
* @param Item $as3cf_item The item that the action was being handled for.
|
||||
* @param array $options Handler dependent options that may have been set for the action.
|
||||
*
|
||||
* @return bool|WP_Error
|
||||
*/
|
||||
private function return_result( $result, Item $as3cf_item, array $options ) {
|
||||
/**
|
||||
* Action fires after attempting to handle an action on an item.
|
||||
*
|
||||
* This is a handler specific action whose name ends with the handler's key name.
|
||||
* Format is `as3cf_post_handle_item_{item-handler-key-name}`.
|
||||
*
|
||||
* Example filter names:
|
||||
*
|
||||
* as3cf_post_handle_item_upload
|
||||
* as3cf_post_handle_item_download
|
||||
* as3cf_post_handle_item_remove-local
|
||||
* as3cf_post_handle_item_remove-provider
|
||||
* as3cf_post_handle_item_update-acl
|
||||
*
|
||||
* For a more generic filter, use `as3cf_post_handle_item`.
|
||||
*
|
||||
* @param bool|WP_Error $result Result for the action, either handled (true/false), or an error.
|
||||
* @param Item $as3cf_item The item that the action was being handled for.
|
||||
* @param array $options Handler dependent options that may have been set for the action.
|
||||
*
|
||||
* @see Item_Handler::get_item_handler_key_name()
|
||||
*/
|
||||
do_action( 'as3cf_post_handle_item_' . static::get_item_handler_key_name(), $result, $as3cf_item, $options );
|
||||
|
||||
/**
|
||||
* Action fires after attempting to handle an action on an item.
|
||||
*
|
||||
* This is a generic handler action that includes the handler's key name as the last param.
|
||||
*
|
||||
* @param bool|WP_Error $result Result for the action, either handled (true/false), or an error.
|
||||
* @param Item $as3cf_item The item that the action was being handled for.
|
||||
* @param array $options Handler dependent options that may have been set for the action.
|
||||
* @param array $handler_key_name The handler's key name as per `Item_Handler::get_item_handler_key_name()`.
|
||||
*
|
||||
* @see Item_Handler::get_item_handler_key_name()
|
||||
*/
|
||||
do_action( 'as3cf_post_handle_item', $result, $as3cf_item, $options, static::get_item_handler_key_name() );
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user