{"id":290527,"date":"2026-04-26T00:48:08","date_gmt":"2026-04-26T00:48:08","guid":{"rendered":"https:\/\/br.wordpress.org\/plugins\/r2-cloud-storage\/"},"modified":"2026-04-26T00:47:51","modified_gmt":"2026-04-26T00:47:51","slug":"r2-cloud-storage","status":"publish","type":"plugin","link":"https:\/\/az-tr.wordpress.org\/plugins\/r2-cloud-storage\/","author":23465432,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.0","stable_tag":"1.0.0","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"R2 Cloud Storage","header_author":"R2 Cloud Storage","header_description":"Offload your WordPress media to Cloudflare R2 with zero egress fees. Modular add-on system for WooCommerce, LearnDash, EDD and more.","assets_banners_color":"","last_updated":"2026-04-26 00:47:51","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/r2cloudstorage.com","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":87,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"jhomoura","date":"2026-04-26 00:47:51"}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[3882,84,46891,245358,217],"plugin_category":[50,59],"plugin_contributors":[261060],"plugin_business_model":[],"class_list":["post-290527","plugin","type-plugin","status-publish","hentry","plugin_tags-cloudflare","plugin_tags-media","plugin_tags-offload","plugin_tags-r2","plugin_tags-s3","plugin_category-media","plugin_category-utilities-and-tools","plugin_contributors-jhomoura","plugin_committers-jhomoura"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/r2-cloud-storage.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>R2 Cloud Storage<\/strong> offloads your WordPress Media Library to <a href=\"https:\/\/www.cloudflare.com\/products\/r2\/\">Cloudflare R2<\/a> \u2014 an S3-compatible object storage with <strong>zero egress fees<\/strong>.<\/p>\n\n<h4>Why Cloudflare R2?<\/h4>\n\n<ul>\n<li><strong>$0 egress fees<\/strong> \u2014 No cost for serving files, unlike AWS S3 ($0.09\/GB)<\/li>\n<li>S3-compatible API \u2014 Works with existing tools<\/li>\n<li>Cloudflare CDN integration \u2014 Custom domains with global edge caching<\/li>\n<li>Pay only for storage: $0.015\/GB\/month<\/li>\n<\/ul>\n\n<h4>Core Features (Free)<\/h4>\n\n<ul>\n<li>Automatic media offload on upload<\/li>\n<li>URL rewriting (serve from R2\/custom domain)<\/li>\n<li>Pre-signed URLs for protected content<\/li>\n<li>Bulk sync\/migration tool<\/li>\n<li>Responsive image (srcset) support<\/li>\n<li>Remove local copies to save disk space<\/li>\n<li>REST API for programmatic access<\/li>\n<li>i18n ready (pt_BR included)<\/li>\n<\/ul>\n\n<h4>Modular Add-on System<\/h4>\n\n<p>Extend R2 Cloud Storage with platform-specific add-ons:<\/p>\n\n<ul>\n<li><strong>WooCommerce<\/strong> \u2014 Digital downloads via R2, product images, signed URLs per order<\/li>\n<li><strong>LearnDash<\/strong> \u2014 Course videos and materials with signed URL protection<\/li>\n<li><strong>Tutor LMS<\/strong> \u2014 Protected video streaming and course materials<\/li>\n<li><strong>Easy Digital Downloads<\/strong> \u2014 Secure digital delivery via R2<\/li>\n<li><strong>MemberPress<\/strong> \u2014 Protected member content via R2<\/li>\n<li><strong>BuddyBoss<\/strong> \u2014 Community uploads stored on R2<\/li>\n<\/ul>\n\n<h4>Developer Friendly<\/h4>\n\n<pre><code>`php\n<\/code><\/pre>\n\n<p>\/\/ Register your own add-on\nadd_action( 'r2cs_register_addon', function( $manager ) {\n    $manager-&gt;register( 'my-addon', '1.0.0', 'My_Addon_Class' );\n});<\/p>\n\n<p>\/\/ Generate signed URLs\n$url = r2cs()-&gt;signed_url()-&gt;generate( 'path\/to\/file.pdf', 3600 );<\/p>\n\n<p>\/\/ Upload files programmatically\n$result = r2cs()-&gt;client()-&gt;upload_file( '\/local\/path.pdf', 'remote\/path.pdf' );\n    `<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to external third-party services as described below.<\/p>\n\n<h4>Cloudflare R2 Object Storage<\/h4>\n\n<p>This plugin connects to the Cloudflare R2 API to upload, retrieve, and delete media files stored in your R2 bucket. The connection is made to <code>https:\/\/&lt;account_id&gt;.r2.cloudflarestorage.com<\/code> using your configured credentials (Account ID, Access Key, and Secret Key).<\/p>\n\n<p>Data is sent whenever media files are uploaded, deleted, synced, or served via the plugin. The data transmitted includes the file contents and metadata (object key\/path).<\/p>\n\n<ul>\n<li><a href=\"https:\/\/www.cloudflare.com\/terms\/\">Cloudflare Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/www.cloudflare.com\/privacypolicy\/\">Cloudflare Privacy Policy<\/a><\/li>\n<\/ul>\n\n<h4>R2 Cloud Storage License API<\/h4>\n\n<p>This plugin connects to the R2 Cloud Storage license server at <code>https:\/\/r2cloudstorage.com\/api\/v1\/license<\/code> to activate, deactivate, and verify add-on license keys. This connection is only made when a user manually activates or deactivates an add-on license, or when a periodic license verification is performed.<\/p>\n\n<p>The data transmitted includes: the license key, the add-on slug, and the site domain.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/r2cloudstorage.com\/terms\">R2 Cloud Storage Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/r2cloudstorage.com\/privacy\">R2 Cloud Storage Privacy Policy<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/r2-cloud-storage\/<\/code><\/li>\n<li>Activate through the Plugins menu<\/li>\n<li>Go to <strong>R2 Storage \u2192 Settings<\/strong><\/li>\n<li>Enter your Cloudflare R2 credentials (Account ID, Access Key, Secret Key, Bucket)<\/li>\n<li>Click \"Test Connection\" to verify<\/li>\n<li>Enable automatic offload<\/li>\n<\/ol>\n\n<h4>Getting R2 Credentials<\/h4>\n\n<ol>\n<li>Log in to <a href=\"https:\/\/dash.cloudflare.com\/\">Cloudflare Dashboard<\/a><\/li>\n<li>Navigate to <strong>R2 Object Storage<\/strong><\/li>\n<li>Copy your <strong>Account ID<\/strong> from the sidebar<\/li>\n<li>Go to <strong>Manage R2 API Tokens<\/strong> \u2192 Create API Token<\/li>\n<li>Copy the <strong>Access Key ID<\/strong> and <strong>Secret Access Key<\/strong><\/li>\n<li>Create a bucket if you haven't already<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20existing%20media%3F\"><h3>Does this work with existing media?<\/h3><\/dt>\n<dd><p>Yes! Use the <strong>Sync<\/strong> tool to migrate all existing media to R2.<\/p><\/dd>\n<dt id=\"will%20my%20images%20break%20if%20i%20deactivate%20the%20plugin%3F\"><h3>Will my images break if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>If you chose \"Remove local copies\", the local files are deleted. Keep backups. If local copies exist, WordPress will serve them normally when the plugin is deactivated.<\/p><\/dd>\n<dt id=\"can%20i%20use%20a%20custom%20domain%3F\"><h3>Can I use a custom domain?<\/h3><\/dt>\n<dd><p>Yes. Set up a Custom Domain in Cloudflare R2 and enter it in the settings.<\/p><\/dd>\n<dt id=\"is%20this%20compatible%20with%20multisite%3F\"><h3>Is this compatible with multisite?<\/h3><\/dt>\n<dd><p>Yes. Network-activate the plugin and each site can have its own settings.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Media Library offload<\/li>\n<li>Pre-signed URLs<\/li>\n<li>Bulk sync tool<\/li>\n<li>Add-on manager<\/li>\n<li>pt_BR translation<\/li>\n<\/ul>","raw_excerpt":"Offload your WordPress media to Cloudflare R2 with zero egress fees. Modular add-on system for WooCommerce, LearnDash, EDD and more.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/290527","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=290527"}],"author":[{"embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jhomoura"}],"wp:attachment":[{"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=290527"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=290527"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=290527"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=290527"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=290527"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/az-tr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=290527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}