- WordPress 4.7.2
- マルチサイト
- 3.5以前から運用
- 2017-02現在
はじめに
- https://codex.wordpress.org/Multisite_Network_Administration#Uploaded_File_Path
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’は無効でありかつ/または自動的に変更されています。これはなぜで、何が起きているのでしょうか?
要素
- バグ #25819
- WPを3.5にアップデートする際、
ms_files_rewriting
が作成されませんでした。
- WPを3.5にアップデートする際、
ms_files_rewriting
- この値が “1” の場合、管理画面で設定した値は無効となります。
db_version
と wp-includes/upgrade.phpdb_version
が “21823” 以下の場合、”1″ が設定されます(wp-includes/upgrade.phpによる)。- WPのアップデートはしていたのですが、
db_version
は更新されていませんでした。この問題には他の条件やパターンが影響している模様です。
- wp-includes/ms-default-contstants.php
ms_files_rewriting
が*_options
or*_sitemeta
テーブルに存在しない場合、”1″ が設定されます。ms_files_rewriting
はアップロード関連の定数を設定するのに使用されます。
例)UPLOADBLOGSDIR
、UPLOADS
、BLOGUPLOADDIR
- wp-includes/functions.php
- アップロードPATHやURLを設定するのに
ms_files_rewriting
が使用されます。
- アップロードPATHやURLを設定するのに
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 を使うことになるかと思います。
- 例)