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

(初出: FLAMA技術ブログ 2017/2/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
    • WPを3.5にアップデートする際、ms_files_rewritingが作成されませんでした。
  2. ms_files_rewriting
    • この値が “1” の場合、管理画面で設定した値は無効となります。
  3. db_version と wp-includes/upgrade.php
    • db_versionが “21823” 以下の場合、”1″ が設定されます(wp-includes/upgrade.phpによる)。
    • WPのアップデートはしていたのですが、db_versionは更新されていませんでした。この問題には他の条件やパターンが影響している模様です。
  4. wp-includes/ms-default-contstants.php
    • ms_files_rewriting*_optionsor*_sitemetaテーブルに存在しない場合、”1″ が設定されます。
    • ms_files_rewritingはアップロード関連の定数を設定するのに使用されます。
      例)UPLOADBLOGSDIRUPLOADSBLOGUPLOADDIR
  5. wp-includes/functions.php
    • アップロードPATHやURLを設定するのにms_files_rewritingが使用されます。
  6. 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 を使うことになるかと思います。