Title: Zloj S3
Author: zloj.ru
Published: <strong>September 24, 2026</strong>
Last modified: September 24, 2026

---

Search plugins

![](https://ps.w.org/zloj-s3/assets/banner-772x250.png?rev=3712689)

![](https://ps.w.org/zloj-s3/assets/icon-256x256.png?rev=3712689)

# Zloj S3

 By [zloj.ru](https://profiles.wordpress.org/zlojru/)

[Download](https://downloads.wordpress.org/plugin/zloj-s3.1.4.7.zip)

 * [Details](https://wordpress.org/plugins/zloj-s3/#description)
 * [Reviews](https://wordpress.org/plugins/zloj-s3/#reviews)
 *  [Installation](https://wordpress.org/plugins/zloj-s3/#installation)
 * [Development](https://wordpress.org/plugins/zloj-s3/#developers)

 [Support](https://wordpress.org/support/plugin/zloj-s3/)

## Description

Zloj S3 sends uploaded media to an S3-compatible bucket, rewrites attachment URLs,
and removes objects when attachments are deleted.

It is built for any S3-compatible endpoint (not only Amazon), can lock credentials
with PHP constants, and can migrate existing uploads in AJAX batches with an optional
cleanup of identical local copies.

The plugin stays idle until the required settings are filled: API host, public host,
bucket, access key, and secret key.

You can lock any setting with a PHP constant. When a constant is defined it wins
over the value on the settings screen, and that field becomes read-only.

Access and secret keys are shown as asterisks in the admin, not as the real values.

#### Constants

 * `ZLOJ_S3_ENABLED`
 * `ZLOJ_S3_PRIVATE_UPLOAD`
 * `ZLOJ_S3_TRASH` (move the primary attachment to a trash prefix; default on)
 * `ZLOJ_S3_API_URL`
 * `ZLOJ_S3_API_HTTPS` (HTTPS for the API host; default on; `ZLOJ_S3_HTTPS_URL` 
   is used if this is not defined)
 * `ZLOJ_S3_API_PATH_STYLE` (set to `path` for path-style API URLs: `host/bucket/
   key`; default `path`)
 * `ZLOJ_S3_REGION` (signing region; default `us-east-1`)
 * `ZLOJ_S3_PUBLIC_URL`
 * `ZLOJ_S3_PUBLIC_HTTPS` (HTTPS for public URLs; default on; `ZLOJ_S3_HTTPS_URL`
   is used if this is not defined)
 * `ZLOJ_S3_BUCKET`
 * `ZLOJ_S3_ACCESS_KEY`
 * `ZLOJ_S3_SECRET_KEY`
 * `ZLOJ_S3_PUBLIC_PATH_STYLE` (set to `path` for path-style public URLs: `host/
   bucket/key`)
 * `ZLOJ_S3_COMPAT_NO_CHECKSUM` (skip CRC32 checksum headers)
 * `ZLOJ_S3_COMPAT_NO_TAGGING` (do not send object tags)
 * `ZLOJ_S3_COMPAT_CANNED_ACL` (send public-read / private ACL)
 * `ZLOJ_S3_COMPAT_NO_EXPECT` (disable Expect: 100-continue)

#### AWS SDK

If `Aws\S3\S3Client` is already loaded, that copy is used. Otherwise the plugin 
loads the trimmed AWS SDK bundled under `vendor/` (S3 only, not the full 40+ MB 
package).

### External services

This plugin is an interface to the S3-compatible object storage **you configure**.
It does not send files or credentials to the plugin author.

When offload is enabled, or when you run a connection test or a bulk upload, the
plugin contacts the API host and public host you entered. It sends media file contents
and the access key / secret key needed to authenticate to that storage.

If you use Amazon S3:

 * Service: https://aws.amazon.com/s3/
 * Terms of Service: https://aws.amazon.com/service-terms/
 * Privacy Policy: https://aws.amazon.com/privacy/

If you use another S3-compatible provider, read that provider’s terms of service
and privacy policy before saving credentials. An account with the storage provider
is required.

### Copyright

Zloj S3, Copyright 2026 zloj.ru.

Free to use. Copies and modifications must keep this license and all copyright notices.
Licensed under GPLv2 or later; see `license.txt`. Third-party libraries keep their
own GPL-compatible licenses and copyright files.

## Installation

 1. Upload the `zloj-s3` folder to `/wp-content/plugins/`.
 2. Activate the plugin.
 3. Open Settings  Zloj S3 and fill in the storage details, or define the constants
    above.
 4. Use the connection test button (no page reload). It uploads a random file, checks
    the public URL body for the random hash, then deletes the file.
 5. To migrate existing files, use **Upload, keep local files** or **Upload and remove
    local files**. Cleanup deletes the local file after a successful upload (or when
    it already matches storage). **Find conflicts** only compares local files with 
    storage. The job runs in AJAX batches.

## FAQ

### Does the plugin run without settings?

No. Offload does nothing until the required fields are filled and offload is enabled.

### Why are some fields read-only?

Those values are defined as PHP constants. Remove or undefine the constant to edit
the field on the settings screen.

### Do I need the full AWS SDK?

No. The bundled copy is reduced to the S3 client. If your site already provides `
aws/aws-sdk-php`, the bundled copy is not loaded.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Zloj S3” is open source software. The following people have contributed to this
plugin.

Contributors

 *   [ zloj.ru ](https://profiles.wordpress.org/zlojru/)

[Translate “Zloj S3” into your language.](https://translate.wordpress.org/projects/wp-plugins/zloj-s3)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/zloj-s3/), check out
the [SVN repository](https://plugins.svn.wordpress.org/zloj-s3/), or subscribe to
the [development log](https://plugins.trac.wordpress.org/log/zloj-s3/) by [RSS](https://plugins.trac.wordpress.org/log/zloj-s3/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.4.7

 * Move the SDK trim script out of the plugin package into the separate builder 
   repo.
 * Drop vendor development files from the distribution, including format-check.py.

#### 1.4.6

 * Let WordPress.org load translations; do not ship locale files or call load_plugin_textdomain.
 * Register settings with an explicit sanitize callback and check AJAX nonces via
   check_ajax_referer.
 * Block direct HTTP access to the SDK trim script.

#### 1.4.5

 * Rewrite srcset, intermediate sizes, and MetaSlider crop URLs, not only wp_get_attachment_url.
 * Upload MetaSlider custom crops that skip image_make_intermediate_size.

#### 1.4.4

 * Do not resume a bulk upload just because the settings page was opened.
 * Clear a stale running flag when no sync lock is held.
 * Do not stop a bulk upload when a step lock is still held; send the next request.
 * Overwrite a sync lock older than twice the PHP max execution time.

#### 1.4.3

 * Lock public path-style with `ZLOJ_S3_PUBLIC_PATH_STYLE`, not `ZLOJ_S3_PATH_STYLE`.

#### 1.4.2

 * Retry failed sync batches with an idempotent request id and a single in-flight
   handler.
 * Keep separate progress per mode and ask whether to continue or start over.
 * Drop the 40-file batch cap; each request now uses most of the PHP time limit.
 * Show a file progress bar counted once at job start when attachments change.
 * Let the settings form, compatibility spoiler, and sync blocks use the full width.

#### 1.4.1

 * Do not treat a custom API endpoint as a bucket hostname.
 * Drop empty request headers before signing.
 * Show a fuller S3 error (headers, ArgumentName, which compatibility option to 
   use).

#### 1.4.0

 * Load plugin classes via PSR-4 from `src/` instead of WordPress-style `includes/
   class-*.php` files.
 * Add a signing region setting and `ZLOJ_S3_REGION` (default `us-east-1`).
 * Add optional compatibility workarounds behind a collapsed settings panel.
 * Split API path-style into its own setting (`ZLOJ_S3_API_PATH_STYLE`, default 
   on).
 * Do not prepend the bucket as a subdomain when path-style is off; use the host
   field as entered.

#### 1.3.3

 * Rewrite attachment URLs when offload is enabled, without requiring the SDK.
 * Build public URLs as `host/key`. Honor legacy `ZLOJ_S3_HTTPS_URL`.

#### 1.3.2

 * Optional object trash: checkbox and `ZLOJ_S3_TRASH` (default on). Off deletes
   objects immediately.

#### 1.3.1

 * Register media offload hooks even when idle.
 * Primary attachment objects can be intercepted via `zloj_s3_discard_object` before
   delete.

#### 1.3.0

 * Split HTTPS into `ZLOJ_S3_API_HTTPS` and `ZLOJ_S3_PUBLIC_HTTPS` (default on).`
   ZLOJ_S3_HTTPS_URL` is ignored.
 * Put the HTTPS toggles under the API and public host fields.
 * Include the bucket in public URLs when path-style is enabled.

#### 1.2.1

 * Fix Find conflicts doing nothing when a cached script expected a separate Stop
   button.
 * Turn the active job button into Stop; the current batch finishes, the next one
   does not start.

#### 1.2.0

 * Hide storage keys in the admin and encrypt them at rest.
 * Document the configured S3 endpoint as an external service.
 * Always verify TLS; tighten AJAX sanitization; keep Plugin Check notices on the
   settings screen.
 * Add a find-conflicts scan that compares local files with storage without uploading.

#### 1.1.0

 * Add AJAX bulk upload of local uploads, with optional cleanup of identical local
   copies and a conflict resolver.

#### 1.0.0

 * Initial release.

## Meta

 *  Version **1.4.7**
 *  Last updated **15 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.2 or higher **
 *  Tested up to **7.1.2**
 *  PHP version ** 8.1 or higher **
 * Tags
 * [media](https://wordpress.org/plugins/tags/media/)[offload](https://wordpress.org/plugins/tags/offload/)
   [s3](https://wordpress.org/plugins/tags/s3/)[storage](https://wordpress.org/plugins/tags/storage/)
   [uploads](https://wordpress.org/plugins/tags/uploads/)
 *  [Advanced View](https://wordpress.org/plugins/zloj-s3/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/zloj-s3/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/zloj-s3/reviews/)

## Contributors

 *   [ zloj.ru ](https://profiles.wordpress.org/zlojru/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/zloj-s3/)