{"id":361622,"date":"2026-09-01T14:40:48","date_gmt":"2026-09-01T14:40:48","guid":{"rendered":"https:\/\/br.wordpress.org\/plugins\/cpw-media-offload-for-cloudflare-r2\/"},"modified":"2026-09-01T14:40:22","modified_gmt":"2026-09-01T14:40:22","slug":"cpw-media-offload-for-cloudflare-r2","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/cpw-media-offload-for-cloudflare-r2\/","author":23343154,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.1","stable_tag":"1.2.1","tested":"7.1","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"CPW Media Offload for Cloudflare R2","header_author":"CPW","header_description":"Offloads the WordPress Media Library to Cloudflare R2 and serves files from R2 (or a custom domain), keeping local disk usage low. Tuned for the R2 free tier of 10 GB and compatible with Elementor, block themes and classic themes.","assets_banners_color":"d1d2d1","last_updated":"2026-09-01 14:40:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/criandoparaweb.com.br\/","rating":5,"author_block_rating":0,"active_installs":0,"downloads":44,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.1":{"tag":"1.2.1","author":"criandoparaweb","date":"2026-09-01 14:40:22","revision":3676343}},"upgrade_notice":{"1.2.1":"<p>Housekeeping release for the WordPress.org directory. No functional change.<\/p>","1.2.0":"<p>Renamed to CPW Media Offload for Cloudflare R2. Settings and offloaded files are preserved; the plugin folder changes, so deactivate the old copy after installing this one.<\/p>","1.1.1":"<p>Adds step-by-step help on the settings screen for finding each credential in the Cloudflare dashboard.<\/p>","1.1.0":"<p>Deleting the plugin no longer wipes your settings and offload index. Adds WebP conversion on upload, a re-send action and a tool to rebuild the index from the bucket.<\/p>","1.0.1":"<p>Maintenance release: internationalisation and database query fixes, plus WordPress 7.1 compatibility.<\/p>","1.0.0":"<p>First public release.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3676343,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3676343,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3676343,"resolution":"1544x500","location":"assets","locale":"","width":2203,"height":714},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3676343,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3676343,"resolution":"1","location":"assets","locale":"","width":1637,"height":1241},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3676343,"resolution":"2","location":"assets","locale":"","width":1650,"height":1230},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3676343,"resolution":"3","location":"assets","locale":"","width":1637,"height":1236},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3676343,"resolution":"4","location":"assets","locale":"","width":1637,"height":1239}},"screenshots":{"1":"Connection, delivery, offload and free tier usage at a glance.","2":"Connection settings, with step by step help for finding each value in Cloudflare.","3":"Bulk offload running over an existing Media Library.","4":"The whole library offloaded, plus the rebuild and maintenance tools."}},"plugin_section":[],"plugin_tags":[3863,3882,255105,245358,2216],"plugin_category":[59],"plugin_contributors":[278674],"plugin_business_model":[],"class_list":["post-361622","plugin","type-plugin","status-publish","hentry","plugin_tags-cdn","plugin_tags-cloudflare","plugin_tags-media-offload","plugin_tags-r2","plugin_tags-storage","plugin_category-utilities-and-tools","plugin_contributors-criandoparaweb","plugin_committers-criandoparaweb"],"banners":{"banner":"https:\/\/ps.w.org\/cpw-media-offload-for-cloudflare-r2\/assets\/banner-772x250.png?rev=3676343","banner_2x":"https:\/\/ps.w.org\/cpw-media-offload-for-cloudflare-r2\/assets\/banner-1544x500.png?rev=3676343","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/cpw-media-offload-for-cloudflare-r2\/assets\/icon-128x128.png?rev=3676343","icon_2x":"https:\/\/ps.w.org\/cpw-media-offload-for-cloudflare-r2\/assets\/icon-256x256.png?rev=3676343","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/cpw-media-offload-for-cloudflare-r2\/assets\/screenshot-1.png?rev=3676343","caption":"Connection, delivery, offload and free tier usage at a glance."},{"src":"https:\/\/ps.w.org\/cpw-media-offload-for-cloudflare-r2\/assets\/screenshot-2.png?rev=3676343","caption":"Connection settings, with step by step help for finding each value in Cloudflare."},{"src":"https:\/\/ps.w.org\/cpw-media-offload-for-cloudflare-r2\/assets\/screenshot-3.png?rev=3676343","caption":"Bulk offload running over an existing Media Library."},{"src":"https:\/\/ps.w.org\/cpw-media-offload-for-cloudflare-r2\/assets\/screenshot-4.png?rev=3676343","caption":"The whole library offloaded, plus the rebuild and maintenance tools."}],"raw_content":"<!--section=description-->\n<p>CPW Media Offload for Cloudflare R2 copies your WordPress Media Library to a Cloudflare R2 bucket and rewrites the media URLs of your site so visitors download images, videos and documents from Cloudflare instead of your web server.<\/p>\n\n<p>The Cloudflare R2 free tier includes 10 GB of storage and, when the bucket is served through a custom domain, no egress fees. That makes it a practical way to keep a small hosting plan fast: your server stops sending megabytes of images on every page view and stops filling its disk with thumbnails.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>Uploads new media, and every generated thumbnail size, to your R2 bucket.<\/li>\n<li>Optionally deletes the local copy after a successful upload, so the uploads folder stops growing.<\/li>\n<li>Rewrites attachment URLs, <code>srcset<\/code> sources, post content, widgets and blocks to the public bucket URL.<\/li>\n<li>Bulk tool that offloads an existing library in small batches, with progress and a stop button.<\/li>\n<li>Copy files back to the server at any time, per file or for the whole library.<\/li>\n<li>Usage bar tuned for the 10 GB free tier, measured directly on the bucket.<\/li>\n<li>Optional WebP conversion on upload, so the smaller file is what uses your storage allowance.<\/li>\n<li>Cloudflare R2 column and per file actions inside the Media Library, including sending a changed file again.<\/li>\n<li>Rebuild tool that restores the offload index by checking the bucket, without uploading anything.<\/li>\n<li>Activity log so upload or permission problems are visible without server access.<\/li>\n<\/ul>\n\n<h4>Page builder and theme compatibility<\/h4>\n\n<p>Media URLs stored inside page builder data are rewritten as well, so background images, galleries and sliders keep working after an offload:<\/p>\n\n<ul>\n<li>Elementor and Elementor Pro, including generated CSS files and background images.<\/li>\n<li>Divi, Beaver Builder and WPBakery Page Builder.<\/li>\n<li>Block themes, classic themes, the block editor and any theme that uses the standard WordPress media functions.<\/li>\n<\/ul>\n\n<p>Elementor's CSS cache is cleared automatically after an offload so its generated files point at the new URLs.<\/p>\n\n<h4>Languages<\/h4>\n\n<p>The plugin is fully internationalised. Translations are provided through translate.wordpress.org, where Brazilian Portuguese and any other language can be contributed.<\/p>\n\n<h4>Security<\/h4>\n\n<ul>\n<li>The secret access key is encrypted with your WordPress security keys before it is stored.<\/li>\n<li>Credentials can be defined as constants in <code>wp-config.php<\/code> and kept out of the database entirely.<\/li>\n<li>Every form is protected with nonces and capability checks.<\/li>\n<li>No third party SDK is bundled: requests are signed with AWS Signature Version 4 and sent through the WordPress HTTP API.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the Cloudflare R2 storage service, which is the whole purpose of the plugin. It does not connect to any other external service and it sends no analytics or telemetry anywhere.<\/p>\n\n<p><strong>Cloudflare R2 (S3 compatible API)<\/strong><\/p>\n\n<ul>\n<li>When: whenever a file is offloaded, restored, deleted or listed, and when you use the Test connection or Recalculate storage usage buttons.<\/li>\n<li>Where: <code>https:\/\/&lt;your-account-id&gt;.r2.cloudflarestorage.com<\/code> (or the EU or FedRAMP jurisdiction endpoint you select, or a custom endpoint you enter).<\/li>\n<li>What is sent: the media files you choose to offload, their file names and content types, your R2 access key id, a request signature generated from your secret access key, and a user agent string containing the plugin version and your site address.<\/li>\n<li>What is received: the storage responses of the service, including object listings and sizes used by the usage bar.<\/li>\n<\/ul>\n\n<p>Files served to your visitors are additionally requested from the public bucket URL you configure (an <code>r2.dev<\/code> address or your own custom domain).<\/p>\n\n<p>Cloudflare terms of service: https:\/\/www.cloudflare.com\/terms\/\nCloudflare privacy policy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>In your Cloudflare dashboard create an R2 bucket and an R2 API token with <strong>Object Read and Write<\/strong> permission.<\/li>\n<li>Go to <strong>Media \u2192 Cloudflare R2<\/strong> and fill in the account id, access key id, secret access key and bucket name.<\/li>\n<li>Click <strong>Test connection<\/strong>.<\/li>\n<li>Give the bucket a public URL: either enable the <code>r2.dev<\/code> development URL, or, recommended for production, connect a custom domain to the bucket in Cloudflare. Paste that address in <strong>Public bucket URL<\/strong>.<\/li>\n<li>Open the <strong>Offload tools<\/strong> tab and run <strong>Start offloading<\/strong> to move the existing library.<\/li>\n<li>Back in <strong>Settings<\/strong>, enable <strong>Serve media from R2<\/strong>.<\/li>\n<li>Only after checking that your site renders correctly, enable <strong>Delete the local copy after a successful upload<\/strong> to free disk space.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20paid%20cloudflare%20plan%3F\"><h3>Do I need a paid Cloudflare plan?<\/h3><\/dt>\n<dd><p>No. The R2 free tier includes 10 GB of storage per month plus a monthly allowance of read and write operations, which is enough for most small and medium sites. The plugin shows how much of that allowance your media uses.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20elementor%3F\"><h3>Does it work with Elementor?<\/h3><\/dt>\n<dd><p>Yes. Beyond the standard WordPress media functions, the plugin rewrites the URLs stored inside Elementor documents, so widgets, galleries and background images all point at Cloudflare. The Elementor editor keeps working with local paths, and Elementor's CSS cache is cleared after an offload.<\/p><\/dd>\n<dt id=\"will%20my%20media%20break%20if%20i%20deactivate%20the%20plugin%3F\"><h3>Will my media break if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>No, as long as the local copies still exist: URLs simply go back to your server. If you enabled local deletion, run <strong>Copy everything back to the server<\/strong> in the Offload tools tab before deactivating.<\/p><\/dd>\n<dt id=\"can%20i%20keep%20using%20the%20wordpress%20image%20editor%3F\"><h3>Can I keep using the WordPress image editor?<\/h3><\/dt>\n<dd><p>Yes while the local copy is kept. With local deletion enabled, use <strong>Copy back to server<\/strong> on that file first, edit it, and it will be offloaded again.<\/p><\/dd>\n<dt id=\"does%20it%20delete%20my%20files%20from%20r2%20when%20i%20uninstall%20the%20plugin%3F\"><h3>Does it delete my files from R2 when I uninstall the plugin?<\/h3><\/dt>\n<dd><p>Never. Uninstalling removes only the plugin settings, log and internal post meta. Your bucket is left untouched.<\/p><\/dd>\n<dt id=\"i%20deleted%20the%20plugin%20and%20lost%20the%20record%20of%20what%20was%20offloaded.%20what%20now%3F\"><h3>I deleted the plugin and lost the record of what was offloaded. What now?<\/h3><\/dt>\n<dd><p>Your files are still on the bucket: the plugin never deletes them. Go to the Offload tools tab and run <strong>Rebuild the index<\/strong>, which checks every attachment against the bucket and restores the record without uploading anything. To stop it happening again, keep the setting <strong>Keep the settings and the offload index<\/strong> enabled, which is the default from version 1.1.0. Note that deleting a plugin runs its clean up routine, while updating one does not.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20convert%20my%20images%20to%20webp%3F\"><h3>Does the plugin convert my images to WebP?<\/h3><\/dt>\n<dd><p>Only if you turn it on. With the option enabled, JPEG and PNG uploads are converted before the thumbnails are generated, so every size is WebP and the smaller file is what counts against your storage. GIFs are never converted so animations survive, and an image is only replaced when the WebP version really is smaller. It applies to new uploads: images already in the library are left as they are.<\/p><\/dd>\n<dt id=\"can%20several%20sites%20share%20one%20bucket%3F\"><h3>Can several sites share one bucket?<\/h3><\/dt>\n<dd><p>Yes. Give each site a different <strong>Path prefix<\/strong>, for example <code>site-a<\/code> and <code>site-b<\/code>.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20files%20that%20fail%20to%20upload%3F\"><h3>What happens to files that fail to upload?<\/h3><\/dt>\n<dd><p>They are flagged and skipped so the bulk tool can continue. The reason is recorded in the Log tab, and <strong>Queue failed files again<\/strong> puts them back in line.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Removed the Plugin URI header, which pointed at a page that does not exist yet.<\/li>\n<li>Translations are no longer bundled: they come from translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>The plugin is now called CPW Media Offload for Cloudflare R2. Only the name, the slug and the text domain changed: your settings, your offload index and your files on the bucket are untouched.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Every credential field on the settings screen now has a \"Where to find this in Cloudflare\" panel showing the exact click path in the Cloudflare dashboard, including a warning that the secret access key is only ever displayed once.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Deleting the plugin no longer erases your settings and offload index by default. A new setting controls it, and files on the bucket were never touched to begin with.<\/li>\n<li>New tool that rebuilds the offload index by checking the bucket, for libraries whose index was lost.<\/li>\n<li>New \"Send to R2 again\" action, per file and in bulk, for files that changed after being offloaded.<\/li>\n<li>Optional WebP conversion of JPEG and PNG uploads, with a quality setting. Conversion runs before the thumbnails are generated, GIFs are left alone, and the original is only replaced when the WebP version is actually smaller.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Translations are now loaded without load_plugin_textdomain(), which is discouraged since WordPress 4.6. Language packs from translate.wordpress.org keep taking precedence over the bundled files.<\/li>\n<li>The attachment lookup query now passes its meta key as a prepared placeholder.<\/li>\n<li>Declared compatibility with WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<li>Offload of new uploads and of existing libraries to Cloudflare R2.<\/li>\n<li>URL rewriting for attachments, srcset, post content and page builder data.<\/li>\n<li>Elementor, Divi, Beaver Builder and WPBakery compatibility.<\/li>\n<li>Multipart uploads for large files, bulk tools, usage meter and activity log.<\/li>\n<li>Ready for translation through translate.wordpress.org.<\/li>\n<\/ul>","raw_excerpt":"Move your Media Library to Cloudflare R2, free disk space on your hosting and serve images from Cloudflare. Works with Elementor and any theme.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/361622","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=361622"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/criandoparaweb"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=361622"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=361622"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=361622"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=361622"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=361622"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=361622"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}