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_ENABLEDZLOJ_S3_PRIVATE_UPLOADZLOJ_S3_TRASH(move the primary attachment to a trash prefix; default on)ZLOJ_S3_API_URLZLOJ_S3_API_HTTPS(HTTPS for the API host; default on;ZLOJ_S3_HTTPS_URLis used if this is not defined)ZLOJ_S3_API_PATH_STYLE(set topathfor path-style API URLs:host/bucket/key; defaultpath)ZLOJ_S3_REGION(signing region; defaultus-east-1)ZLOJ_S3_PUBLIC_URLZLOJ_S3_PUBLIC_HTTPS(HTTPS for public URLs; default on;ZLOJ_S3_HTTPS_URLis used if this is not defined)ZLOJ_S3_BUCKETZLOJ_S3_ACCESS_KEYZLOJ_S3_SECRET_KEYZLOJ_S3_PUBLIC_PATH_STYLE(set topathfor 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
- Upload the
zloj-s3folder to/wp-content/plugins/. - Activate the plugin.
- Open Settings Zloj S3 and fill in the storage details, or define the constants above.
- 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.
- 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.
ContributorsTranslate “Zloj S3” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by 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, notZLOJ_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-styleincludes/class-*.phpfiles. - Add a signing region setting and
ZLOJ_S3_REGION(defaultus-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 legacyZLOJ_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_objectbefore delete.
1.3.0
- Split HTTPS into
ZLOJ_S3_API_HTTPSandZLOJ_S3_PUBLIC_HTTPS(default on).ZLOJ_S3_HTTPS_URLis 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.
