| @@ -1,15 +1,14 @@ | ||
| 1 | -=== Media Cloud Sync === | |
| 1 | +=== Media Cloud Sync === | |
| 2 | 2 | Author: Dudlewebs |
| 3 | 3 | Author URI: https://dudlewebs.com |
| 4 | 4 | Contributors: dudlewebs |
| 5 | -Donate link: https://dudlewebs.com/donate | |
| 6 | 5 | Tags: sync, cloud, offload, media, aws |
| 7 | 6 | License: GPLv2 or later |
| 8 | 7 | Requires PHP: 8.1 |
| 9 | 8 | Requires at least: 5.9 |
| 10 | -Tested up to: 7.0 | |
| 11 | -Stable tag: 1.3.11 | |
| 9 | +Tested up to: 7.1 | |
| 10 | +Stable tag: 1.4.1 | |
| 12 | 11 | |
| 13 | 12 | Offload media to cloud storage (S3, DigitalOcean, Google Cloud, Cloudflare R2, S3 compatible Services) and rewrite URLs for seamless file delivery. |
| 14 | 13 | |
| 15 | 14 | == Description == |
| @@ -64,13 +63,26 @@ | ||
| 64 | 63 | 🔹 Benefit from RTL (Right to Left) support for multilingual websites. |
| 65 | 64 | 🔹 Access WPML string translation support for seamless multilingual content management. |
| 66 | 65 | 🔹 Enjoy seamless compatibility across multisite networks for centralized management and consistent performance. |
| 67 | 66 | |
| 67 | +== Pro Features == | |
| 68 | +[Media Cloud Sync Pro](https://dudlewebs.com/product/media-cloud-sync/) extends the free plugin with cloud-side management tools, faster bulk operations, and per-item control directly from the Media Library: | |
| 69 | + | |
| 70 | +🔹 **Media Library actions** — Sync to Cloud, Force Re-upload, Remove from Server, Restore from Cloud, Remove from Cloud, and View on Cloud, directly on the single-attachment popup and as bulk dropdowns in both grid and list view, with a cloud-offload status badge/column and a Synced/Not Synced filter. | |
| 71 | +🔹 **File Manager** — browse your connected cloud bucket, download as zip, restore to server, move, and delete files, with per-item and bulk actions. | |
| 72 | +🔹 **Restore Media to Server** — bulk-restore previously offloaded media from the cloud back to your server. | |
| 73 | +🔹 **Move Media to New Path** — bulk-move already-synced media to a newly configured base path. | |
| 74 | +🔹 **Bucket-to-Bucket Migration** — copy synced media to a new provider, bucket, or account, including reusing an already-connected credential source as the migration destination. | |
| 75 | +🔹 **Ajax/Mixed Sync Method** — run bulk sync live in the browser (Ajax) or with automatic WP-Cron fallback (Mixed), instead of Cron-only. | |
| 76 | +🔹 **Delivery Settings: Cache-Control duration** — set a custom Cache-Control max-age (or explicit no-cache) per storage/CDN choice for newly uploaded files. | |
| 77 | +🔹 **Include/Exclude Extensions** — control exactly which file types get uploaded to the bucket. | |
| 78 | +🔹 **Third-party compatibility** — WooCommerce and Easy Digital Downloads downloadable files, BuddyBoss Platform, WPML, Elementor, Divi, and Enable Media Replace all stay in sync with cloud storage. | |
| 79 | +🔹 And more... | |
| 80 | + | |
| 68 | 81 | == Other Useful Links == |
| 69 | 82 | 🔹 [Official website](https://dudlewebs.com) |
| 70 | -🔹 [Documentation](https://dudlewebs.com/support) | |
| 71 | -🔹 [Pro version coming soon](https://dudlewebs.com) | |
| 72 | -🔹 [Donate Now!! Get PRO version license discounts](https://dudlewebs.com/donate) | |
| 83 | +🔹 [Documentation](https://dudlewebs.com/guideline/media-cloud-sync/) | |
| 84 | +🔹 [Get Media Cloud Sync Pro](https://dudlewebs.com/product/media-cloud-sync/) | |
| 73 | 85 | |
| 74 | 86 | == Screenshots == |
| 75 | 87 | 1. Plugin dashboard page, showcasing the main options for configuring the Media Cloud Sync settings. |
| 76 | 88 | 2. Configure wizard welcome screen. |
| @@ -140,8 +152,62 @@ | ||
| 140 | 152 | - **Description**: Manages media files efficiently, allowing file storage, retrieval, and deletion. |
| 141 | 153 | - **Data Sent**: User authentication data, file metadata (name, size, MIME type). |
| 142 | 154 | |
| 143 | 155 | == Changelog == |
| 156 | += 1.4.1 = | |
| 157 | +* Feature: Added private media support (Pro) — mark individual Media Library items private, served through short-lived signed URLs. | |
| 158 | +* Feature: Added a "Remove from Cloud" bulk sync job (Pro). | |
| 159 | +* Feature: Added a per-item cloud-delivery override (Pro) — "Use Server URL" / "Use Cloud URL" in the Media Library. | |
| 160 | +* Bug Fix: WooCommerce could leave restored files on the server and skip re-uploading a regenerated thumbnail crop. | |
| 161 | +* Bug Fix: Customizer crop, image editor, and Regenerate Thumbnails could leave restored files on the server without cleaning up. | |
| 162 | +* Bug Fix: A successful Cloudflare R2 restore could be treated as failed, skipping cleanup. | |
| 163 | +* Bug Fix: A failed image size re-upload could wipe that size's cloud reference from the database. | |
| 164 | +* Bug Fix: Private media on Google Cloud Storage always failed to apply; now uses GCS Managed Folders instead. | |
| 165 | +* Feature: Added a Security step (Block All Public Access) to the Google Cloud Storage setup wizard. | |
| 166 | +* Feature: Added a generic integration extension point so Pro add-ons can register new source types. | |
| 167 | +* Bug Fix: A source type with no meta table configured could break signed URL generation. | |
| 168 | +* Bug Fix: Resolving a file's relative path from a full URL produced an incorrect local path. | |
| 169 | +* Feature: Source types can now declare a translatable admin-UI label and use a custom meta caching backend. | |
| 170 | +* Bug Fix: A WooCommerce compatibility hook could force local file paths for the rest of a request after any image rendered. | |
| 171 | +* Feature: Added a generic hook (Pro) letting an integration veto a cloud-storage delete when another item shares the file. | |
| 172 | +* Bug Fix: An attachment deleted without going through wp_delete_attachment() could leave its cloud-tracking row orphaned. | |
| 173 | +* Feature: Added generic bulk sync job lifecycle hooks so Pro add-ons can react when a job finishes. | |
| 174 | +* Security Fix: A crafted file path in a Pro downloadable-file field (WooCommerce/EDD) could use "../" to escape the uploads directory. | |
| 175 | +* Bug Fix: Resolving a bare cloud/local URL (e.g. in page builder data) to its attachment could silently fail to match. | |
| 176 | += 1.4.0 = | |
| 177 | +* Compatibility: WordPress 7.1 | |
| 178 | +* Bug Fix: WooCommerce image regeneration restored offloaded files to the server to resize them but never removed them again, even with "Remove from server" enabled, and could leave stale, un-regenerated images on the cloud since the plugin's "unchanged, skip reupload" check couldn't tell a regenerated file at the same size apart from a real no-op. Regenerated files are now always re-uploaded, and restored copies are cleaned up once WooCommerce is done with them. | |
| 179 | += 1.3.12 = | |
| 180 | +* Tweak: Pro upgrade prompts now link to the live product page and list the actual Pro features (Media Library actions, File Manager, Restore to Server, Move to New Path, Bucket-to-Bucket Migration, faster Ajax/Mixed sync). Added an "Upgrade to Pro" plugin action link on the Plugins screen for non-Pro sites. | |
| 181 | +* Feature: File Manager (Pro) — browse your connected cloud bucket, download as zip, restore to server, move, and delete files, with per-item and bulk actions. | |
| 182 | +* Feature: Added CDN provider presets (Amazon CloudFront, Bunny.net, Fastly, Cloudflare CDN, Akamai, KeyCDN, Gcore, Edgio, Leaseweb CDN, CDNetworks) to every storage service's CDN settings. | |
| 183 | +* Feature: Sync Method toggle (Ajax/Cron/Mixed) on the Sync screen for Pro-licensed users. Controls whether bulk sync runs via the browser, WP-Cron, or both. | |
| 184 | +* Bug Fix: Security — SQL injection risk in media path and settings queries. Fixed with $wpdb->prepare. | |
| 185 | +* Bug Fix: purge_all_versions() could leave old files undeleted on providers (e.g. Cloudflare R2) that don't support listing object versions. | |
| 186 | +* Bug Fix: File Manager's shift-click range selection didn't collapse back down when re-clicking a row inside an existing selection. | |
| 187 | +* Bug Fix: Background sync could be slow to respond to Pause/Stop. Concurrent triggers could also duplicate an upload or lose track of its status. | |
| 188 | +* Bug Fix: Sync could skip or reprocess items if the media library changed mid-run. Multipart retries were uncapped, file handles could leak on failed uploads, and sync log writes weren't locked. | |
| 189 | +* Bug Fix: Images waiting on WordPress-generated thumbnails are now retried instead of marked failed. Upload failures now log the real provider error. Ajax sync mode now resumes correctly after the browser Back button. | |
| 190 | +* Bug Fix: Storage credential and connection checks fixed across S3, DigitalOcean Spaces, Google Cloud Storage, Cloudflare R2, and S3-Compatible providers. | |
| 191 | +* Bug Fix: S3 Block Public Access status was dropped for partially blocked buckets. Cloudflare R2's CDN check falsely showed "Access Denied" with custom domains. | |
| 192 | +* Bug Fix: Several Media Library and attachment-detail bugs — a PHP 8.4 fatal in the image tag filter, a missing capability check, a wrong Access (public/private) value, and Customizer background image lookup for offloaded media. | |
| 193 | +* Bug Fix: WooCommerce image resize/regeneration — filter stacking consolidated into one handler, with a fallback to the original file if cloud restore fails. | |
| 194 | +* Bug Fix: Imagify optimization now uses a proper CDN adapter instead of stacking filters. WebP integration and Customizer crop actions no longer risk a fatal error. | |
| 195 | +* Bug Fix: Settings/Configure pages no longer get stuck loading, verifying, or saving. Validation now catches unset or invalid fields, including bad JSON credential files. | |
| 196 | +* Bug Fix: Settings and Dashboard pages no longer crash before a provider is configured. Dashboard media counts now aggregate correctly. | |
| 197 | +* Bug Fix: Recursively nested wpmcs_status_data from status writes; repaired via DB upgrade 1.0.6. | |
| 198 | +* Bug Fix: ACF cropped image original file wasn't deleted from the server. | |
| 199 | +* Tweak: Redesigned plugin deactivation survey with improved validation. | |
| 200 | +* Tweak: Database Upgrade progress polling no longer floods the REST API. | |
| 201 | +* Feature: Storage layer now supports exact-key uploads, cross-bucket server-side copies, and connections bound to explicit (non-global) credentials — the foundation for Bucket-to-Bucket Migration (Pro). | |
| 202 | +* Tweak: Multipart upload threshold is now explicitly honored on every provider, and per-object ACL headers are stripped consistently, matching this plugin's bucket-level (not per-object) visibility model. | |
| 203 | +* Bug Fix: The storage "Check Status" read-access check could show a stale "Access Denied" result from CDN caching even after real access was fine — the check's dummy object and request are now marked no-cache. | |
| 204 | +* Tweak: File Manager breadcrumb separator icon was rendering with excess built-in padding, making it look tiny — cropped to its actual glyph bounds. | |
| 205 | +* Tweak: "Use Existing" credential-source option (reuse the currently-connected account) is now available wherever credentials are configured, including as a migration destination. | |
| 206 | +* Feature: Delivery Settings — newly uploaded files get a Cache-Control header, 1 month by default; Pro can set a custom duration (or 0 for no-cache) per storage/CDN choice. | |
| 207 | +* Feature: Include/Exclude Extensions fields (Pro) control which file types get uploaded to the bucket. | |
| 208 | +* Bug Fix: Ajax/Mixed sync method's tick loop could silently stop after one iteration due to a redux dependency bug — affected all sync types under ajax/mixed mode. | |
| 209 | +* Bug Fix: Item::update() could fail with a duplicate-key database error when moving an item to a different provider/bucket/region if a stale row already existed at the target identity. | |
| 144 | 210 | = 1.3.11 = |
| 145 | 211 | * Feature: wp-config.php credentials support (WPMCS_CONFIG). |
| 146 | 212 | * Feature: Connection status checks for storage and CDN. |
| 147 | 213 | * Bug Fix: Redis Object Cache and object cache compatibility. |