WordPress 4.7.2
マルチサイト
3.5以前から運用
2017-02現在
はじめに
Regardless of WP version, these locations cannot be changed by site admins. Only the network admin can make changes on the site settings page.
(WPのバージョンにかかわらず、これらの場所(注:PATHとURL)はサイト管理者が変更することはできない。ネットワーク管理者は管理画面から変更が可能である)
しかし’Upload path’と’Upload Url path’は無効でありかつ/または自動的に変更されています。これはなぜで、何が起きているのでしょうか?
要素
WPを3.5にアップデートする際、ms_files_rewritingが作成されませんでした。
ms_files_rewriting
この値が “1” の場合、管理画面で設定した値は無効となります。
db_version と wp-includes/upgrade.php
db_versionが “21823” 以下の場合、”1″ が設定されます(wp-includes/upgrade.phpによる)。
WPのアップデートはしていたのですが、db_versionは更新されていませんでした。この問題には他の条件やパターンが影響している模様です。
wp-includes/ms-default-contstants.php
ms_files_rewritingが*_optionsor*_sitemetaテーブルに存在しない場合、”1″ が設定されます。
ms_files_rewritingはアップロード関連の定数を設定するのに使用されます。 例)UPLOADBLOGSDIR、UPLOADS、BLOGUPLOADDIR
wp-includes/functions.php
アップロードPATHやURLを設定するのにms_files_rewritingが使用されます。
upload_path
アップロード先を指定する変数です。
3.5で廃止されています。
条件とパターン
条件とパターンが結構存在する模様です。 (間違っていたらすみません)




ありうる選択肢
パターン#1: オリジナルのまま使用する
やるべきこと:
無し
結果:
アップロード先 = ‘wp-content/blogs.dir/(blog_id)/files’
URL = (site url) +’/(blog name)/files’
注意事項:
‘Upload path’、’Upload Url path’は無効になります。
パターン#2: 管理画面の値を使用する
やるべきこと:
*_optionsテーブルにms_files_rewritingを追加しoption_valueを “0” に設定
db_versionを最新版に設定
結果:
アップロード先 = ‘Upload path’ + ‘sites/(blog_id)’
URL = ‘Upload Url path’ + ‘sites/(blog_id)’
注意事項:
‘Upload path’、’Upload Url path’は使用されますが、文字列が追加されます
パターン#3: 定数UPLOADSを使用する
やるべきこと:
*_optionsテーブルにms_files_rewritingを追加しoption_valueを “0” に設定
db_versionを最新版に設定
定数UPLOADSを設定
結果:
アップロード先 = UPLOADS + ‘sites/(blog_id)’
URL = (site url) + UPLOADS + ‘sites/(blog_id)’
注意事項:
‘Upload path’、’Upload Url path’は無効になります。
Q. なぜ定数UPLOADBLOGSDIRを使用しないのですか? A. ms_files_rewritingが “0” に設定されている場合は無視されるためです。
各パターンの問題
パターン#1にある既存の問題
このパターンはレガシーで複雑な互換性を残すことになります。 これは運用を続ける場合には危険要素となりそうです。
パターン#2で発生しうる問題
‘Upload path’、 ‘Upload Url path’が将来廃止される可能性が無いとは言い切れません。非マルチサイトでは既に廃止されているためです。
パターン#3によって生じる問題
(site url)が “/foo/”、(blog_id) が “2”、UPLOADS が “bar” と設定されている場合に、URLは “/foo/bar/sites/2/YYYY/MM/*” となるはずです。 しかし既存の記事内のURLは “/foo/files/YYYY/MM/*” となっているはずです。
結論
将来的なトラブルを回避する方が良いので、パターン#3を選択しました。
既存の画像ファイルは全て “/foo/files/*” から “/foo/bar/sites/2/*” にコピーしなければなりません。
既存の記事内のURLについては、RewriteRuleで解決することにしました。
例) RewriteRule ^/foo/files(.*?)$ /foo/bar/sites/2$1 [R=301,L]
または wp-cli を使うことになるかと思います。