WordPressの既存画像をS3に移植する作業メモ


移植しました。基本的には下記サイトをベースに作業を行っています。

WordPressの画像ファイルをS3に保存する(メディア機能連携) | つかびーの技術日記

今回の移植のポイントは、画像を含めメディアファイルはS3+CloudFrontで配信し、配信先URLはrosouces.php-java.comから配信するようにします。

また今回は移植するにあたり、SQLの書き換え作業が必要になります。なのでSQLに詳しくないorデータベースに直接アクセスできない人はこの先紹介するWP Offload S3 Liteの有料版を使って移植するなり、他の方法を取って下さい。

S3+CloudFrontを準備する

最初に予めS3+CloudFrontでresouce.example.comから画像を配信する準備だけしておきましょう。基本的に以前紹介した記事で環境構築は完了です。

AWS S3+CloudFront+独自ドメイン+SSL+http2+AngularでSPAを配信する方法

前回の記事と違うのはAngularによるSPAの公開ではなく、単に画像ファイルの公開なのでCloudFrontのDistribution設定で、Default Root Objectには何も入力しなくて良いという点です。

default_root_object

また予め既存ファイルをS3にアップロードしておくと良いでしょう。wp-contentのディレクトリを丸ごとS3に上げるだけで良いです。ブラウザから行っても良いですし、awsコマンドツールからsyncしても良いと思います。

s3_wpcontent

WordPressに専用プラグインをインストールし設定する

WordPressに専用プラグインをインストールします。インストールするプラグインは以下の2つです。

インストールしたらプラグインの設定です。設定といっても大したことないのですが…

  • AWSプラグインにAccess Key IDとSecret Access Keyを入力
  • Offload S3にてコンテンツの保管先であるS3バケットを選択する
  • Offload S3の「CloudFront or Custom Domain」にて配信URLの設定をする。自分の場合はresources.php-java.comと入力

DBデータをいじって画像の参照をS3に変更する

以上の作業で過去の画像をS3に移植し、今後アップロードする画像は全てS3に保管され、かつCloudFront経由で配信されるようになりました。

問題は過去にアップロードした画像をいかにS3から配信するかという事です。そのためにはブログ本文からリンクした画像をresouces.php-java.com経由で配信する必要があります。すなわち、本文の画像リンクを全て変更する必要があります。

またできるならOffload S3プラグインと過去の画像を紐付けたい所です。そうすればプラグインから画像を操作・削除することが可能になります。

以下、順番に解説していきます。

ブログ本文中の画像リンクを変更

ブログ本文中の画像リンクphp-java.com/wp-content/uploads/をresouces.php-java.com/wp-content/uploads/に変更します。ブログ本文はwp_postsテーブルに格納されているので、そのテーブルにSQL変更をかけていきます。実行するSQLは以下の通りです。

update wp_posts set post_content = replace(post_content, 'src="https://php-java.com/wp-content/uploads/', 'src="https://resources.php-java.com/wp-content/uploads/');

ドメインの部分は各自で置き換えて下さい。

これだけでもS3への画像移植は十分だと言えます。「過去画像をWordPress上で操作して消したりする予定もないわ。消すとしてもS3の管理画面から手動で消すし…」という人はここで止めておいてもいいと思います。

ただ過去画像とプラグインのDB情報を紐付ければ、プラグインから画像を消したり出来るので、面倒くさがりでない完璧主義の方は次の作業も行って下さいw

プラグインDB情報と過去画像を紐付ける

S3プラグイン経由で画像を上げると、wp_postmetaにS3情報が格納されます。

s3_sql

これと同じ情報を過去画像にも持たせることにより、過去画像とS3プラグインを紐付けることが出来ます。まず実行するSQLを生成するSQLを作ります。

select 
CONCAT('insert into wp_postmeta(post_id, meta_key, meta_value) values('
, post_id
, ', \'amazonS3_info\', \'a:3:{s:6:\"region\";s:14:\"ap-northeast-1\";s:6:\"bucket\";s:22:\"resources.php-java.com\";s:3:\"key\";s:',length(meta_value) + 19,':\"wp-content/uploads/', meta_value, '\";}\');'
) AS record from wp_postmeta where meta_key = '_wp_attached_file'

結果をCSVファイルに保存します。以下はMySQLWorkBenchで行った例ですが、phpMyAdminからでも同様の事は出来るはずです。

213row_returned

保存したcsvファイルを確認します。

migration_csv

このCSV上のSQLをすべて実行します。すると、過去画像とS3プラグインのDB情報がひも付き、過去画像に対してもプラグインから操作出来るようになります。メディアライブラリ上に次のようなS3情報が表示されれば成功している証拠です。

check_query_executed

コメントを残す