1. 概要
このプラグインは、WordPress 標準のメディアライブラリに登録せず、静的ファイル一式を FTP に近い感覚で安全に配置・管理するためのものです。
できること
- ZIP をフォルダ構造のまま展開
- 対応ブラウザではフォルダ直接アップロード
- 任意の仮想フォルダを先に作成
- 作成した仮想フォルダパスの履歴を画面で確認
- 実ディレクトリ階層に対応した URL を表示・コピー
- ファイル削除、保存先ルート単位削除
- アップロード履歴をページ送りしながら確認
- 履歴からアップロード内容を展開表示
やらないこと
- attachment post の作成
- メディアライブラリ登録
- サムネイル生成や派生画像生成
- 年月フォルダ分割
向いている用途
- LP 一式の配布
- 外注制作物の受け取り
- HTML/CSS/JS/画像の構成維持公開
- CDN 連携前提の静的アセット置き場
2. 今回の変更点
| 変更点 | 内容 |
|---|---|
| 仮想フォルダ | site-assets 配下に、管理画面から任意の階層を事前作成できます。例: clients/acme/campaigns |
| 保存先指定 | ZIP、フォルダ、個別ファイルの各アップロードで、仮想フォルダと保存先ルート名を組み合わせて保存できます。個別ファイルは保存先ルート名が空欄ならそのまま現在のフォルダへ保存されます。 |
| 履歴管理 | アップロード履歴は 5,000 件、仮想フォルダ作成履歴は 1,000 件まで保持し、超過分は古いものから自動削除します。 |
| 履歴一覧 | アップロード履歴・仮想フォルダ履歴ともに 100 件ずつページ送りで確認できます。アップロード履歴は中身をフォルダ構造のまま展開表示できます。 |
| 削除導線 | 仮想フォルダ履歴から仮想フォルダごと削除でき、アップロード履歴のツリー内ではファイル個別削除、履歴行からは batch 単位削除ができます。 |
| 説明書の配置 | 説明書 HTML はプラグイン直下ではなく docs/manual/index.html に移動しました。 |
3. インストール
folder-structure-uploaderフォルダをwp-content/plugins/に配置します。- 管理画面の プラグイン から Folder Structure Uploader for WordPress を有効化します。
- 左メニューの Folder Uploader を開きます。
- 必要に応じて拒否拡張子を調整します。
有効化時に作られるもの
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/acmeprojects/2026/springlanding-pages
../、絶対パス、ドット始まりのセグメント、不正文字を含むパスは拒否されます。
6. アップロード手順
6-1. ZIP アップロード
- 保存先仮想フォルダ を必要に応じて入力します。
- 保存先ルート名 を必要に応じて入力します。
- ZIP ファイル を選択します。
- 既存ファイルがある場合 を選びます。
- 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. フォルダ直接アップロード
- 対応ブラウザで フォルダを選択 を使います。
- ブラウザが相対パスを取得できると、検出ファイル数が表示されます。
- ZIP と同じく、仮想フォルダ、保存先ルート名、競合時動作を指定してアップロードします。
6-3. 個別ファイルアップロード
- 保存先仮想フォルダ を必要に応じて入力します。
- 保存先ルート名 を入力します。空欄なら現在の仮想フォルダ直下へそのまま保存されます。
- ファイルを選択 で 1 件または複数件を選びます。
- 個別ファイルをアップロード を押します。
例: 選択ファイル 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 に紐づくファイルを削除でき、展開したツリー内ではファイル単位でも削除できます。仮想フォルダ履歴からはフォルダごと一括削除できます。
アップロード履歴テーブルの主なカラム
| カラム | 内容 |
|---|---|
batch_id | 1 回のアップロードを識別する ID |
upload_type | zip、folder、file |
storage_virtual_folder | 指定した仮想フォルダ |
storage_root_folder | 保存先ルート名 |
storage_root_path | 仮想フォルダ込みの保存先フルパス |
saved_count | 保存成功件数 |
skipped_count | スキップ件数 |
error_count | エラー件数 |
result_text | 内部保持している詳細ログ |
仮想フォルダ履歴テーブルの主なカラム
| カラム | 内容 |
|---|---|
virtual_folder_path | 作成した仮想フォルダパス |
public_url | その仮想フォルダのベース URL |
action_type | created、existing、deleted |
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. 確認テスト
clients/acmeの仮想フォルダを作成できるか確認する。- 仮想フォルダ作成後に履歴へ表示され、公開 URL を確認できるか確認する。
lp_2026/index.htmlを含む ZIP を仮想フォルダ付きでアップロードし、同じ階層で保存されるか確認する。- 個別ファイルを複数選択して、指定した保存先ルート直下へ保存されるか確認する。
- 個別ファイルで保存先ルート名を空欄にしたとき、現在の仮想フォルダ直下にそのまま保存されるか確認する。
- 公開 URL が仮想フォルダ込みで生成されるか確認する。
- 競合設定の
上書き / スキップ / エラーが正しく動くか確認する。 - アップロード履歴で batch を展開したとき、実際のフォルダ構造が維持されたまま確認できるか確認する。
- ネストしたフォルダをさらにクリックして、下位フォルダやファイルが展開されるか確認する。
- ツリー内の各ファイルにある個別削除ボタンが動作するか確認する。
- アップロード履歴と仮想フォルダ履歴の両方で 次の 100 件 が機能するか確認する。
- 5,000 件を超えたときに古い履歴が削除されるか確認する。
- 仮想フォルダ削除時に確認ダイアログが出て、配下ファイルごと削除されるか確認する。
- アップロード履歴からの削除が batch 単位で正しく動くか確認する。
12. 拡張ポイント
- 特定フォルダの公開停止
- Basic 認証相当のアクセス制御
- 有効期限付き URL
- CDN 連携
- 一括置換アップロード
- バージョン管理