クラウド時代のWebアプリケーション・スマートフォンアプリを開発・運用する会社です。 03-4577-8680 03-6673-4950

WordPressマルチサイトでのUpload/URL Path問題

2017-02-27

– 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\’は無効でありかつ/または自動的に変更されています。これはなぜで、何が起きているのでしょうか?

## 要素

1. [バグ #25819](https://core.trac.wordpress.org/ticket/25819)
– WPを3.5にアップデートする際、`ms_files_rewriting`が作成されませんでした。
1. `ms_files_rewriting`
– この値が “1” の場合、管理画面で設定した値は無効となります。
1. `db_version` と wp-includes/upgrade.php
– `db_version`が “21823” 以下の場合、”1″ が設定されます(wp-includes/upgrade.phpによる)。
– WPのアップデートはしていたのですが、`db_version`は更新されていませんでした。この問題には他の条件やパターンが影響している模様です。
1. wp-includes/ms-default-contstants.php
– `ms_files_rewriting`が`*_options`or`*_sitemeta`テーブルに存在しない場合、”1″ が設定されます。
– `ms_files_rewriting`はアップロード関連の定数を設定するのに使用されます。
例)`UPLOADBLOGSDIR`、`UPLOADS`、`BLOGUPLOADDIR`
1. wp-includes/functions.php
– アップロードPATHやURLを設定するのに`ms_files_rewriting`が使用されます。
1. `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`を[最新版](https://codex.wordpress.org/WordPress_Versions)に設定
– 結果:
– アップロード先 = \’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`を[最新版](https://codex.wordpress.org/WordPress_Versions)に設定
– 定数`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](http://wp-cli.org/) を使うことになるかと思います。