Folder Structure Uploader for WordPress

WordPress 管理画面から ZIP、フォルダ、個別ファイルをアップロードし、/wp-content/uploads/site-assets/ 配下へ安全に保存・公開するためのプラグイン説明書です。バージョン 1.5.2 では、履歴の中身表示でネストしたフォルダ構造を維持し、フォルダごとの展開表示とファイル個別削除に対応しました。

メディアライブラリ非連動 仮想フォルダ対応 個別ファイル対応 アップロード履歴 5,000 件 仮想フォルダ履歴 1,000 件 履歴ツリー表示対応

最初に見る操作画面

管理画面は、上側でアップロード、下側で履歴確認という流れです。ZIP、フォルダ、個別ファイルを選んで保存し、あとから履歴でフォルダ構造ごと開いて URL コピーや削除までできます。

アップロード欄: 仮想フォルダ、保存先ルート名、競合時動作を指定してそのまま配置できます。
履歴欄: 作成済みの仮想フォルダやアップロード済み batch を 100 件ずつ遡って確認できます。
展開ツリー: ネストしたフォルダもそのまま開けて、各ファイルの URL コピーや個別削除ができます。
Folder Structure Uploader for WordPress
仮想フォルダ作成
clients/acme/campaigns
仮想フォルダを作成
ZIP アップロード
保存先仮想フォルダ: clients/acme
保存先ルート名: lp_2026
ZIP を選んでそのまま構造維持で展開
ZIP をアップロード
フォルダ直接アップロード
フォルダを選択
相対パスを維持して保存
個別ファイルアップロード
保存先ルート名が空欄なら今の仮想フォルダ直下へ
個別ファイルをアップロード
アップロード履歴を開いたときの見え方
FOLDER batch_20260323_xxxxxxxx 保存先: clients/acme/lp_2026
lp_2026/ 10 ファイル / 3 フォルダ
images/ 4 ファイル / 1 フォルダ
hero/ 2 ファイル
main.jpg 348 KB
images/hero/main.jpg
URL をコピー 削除
sub.jpg 212 KB
images/hero/sub.jpg
URL をコピー 削除
thumb.jpg 96 KB
images/thumb.jpg
URL をコピー 削除
css/ 2 ファイル
js/ 1 ファイル

見どころ

  • アップロード欄は WordPress 管理画面らしいシンプルな構成です。
  • 履歴を開くと、実際のフォルダ構造のまま内容を追えます。
  • ファイルごとの URL コピーと削除が同じ場所で完結します。

インストール前に伝わること

このプラグインは「メディアライブラリとは別の静的ファイル置き場」を WordPress 管理画面の中に作るイメージです。FTP を開かなくても、案件単位のフォルダ管理までそのまま進められます。

1. 概要

このプラグインは、WordPress 標準のメディアライブラリに登録せず、静的ファイル一式を FTP に近い感覚で安全に配置・管理するためのものです。

できること

  • ZIP をフォルダ構造のまま展開
  • 対応ブラウザではフォルダ直接アップロード
  • 任意の仮想フォルダを先に作成
  • 作成した仮想フォルダパスの履歴を画面で確認
  • 実ディレクトリ階層に対応した URL を表示・コピー
  • ファイル削除、保存先ルート単位削除
  • アップロード履歴をページ送りしながら確認
  • 履歴からアップロード内容を展開表示

やらないこと

  • attachment post の作成
  • メディアライブラリ登録
  • サムネイル生成や派生画像生成
  • 年月フォルダ分割

向いている用途

  • LP 一式の配布
  • 外注制作物の受け取り
  • HTML/CSS/JS/画像の構成維持公開
  • CDN 連携前提の静的アセット置き場
推奨: 一番安定している経路は ZIP アップロードです。複数ファイルを本番へ載せる運用では ZIP を基本にするとミスが減ります。

2. 今回の変更点

変更点 内容
仮想フォルダ site-assets 配下に、管理画面から任意の階層を事前作成できます。例: clients/acme/campaigns
保存先指定 ZIP、フォルダ、個別ファイルの各アップロードで、仮想フォルダと保存先ルート名を組み合わせて保存できます。個別ファイルは保存先ルート名が空欄ならそのまま現在のフォルダへ保存されます。
履歴管理 アップロード履歴は 5,000 件、仮想フォルダ作成履歴は 1,000 件まで保持し、超過分は古いものから自動削除します。
履歴一覧 アップロード履歴・仮想フォルダ履歴ともに 100 件ずつページ送りで確認できます。アップロード履歴は中身をフォルダ構造のまま展開表示できます。
削除導線 仮想フォルダ履歴から仮想フォルダごと削除でき、アップロード履歴のツリー内ではファイル個別削除、履歴行からは batch 単位削除ができます。
説明書の配置 説明書 HTML はプラグイン直下ではなく docs/manual/index.html に移動しました。

3. インストール

  1. folder-structure-uploader フォルダを wp-content/plugins/ に配置します。
  2. 管理画面の プラグイン から Folder Structure Uploader for WordPress を有効化します。
  3. 左メニューの Folder Uploader を開きます。
  4. 必要に応じて拒否拡張子を調整します。

有効化時に作られるもの

  • wp-content/uploads/site-assets/ ディレクトリ
  • {wp_prefix}fsuwp_manifest テーブル
  • {wp_prefix}fsuwp_history テーブル
  • {wp_prefix}fsuwp_virtual_folder_history テーブル
  • fsuwp_settings オプション
補足: 既存環境でプラグインを差し替えた場合でも、バージョン差分を見て必要なテーブルやカラムを自動で補完します。

4. 管理画面の見方

エリア 内容 用途
保存先情報 物理保存先、公開 URL 基準、アップロード履歴件数、仮想フォルダ履歴件数、説明書リンク 運用中の基本情報を確認
セキュリティ設定 拒否拡張子の編集 許可ポリシーの調整
仮想フォルダ作成 site-assets 配下に任意の階層を作成 案件別の受け皿を先に用意
ZIP / フォルダ / 個別ファイルアップロード 仮想フォルダ、保存先ルート名、競合時動作を指定 主なファイル配置作業
アップロード履歴 100 件ずつページ送り表示、batch ごとのフォルダツリー展開、履歴単位削除 作業記録の確認、アップロード内容の把握、ファイル削除
仮想フォルダ作成履歴 100 件ずつページ送り表示、仮想フォルダパスと URL の確認、削除導線 過去に作成したパスの確認、再利用、一括削除

5. 仮想フォルダ

仮想フォルダは、site-assets 配下に作る任意の中間フォルダです。案件や顧客単位で保存領域を分けたいときに使います。

例: 仮想フォルダ
clients/acme/campaigns

保存先ルート名
lp_2026

実際の保存先
wp-content/uploads/site-assets/clients/acme/campaigns/lp_2026/...

入力例

  • clients/acme
  • projects/2026/spring
  • landing-pages
履歴表示: 作成した仮想フォルダは専用履歴として 1,000 件まで保存され、管理画面では 100 件ずつページ送りで確認できます。あとでパスを忘れても確認しやすくしています。
注意: ../、絶対パス、ドット始まりのセグメント、不正文字を含むパスは拒否されます。

6. アップロード手順

6-1. ZIP アップロード

  1. 保存先仮想フォルダ を必要に応じて入力します。
  2. 保存先ルート名 を必要に応じて入力します。
  3. ZIP ファイル を選択します。
  4. 既存ファイルがある場合 を選びます。
  5. ZIP をアップロード を押します。
ZIP 内の構成
lp_2026/
  index.html
  css/
    style.css
  js/
    app.js

仮想フォルダ
clients/acme

保存先
wp-content/uploads/site-assets/clients/acme/lp_2026/index.html
wp-content/uploads/site-assets/clients/acme/lp_2026/css/style.css
wp-content/uploads/site-assets/clients/acme/lp_2026/js/app.js

6-2. フォルダ直接アップロード

  1. 対応ブラウザで フォルダを選択 を使います。
  2. ブラウザが相対パスを取得できると、検出ファイル数が表示されます。
  3. ZIP と同じく、仮想フォルダ、保存先ルート名、競合時動作を指定してアップロードします。
補足: 一部ブラウザでは相対パスが取れないため、フォルダ構造維持が不安定になることがあります。その場合は ZIP アップロードを使ってください。

6-3. 個別ファイルアップロード

  1. 保存先仮想フォルダ を必要に応じて入力します。
  2. 保存先ルート名 を入力します。空欄なら現在の仮想フォルダ直下へそのまま保存されます。
  3. ファイルを選択 で 1 件または複数件を選びます。
  4. 個別ファイルをアップロード を押します。
例: 選択ファイル
index.html
privacy.html
contact.css

仮想フォルダ
clients/acme

保存先ルート名
site-pages

保存先
wp-content/uploads/site-assets/clients/acme/site-pages/index.html
wp-content/uploads/site-assets/clients/acme/site-pages/privacy.html
wp-content/uploads/site-assets/clients/acme/site-pages/contact.css
保存先ルート名を空欄にした場合

仮想フォルダ
clients/acme

保存先
wp-content/uploads/site-assets/clients/acme/index.html
wp-content/uploads/site-assets/clients/acme/privacy.html
wp-content/uploads/site-assets/clients/acme/contact.css

6-4. 競合時動作

上書き

同じ保存先にある既存ファイルを置き換えます。

スキップ

既存ファイルがあるものだけ保存せず、結果では SKIPPED になります。

エラーにする

同名ファイルがあるものだけ保存拒否し、結果で明示します。

7. 保存パスと公開 URL

公開 URL は WordPress 標準の wp_upload_dir() で得た base URL を使い、実フォルダ階層をそのまま反映して生成します。

物理保存先
wp-content/uploads/site-assets/clients/acme/lp_2026/css/style.css

公開 URL
https://example.com/wp-content/uploads/site-assets/clients/acme/lp_2026/css/style.css
  • メディアライブラリ用の attachment URL は使いません。
  • 物理パスと URL パスが一致します。
  • 管理画面から URL をワンクリックでコピーできます。
  • HTML ファイルや単体 CSS / JS も通常ファイルとして同じ階層のまま公開されます。

8. 履歴

履歴は 2 種類あります。ひとつはアップロード履歴、もうひとつは仮想フォルダ作成履歴です。アップロード履歴にはバッチ単位の結果を、仮想フォルダ作成履歴には作成したパスと URL を保持します。

保持上限

アップロード履歴は最大 5,000 件、仮想フォルダ作成履歴は最大 1,000 件まで保持します。超えた分は古い順に自動削除されます。

ページ送り

両方の履歴とも 100 件ずつ表示され、次の 100 件 ボタンから続きの履歴を確認できます。

中身の展開表示

アップロード履歴では、各 batch の中に入っている内容をフォルダ構造のまま展開して確認できます。ネストしたフォルダもクリックでさらに開けます。

履歴から削除

アップロード履歴の各行からその batch に紐づくファイルを削除でき、展開したツリー内ではファイル単位でも削除できます。仮想フォルダ履歴からはフォルダごと一括削除できます。

仮想フォルダ履歴について: 仮想フォルダ作成履歴は管理画面上に一覧表示され、作成日時、状態、仮想フォルダパス、公開 URL を確認できます。削除ボタンから対象フォルダ配下を一括削除することもできます。

アップロード履歴テーブルの主なカラム

カラム 内容
batch_id1 回のアップロードを識別する ID
upload_typezipfolderfile
storage_virtual_folder指定した仮想フォルダ
storage_root_folder保存先ルート名
storage_root_path仮想フォルダ込みの保存先フルパス
saved_count保存成功件数
skipped_countスキップ件数
error_countエラー件数
result_text内部保持している詳細ログ

仮想フォルダ履歴テーブルの主なカラム

カラム 内容
virtual_folder_path作成した仮想フォルダパス
public_urlその仮想フォルダのベース URL
action_typecreatedexistingdeleted
note作成結果のメモ
created_at記録日時

9. セキュリティ

  • 実行可能なのは manage_options 権限ユーザーのみです。
  • すべての操作で nonce 検証を行います。
  • ../、絶対パス、NULL バイト、ドット始まりのパスを拒否します。
  • ZIP 内の各エントリを個別検証してから保存します。
  • 危険拡張子は管理画面設定で制御できます。
  • 保存先が必ず site-assets 配下に収まるか確認します。

デフォルト拒否拡張子

php, phtml, php3, php4, php5, phar, cgi, pl, exe, sh, bat, cmd, com, msi, htaccess

補足: 静的アセット用途のため js はデフォルト許可です。必要なら管理画面から拒否に変更してください。

10. トラブルシュート

ZIP がアップロードできない

  • ZIP 形式かを確認する
  • ZipArchive が有効か確認する
  • PHP のアップロードサイズ上限と実行時間上限を確認する

仮想フォルダが作れない

  • 入力パスに ../ や先頭ドットが含まれていないか確認する
  • wp-content/uploads/site-assets/ への書き込み権限を確認する

URL にアクセスできない

  • Web サーバーが wp-content/uploads/ を配信できるか確認する
  • サーバー設定やセキュリティプラグインで対象拡張子が止められていないか確認する
  • 保存されたファイルの権限を確認する

履歴が古いものから消える

  • 仕様通りです。アップロード履歴は 5,000 件、仮想フォルダ作成履歴は 1,000 件です。
  • 過去の履歴を確認したい場合は、管理画面の 次の 100 件 ボタンからページ送りで遡ってください。
  • 仮想フォルダのパスを忘れた場合は、管理画面の仮想フォルダ作成履歴を確認してください。

11. 確認テスト

  1. clients/acme の仮想フォルダを作成できるか確認する。
  2. 仮想フォルダ作成後に履歴へ表示され、公開 URL を確認できるか確認する。
  3. lp_2026/index.html を含む ZIP を仮想フォルダ付きでアップロードし、同じ階層で保存されるか確認する。
  4. 個別ファイルを複数選択して、指定した保存先ルート直下へ保存されるか確認する。
  5. 個別ファイルで保存先ルート名を空欄にしたとき、現在の仮想フォルダ直下にそのまま保存されるか確認する。
  6. 公開 URL が仮想フォルダ込みで生成されるか確認する。
  7. 競合設定の 上書き / スキップ / エラー が正しく動くか確認する。
  8. アップロード履歴で batch を展開したとき、実際のフォルダ構造が維持されたまま確認できるか確認する。
  9. ネストしたフォルダをさらにクリックして、下位フォルダやファイルが展開されるか確認する。
  10. ツリー内の各ファイルにある個別削除ボタンが動作するか確認する。
  11. アップロード履歴と仮想フォルダ履歴の両方で 次の 100 件 が機能するか確認する。
  12. 5,000 件を超えたときに古い履歴が削除されるか確認する。
  13. 仮想フォルダ削除時に確認ダイアログが出て、配下ファイルごと削除されるか確認する。
  14. アップロード履歴からの削除が batch 単位で正しく動くか確認する。

12. 拡張ポイント

  • 特定フォルダの公開停止
  • Basic 認証相当のアクセス制御
  • 有効期限付き URL
  • CDN 連携
  • 一括置換アップロード
  • バージョン管理
設計理由: WordPress の attachment に寄せず、実ファイルと独自 manifest / history を分けて持つ構成にしているため、将来の配信制御や監査機能を拡張しやすくなっています。