WP Offload Media Liteとは
WordPressの画像やビデオ、ドキュメント類をAmazon S3にアップロードして、Amazon CloudFrontなどで配信させることができるWordpressのプラグイン
問題
ウェブサイトをリニューアルする際などに本番のドメインは使えないためサブドメインなどを作って、開発する要件があった。
開発環境のWordpressで画像つきの記事を登録し、本番環境に移行すると画像が表示されないという現象が起こった。
本来であれば、このプラグインを使用するとS3に画像がアップロードされ、画像のパスは下記のように出力されていてほしい
https://[s3 bucket名].s3.ap-northeast-1.amazonaws.com/wp-content/uploads/yyyy/mm/******/image.png
だが本番に移行すると
https://[開発環境のドメイン]/wp-content/uploads/yyyy/mm/******/image.png
となっていた。
原因
「記事登録したときのドメイン」と「記事表示しているドメイン」を比較しているため
下記はプラグインがドメインを比較しているところ。
/**
* Ensure local URL is correct for multisite's non-primary subsites.
*
* @param string $url
*
* @return string
*/
public function maybe_fix_local_subsite_url( $url ) {
$siteurl = trailingslashit( get_option( 'siteurl' ) );
if ( is_multisite() && ! $this->is_current_blog( get_current_blog_id() ) && 0 !== strpos( $url, $siteurl ) ) {
// Replace original URL with subsite's current URL.
$orig_siteurl = trailingslashit( apply_filters( 'as3cf_get_orig_siteurl', network_site_url() ) );
$url = str_replace( $orig_siteurl, $siteurl, $url );
}
return $url;
}
DB登録されている画像のパスはS3ではなく、登録した際のドメインのパスで登録されていた。
このプラグインはDB登録のパス(記事本文に入っている画像のパス)と設定の「サイトアドレス」を比較しているらしく
一致しないとS3のパスに書き換えてくれないようです。
解決方法
本番移行時に手作業でドメインを書き換える方法なども考えることができたが
数が多い場合にはエクスポートするなどして、インポートする際に一括置換で書き換える方法をとった。
$path = str_replace('http://[移行前のドメイン]/wp-content/uploads', 'https://[移行後のドメイン]/wp-content/uploads', $path);
SQLのdumpをとって、置換もいいかも。