Description
Yctvn Media Offload for Cloudflare R2 seamlessly integrates your WordPress media library with Cloudflare R2 Storage, providing enterprise-grade CDN delivery at a fraction of the cost of traditional solutions.
📸 New to Cloudflare R2? Check out the Screenshots section for a complete visual setup guide with step-by-step instructions!
Key Features
- Automatic Media Upload: Automatically upload new media files to R2 storage as they’re added to WordPress
- Bulk Sync: Migrate existing media library to R2 with one-click bulk sync
- CDN URL Rewriting: Serve all media from Cloudflare’s global CDN network
- Image Size Support: Upload and serve all WordPress image sizes including thumbnails
- Responsive Images: Full support for srcset and responsive images
- Post Content Rewriting: Automatically rewrite image URLs in post content
- AWS Signature V4: Secure authentication using industry-standard protocols
- Debug Mode: Comprehensive logging for troubleshooting
Why Choose R2 Storage?
- Cost Effective: No egress fees – pay only for storage
- Global Performance: Leverage Cloudflare’s worldwide CDN network
- S3 Compatible: Works with standard S3 APIs
- Reliability: Enterprise-grade infrastructure with 99.9% uptime SLA
Requirements
- WordPress 5.0 or higher
- PHP 8.0 or higher (compatible with 8.0, 8.1, 8.2, 8.3, 8.4)
- Cloudflare account with R2 enabled
- R2 API credentials (Access Key ID and Secret Access Key)
Getting Started
Visual Guide: See the Screenshots section below for a complete step-by-step visual guide!
Follow these 3 simple steps to connect your WordPress site to Cloudflare R2:
Step 1: Create R2 Bucket
1. Log in to Cloudflare Dashboard
2. Click on “R2” in the left sidebar
3. Click “Create bucket”
4. Enter a unique bucket name (e.g., “my-wordpress-media”)
5. Choose a location (optional)
6. Click “Create bucket”
Step 2: Get Your Credentials
You need 4 pieces of information from Cloudflare:
A. Account ID:
– In R2 dashboard, look at the top right corner
– Copy the “Account ID” (format: 32 alphanumeric characters)
B. Access Key ID & Secret Access Key:
1. In R2 dashboard, click “Manage R2 API Tokens”
2. Click “Create API token”
3. Give it a name (e.g., “WordPress Media Plugin”)
4. Under Permissions, select “Object Read & Write”
5. (Optional) Under “Specify bucket(s)”, you can limit to your specific bucket
6. Click “Create API token”
7. IMPORTANT: Copy and save both:
– Access Key ID (shows immediately)
– Secret Access Key (shows only once – save it now!)
C. Bucket Name:
– The name you created in Step 1 (e.g., “my-wordpress-media”)
D. Public URL (CDN URL):
– Go to your R2 bucket Settings
– Under “Public access”, click “Allow Access”
– Your public URL will be: https://pub-[hash].r2.dev
– OR connect a custom domain under “Custom Domains” (e.g., https://cdn.yoursite.com)
Step 3: Configure Plugin
1. Install and activate this plugin
2. Go to Settings Yctvn Media Offload
3. Enter all 4 credentials from Step 2:
– Account ID
– Access Key ID
– Secret Access Key
– Bucket Name
– Public URL (your R2 public URL or custom domain)
4. Check “Auto Offload” to automatically upload new media
5. Check “Enable URL Rewrite” to serve media from R2/CDN
6. Click “Save Settings”
7. Use “Bulk Sync” to upload existing media
Additional Information
Support
For support, please use the WordPress.org support forum.
Buy Me a Coffee
If you find this plugin helpful, consider buying me a coffee ☕
Your support helps maintain and improve this plugin!
Contributing
This plugin is open source and welcomes contributions from the community.
Privacy
This plugin does not collect any personal data. Media files are transferred directly between your WordPress site and your Cloudflare R2 account.
Screenshots

Step 1: Create R2 bucket in Cloudflare dashboard 
Step 2: Get your Account ID from R2 dashboard 
Step 3: Create API token with Read & Write permissions 
Step 4: Copy Access Key ID and Secret Access Key 
Step 5: Configure Public URL or custom domain 
Plugin settings page – Enter R2 credentials 
Plugin settings – Auto upload and URL rewrite options 
Bulk sync interface showing upload progress 
Media library with R2/CDN URLs 
Debug information and sync status panel
Installation
Automatic Installation
- Go to Plugins Add New in your WordPress admin
- Search for “Yctvn Media Offload for Cloudflare R2”
- Click “Install Now” and then “Activate”
- Go to Settings Yctvn Media Offload to configure
Manual Installation
- Download the plugin ZIP file
- Go to Plugins Add New Upload Plugin
- Choose the ZIP file and click “Install Now”
- Activate the plugin
- Go to Settings Yctvn Media Offload to configure
Configuration
Detailed Setup Instructions
Finding Your Account ID:
1. Go to Cloudflare Dashboard
2. Click “R2” in the sidebar
3. Your Account ID is displayed on the right side (32-character string)
4. Example format: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
Creating API Tokens:
1. In R2 dashboard, click “Manage R2 API Tokens”
2. Click “Create API token”
3. Token name: Enter any name (e.g., “WordPress Plugin”)
4. Permissions: Select “Object Read & Write”
5. Bucket scope: Choose “Apply to specific buckets” or “All buckets”
6. TTL: Leave as “Forever” or set expiration
7. Click “Create API token”
8. Save these immediately (Secret only shows once!):
– Access Key ID: 4e65xxxxxxxxxxxxxx (20 chars)
– Secret Access Key: tbral5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (40 chars)
Getting Public/CDN URL:
Option 1: Use R2.dev subdomain (easiest):
1. Go to your bucket Settings
2. Under “Public access”, click “Allow Access”
3. Copy the URL: https://pub-xxxxx.r2.dev
Option 2: Custom domain (recommended):
1. In your bucket, go to “Settings” “Custom Domains”
2. Click “Connect Domain”
3. Enter your subdomain: cdn.yoursite.com
4. Add DNS record as instructed by Cloudflare
5. Wait for verification (may take a few minutes)
6. Use https://cdn.yoursite.com as your Public URL
Plugin Settings Explained:
– Account ID: Your Cloudflare account identifier
– Access Key ID: API token public key
– Secret Access Key: API token private key (keep secure!)
– Bucket Name: Name of your R2 bucket
– Public URL: R2.dev URL or custom domain
– Auto Offload: Upload new media automatically to R2
– URL Rewrite: Serve all media from R2/CDN instead of local
– Delete Local Files: Remove files from server after upload (saves space)
– Upload Mode:
– “Full Image Only” = faster, uploads only main image
– “All Sizes” = uploads all thumbnails too
FAQ
-
Is this plugin free?
-
Yes, the plugin is completely free. You only pay for Cloudflare R2 storage usage.
-
What are the R2 storage costs?
-
Cloudflare R2 charges $0.015 per GB per month for storage with no egress fees. Check Cloudflare’s website for current pricing.
-
Does it work with custom image sizes?
-
Yes, the plugin uploads all registered WordPress image sizes including custom sizes defined by themes or plugins.
-
Can I keep local copies of files?
-
Yes, you can choose whether to delete local files after upload or keep them as backup.
-
Is it compatible with other CDN plugins?
-
The plugin rewrites media URLs to use R2/CDN URLs. It may conflict with other CDN plugins that also rewrite URLs.
-
What happens if I deactivate the plugin?
-
Media URLs will revert to local URLs. Files already uploaded to R2 remain there. You can reactivate anytime to resume using R2.
-
Can I use a custom domain for CDN?
-
Yes, you can configure a custom domain (like cdn.yourdomain.com) to point to your R2 bucket.
-
Does it support WebP images?
-
Yes, the plugin supports all file types that WordPress accepts, including WebP images.
Reviews
Contributors & Developers
“Yctvn Media Offload for Cloudflare R2” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Yctvn Media Offload for Cloudflare R2” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.2
- New: AJAX-based settings save – no page reload required
- New: Real-time save confirmation appears below Save button
- New: Enhanced Bulk Sync UI with visual progress bar
- New: Color-coded terminal-style sync logs (info, success, error, warning)
- New: Live sync statistics (processed count, success/error tracking)
- Improved: Settings page UX – notifications stay in place without page refresh
- Improved: Bulk sync feedback – see each file upload in real-time
- Improved: Progress tracking with percentage and file counter
- Enhanced: Better user experience with instant feedback on all actions
- Fixed: Settings save now shows status immediately without reloading
1.0.1
- Fixed: Plugin activation issue when debug files are missing
- Improved: Added file existence check for debug/test files
- Enhanced: Better error handling for development mode
1.0.0
- Initial release
- Automatic media upload to R2
- Bulk sync for existing media
- CDN URL rewriting
- Support for all image sizes
- Responsive image support
- Post content rewriting
- Debug logging
