2026年7月17日
2026年7月17日
WordPressのメディアをCloudflare R2にオフロードする設定手順と注意点
WordPressのメディアをCloudflare R2に置くには、R2のバケットと権限を絞ったAPIトークンを用意し、S3互換ストレージに対応したオフロード用プラグインでアップロード先と配信URLを切り替えます。この記事では、バケット作成から公開用ドメインの設定、プラグインの接続、既存画像の移行、元に戻す方法までを順に説明します。読み終えると、サーバーのディスクを圧迫していた wp-content/uploads をR2から配信できるようになります。
R2にオフロードすると何が変わるのか
通常、WordPressにアップロードした画像やPDFは、Webサーバーの wp-content/uploads に保存され、同じサーバーから配信されます。オフロードとは、このファイルをオブジェクトストレージへコピー(または移動)し、記事に出力される画像URLをストレージ側のドメインに書き換えることです。
Cloudflare R2はAmazon S3と互換性のあるAPIを持つオブジェクトストレージで、S3向けに作られたツールやプラグインの多くがエンドポイントを差し替えるだけで使えます。データ転送量(エグレス)に課金しない料金体系を打ち出しているのが特徴ですが、保存容量や操作回数には課金があるため、料金の詳細はCloudflareの公式ページで確認してください。
メリットは、サーバーのディスクとバックアップの容量を減らせることと、画像配信をCloudflareに任せられることです。一方で、画像編集やバックアップの動きが変わる点は後半で説明します。
準備:バックアップとステージング
最初に、データベースと wp-content/uploads のバックアップを取ります。オフロード用プラグインは、添付ファイルごとに「どこに保存したか」をデータベースに記録します。設定を誤ると画像が表示されなくなるため、まずステージング環境で一通り試してから本番に反映してください。
あわせて、メディアの総容量とファイル数を把握しておくと、移行にかかる時間の見当がつきます。
du -sh wp-content/uploads
find wp-content/uploads -type f | wc -l
ステップ1:R2バケットを作る
Cloudflareのダッシュボードで R2 を開き、バケットを作成します。バケット名はURLやAPIで使うため、example-media のように小文字と数字、ハイフンで付けます。作成時にロケーションのヒント(データを置く地域の希望)を選べる場合は、読者が多い地域に近いものを選びます。画面の項目名は変わることがあるため(2026年10月現在)、迷ったら公式ドキュメントのR2の項目を参照してください。
R2のS3互換APIのエンドポイントは、アカウントIDを含む次の形式です。リージョンは auto を指定します。
https://<ACCOUNT_ID>.r2.cloudflarestorage.com
ステップ2:権限を絞ったAPIトークンを作る
R2の管理画面からAPIトークンを作成します。権限は「オブジェクトの読み取りと書き込み」に相当するものを選び、対象を今回のバケットだけに限定します。アカウント全体の管理権限を持つトークンをWordPressに置くと、サイトが侵害されたときにほかのバケットまで操作される恐れがあるためです。
作成後に表示されるアクセスキーIDとシークレットアクセスキーは、画面を閉じると再表示できない場合があります。パスワード管理ツールなど安全な場所に控え、チャットやGitリポジトリには貼らないでください。
ステップ3:配信用のドメインを決める
バケットの中身をブラウザから見られるようにする方法は主に二つあります。
- カスタムドメインを接続する:
media.example.comのようなサブドメインをバケットに接続します。ドメインがCloudflareで管理されている必要があります。キャッシュルールなどCloudflareの機能も使えるため、本番サイトではこちらを選びます。 - r2.dev のサブドメインを有効にする:手軽ですが、Cloudflareは開発・検証用途と位置づけており、アクセス量の制限もあるため本番配信には向きません。
なお、R2はS3のようなオブジェクト単位のACL(公開・非公開の切り替え)を前提にしていません。公開はバケット単位でドメインを接続して行う、と考えると設定を誤りにくくなります。
カスタムドメインを接続したら、テスト用の画像を1枚アップロードし、ブラウザで https://media.example.com/テスト画像のパス が開けるか確認します。
ステップ4:オフロード用プラグインを選んで接続する
WordPress側では、S3互換ストレージに対応したオフロード用プラグインを使います。代表的なものに次があります。
- WP Offload Media(無料版はWP Offload Media Lite):歴史が長く利用者も多いプラグインです。
- Media Cloud:オフロードに加えて画像処理などの機能を持つプラグインです。
- Advanced Media Offloader:Cloudflare R2を含むS3互換ストレージに絞った比較的新しいプラグインです。
どのプラグインも、R2に対応しているか、無料版で使えるかがバージョンによって変わります。導入前に各プラグインの公式ドキュメントと更新日、対応しているWordPressのバージョンを確認してください。
接続時に入力するのは、おおむね次の項目です。
- ストレージの種類(Cloudflare R2、またはS3互換・カスタムエンドポイント)
- エンドポイント(ステップ1の形式)とリージョン
auto - アクセスキーIDとシークレットアクセスキー
- バケット名と、保存先のパス(
wp-content/uploads/を残すかどうか) - 配信用ドメイン(ステップ3のカスタムドメイン)
鍵をデータベースに保存せず、wp-config.php に定数で書く方法を用意しているプラグインが多くあります。定数名はプラグインごとに異なるため、ドキュメントに従ってください。wp-config.php はGitに含めない運用にしておきます。
設定後、メディアライブラリから画像を1枚アップロードし、記事に挿入して表示を確かめます。ブラウザの開発者ツールで画像のURLがカスタムドメインになっているか、srcset 内の各サイズも書き換わっているかを見ます。
ステップ5:既存のメディアを移行する
プラグインの多くは、既存の添付ファイルをまとめてオフロードする機能を持っています(無料版では使えない場合があります)。この機能は、ファイルをR2にコピーするだけでなく、添付ファイルごとの保存先情報をデータベースに書き込むので、画像URLの書き換えはプラグインに任せるのが基本です。
ファイル数が多くてプラグインの一括処理が途中で止まる場合は、先にrcloneなどでファイルをR2へ転送しておくと時間を短縮できます。rcloneはR2を正式にサポートしています。
# ~/.config/rclone/rclone.conf
[r2]
type = s3
provider = Cloudflare
access_key_id = your-access-key-id
secret_access_key = your-secret-access-key
endpoint = https://<ACCOUNT_ID>.r2.cloudflarestorage.com
acl = private
# まずは --dry-run で転送内容だけ確認する
rclone copy wp-content/uploads r2:example-media/wp-content/uploads --dry-run
rclone copy wp-content/uploads r2:example-media/wp-content/uploads --progress
ただし、rcloneで送っただけではWordPressは「R2にある」と認識しません。データベースへの記録はプラグインの機能で行う必要があるため、手動転送を組み合わせられるかは、使うプラグインのドキュメントで確認してください。トークンの権限をバケット単位に絞っている場合は、rcloneの設定に no_check_bucket = true を加えないとエラーになることがあります。
つまずきやすい点
- ローカルのファイルを削除する設定:オフロード後にサーバー上の元ファイルを消す設定があります。ディスクは空きますが、サムネイルの再生成や画像編集、一部のバックアップ・画像圧縮プラグインがローカルファイルを前提に動くため、最初は「残す」にしておき、動作を確認してから判断します。
- バックアップの対象:元ファイルを消した場合、サーバーのバックアップに画像が含まれなくなります。R2側のバックアップ方針(別バケットへの複製など)を決めてから消してください。
- CORSエラー:Webフォントや、JavaScriptから画像を読み込む処理を別ドメインから配信すると、ブラウザがCORSエラーを出すことがあります。R2のバケット設定でCORSポリシーを追加し、許可するオリジンを自分のサイトに限定します。
- キャッシュ:画像を差し替えたのに古いものが表示される場合は、Cloudflareのキャッシュが残っています。ファイル名を変えて上げ直すか、該当URLのキャッシュを削除します。
- プラグインを止めたとき:多くのプラグインは表示時にURLを書き換えているため、無効化するとURLはローカルに戻ります。ローカルにファイルが残っていれば表示は続きますが、消していれば画像が表示されなくなります。
元に戻す方法
オフロードをやめたい場合は、プラグインの「R2からサーバーへダウンロードする」機能でローカルにファイルを戻してから無効化するのが安全です。手動で戻す場合は、rclone copy r2:example-media/wp-content/uploads wp-content/uploads でファイルを取り戻し、ローカルURLで表示されることを確認してからプラグインを止めます。記事本文にカスタムドメインのURLが直接保存されてしまった場合は、WP-CLIの wp search-replace を --dry-run 付きで実行して件数を確認し、バックアップを取ってから置換します。
まとめ
- R2はS3互換APIを持つオブジェクトストレージで、エンドポイントは
https://<ACCOUNT_ID>.r2.cloudflarestorage.com、リージョンはautoです。 - APIトークンは対象バケットだけに読み書き権限を絞り、鍵は
wp-config.phpの定数など安全な場所に置きます。 - 本番の配信はr2.devではなく、Cloudflareで管理しているドメインをバケットに接続して行います。
- WordPress側はS3互換に対応したオフロード用プラグインで接続し、R2対応や無料版の範囲は導入前にドキュメントで確認します。
- ローカルファイルの削除は最後に判断し、バックアップと戻し方を決めてから行います。