WordPressのマルチサイト運用時の画像のアップロードの取り扱いが変わったようです。私が気付いたのは3.5.1からだったんですが、3.5からの変更だったようです。
マルチサイト
- サブディレクトリにインストールされた WordPress でもマルチサイト機能が利用可能に
- ms-files.php をデフォルトで無効化
- 新規インストールについてはファイル容量上限をデフォルトで無効化
これまでは、マルチサイト運用時には、
wp-content/blogs.dir/サイトID/files/
というディレクトリを作って、その中にファイルがアップロードされ、wp-includes/ms-files.php とmod_rewriteの働きによって
http://example.com/files/画像ファイル名.jpg
というURLで表示できるようになっていたわけです。
普通に、シングルの運用時のように/wp-content/uploads/ の中にアップしていたら、マルチサイトの画像が混ざってしまうからですね。
しかし3.5からはこのms-files.phpが無効になり、画像は
/wp-content/uploads/sites/サイトID/
にアップされ、
http://exanmple.com/wp-content/uploads/sites/サイトID/画像.jpg
で普通にアクセスするようになりました。
htaccessの記述を見てみても
3.5以前
RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] # uploaded files RewriteRule ^files/(.+) wp-includes/ms-files.php?file=$1 [L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule . index.php [L]
3.5以降
RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] # add a trailing slash to /wp-admin RewriteRule ^wp-admin$ wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule ^(wp-(content|admin|includes).*) $1 [L] RewriteRule ^(.*\.php)$ $1 [L] RewriteRule . index.php [L]
という具合に、ms-files.phpの記述がなくなっています。
じゃあms-files.phpを今まで通りに使うにはどうすればいいのか?
普通に運用する場合、これでも問題はないんでしょうけど、私の場合は、「マルチサイト時は/files/にアップロードされる」という前提で自動処理の独自プラグインを作ってしまっていることもあり、従来の仕様に合わせたいんですよね。
リリースノートには「 ms-files.php をデフォルトで無効化」とありますが、じゃあ有効化させるにはどうすればいいのかと。
単純に、.htaccessをこれまでのものと差し替えたり、
# uploaded files RewriteRule ^files/(.+) wp-includes/ms-files.php?file=$1 [L]
を挿入したりするだけではダメでした。
現在調査中。。。
#19235 (Turn ms-files.php off by default) – WordPress Trac
開発でこの話題のチケットが切られた時の流れをみてみると、「後方互換性がある」というようなことが書かれてますので、通常はhtaccessの記述だけで使えるようになるのかもしれません。