WordPressのメディア保存場所を変更するベストプラクティス

プログラミング

WordPressをwpというディレクトリにインストールした場合、デフォルトだと画像のアップロード先のURLが

https://www.example.com/wp/wp-content/uploads/img.png

みたいになるが、これを

https://www.example.com/assets/uploads/img.png

のようにしたいという話がよくある。

これについて、よくブログなどで解説されている手法2つとそれらの欠点、そして私が取ったそれらの欠点を回避する手法に付いて紹介する。

よくある方法1: upload_path, upload_url_pathを編集する

最も数多く紹介されている手法として、https://www.example.com/wp/wp-admin/options.phpにアクセスし、upload_path../assets/uploadsに、upload_url_pathhttps://www.example.com/assets/uploadsにするというものがある。

WordPress 3.5以前では、デフォルトの管理画面からこれらのオプションが設定できたが、現在はoptions.php経由でしか設定できないという予備知識とともに紹介されていることも多い。

しかし、そもそもupload_pathオプションが管理画面から消えたのは、WordPress 3.5からこのオプションは削除されたからであり、未だ使えるのはあくまで互換性のためである。

将来的にいつ使えなくなるかもわからないこの手法をWordPressのバージョンが6まで来ている現在においてなお薦める理由はないだろう。

よくある方法2: WP_CONTENT_DIR, WP_CONTENT_URLを書き換える

wp-contentフォルダをリネーム&移動した上で、wp-config.phpに以下を追記するという方法

define('WP_CONTENT_DIR',  dirname(__FILE__) . '/../' . 'assets');
define('WP_CONTENT_URL',  'https://' . $_SERVER['SERVER_NAME'] . '/assets');

殆どの場合これでうまくいくんだけど、一つ落とし穴がある。

それは、WP_CONTENT_DIRの中身が/path/wp/../assetsのようになってしまっていること。

本来は/path/assetsでよいはずなのに、一回wpに入ってから戻るというような冗長な表記になっている。

ディレクトリトラバーサル(入力に..などの記号を入れることで、通常外部からアクセスできないファイルに不正にアクセスを試みる攻撃)の対策で、プラグインが..のような表記を受け付けないように設定されていることもある。

また、そういうプラグインを使っていなかったとしても、無意味に..を使うようなパス名を使うのは好ましくはないだろう。

今回のベストプラクティス

というわけで、今回提案するベストプラクティス(と思わしきもの)は以下。

よくある方法2で、wp-config.phpに追記するコードを以下のように変える。

define('WP_CONTENT_DIR',  dirname(__FILE__, 2) . '/' . 'assets');
define('WP_CONTENT_URL',  'https://' . $_SERVER['SERVER_NAME'] . '/assets');

PHPdirname関数は、

dirname(string $path, int $levels = 1): string

のように、$levelsというオプション引数を持つ。

これは、$pathからいくつ階層を遡るかということを表しており、デフォルト値の1は親ディレクトリを指す。

親ディレクトリからさらにもう一つ階層を遡りたい場合は、単に$level=2としてやればよい。

これで、定数WP_CONTENT_DIR..を含まないきれいな形になる。

タイトルとURLをコピーしました