Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/atsushia/next-wp-media-reclassification/archive/refs/heads/main.zipNo built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.
WordPressメディアライブラリのファイルを年/月のフォルダ構造に再分類するプラグインです。
概要
WordPress の「メディアファイルを年月ベースのフォルダーに整理」設定が無効になっている状態でアップロードされたメディアファイルを、後から年/月のフォルダ構造に整理し直すことができます。
主な機能
- メディアファイルを
年/月フォルダに自動移動 - データベース情報の自動更新
- 投稿・固定ページ内のメディアパスの自動更新
- サムネイル画像も一緒に移動
- ドライラン(テスト実行)モード
- バッチ処理による大量ファイルの対応
- 処理ログのファイル出力機能(エラー調査・トラブルシューティング用)
- ログファイルの管理機能(一覧表示、ダウンロード、削除)
- WP-CLI対応
インストール
- このプラグインを
/wp-content/plugins/wp-media-reclassification/ディレクトリにアップロード - WordPress管理画面の「プラグイン」メニューからプラグインを有効化
- 「ツール」→「メディア再分類」で管理画面にアクセス
使い方
管理画面から実行
- WordPress管理画面の「ツール」→「メディア再分類」にアクセス
- 必要に応じて処理オプションを設定
- ドライラン: 実際に移動せずにテスト実行
- バッチサイズ: 一度に処理する件数(デフォルト: 50件)
- 日付範囲: 特定期間のメディアのみ処理
- ログ出力: 処理ログをファイルに出力(エラー調査に有用)
- エラーのみログ出力: エラーと警告のみをログに記録(ログファイルサイズを削減)
- 「対象件数を確認」ボタンをクリック
- 「処理を開始」ボタンをクリックして実行
- 処理完了後、ログファイル情報が表示されます(ログ出力を有効にした場合)
WP-CLIから実行
# ドライラン(テスト実行)
wp media reclassify --dry-run
# 50件のメディアを処理
wp media reclassify --batch-size=50
# 特定期間のメディアを処理
wp media reclassify --date-from=2023-01-01 --date-to=2023-12-31
# すべてのメディアを処理
wp media reclassify --all
# ログ出力を有効にして処理
wp media reclassify --all --log
# ログファイル名を指定
wp media reclassify --log --log-file=my-reclassification.log
# エラーのみログに記録
wp media reclassify --all --log --error-only
WP-CLIコマンドオプション
--dry-run: ドライランモード(実際にファイルを移動しない)--batch-size=<数値>: バッチサイズ(デフォルト: 50)--date-from=<日付>: 開始日(YYYY-MM-DD形式)--date-to=<日付>: 終了日(YYYY-MM-DD形式)--all: すべてのメディアを処理--log: 処理ログをファイルに出力--log-file=<ファイル名>: ログファイル名を指定(デフォルト: reclassification-YYYY-MM-DD_HH-MM-SS.log)--error-only: エラーと警告のみをログに記録(ログファイルサイズを削減)
注意事項
実行前に必ず行うこと
- データベースのバックアップ
- メディアファイルのバックアップ
- ドライランでのテスト実行
その他の注意点
- 処理中はサイトのバックアップを取らないでください
- 大量のファイルを処理する場合はWP-CLIの使用を推奨します
- 既に年/月フォルダにあるファイルは自動的にスキップされます
- ファイル名が重複する場合は連番が付加されます
処理内容の詳細
このプラグインは以下の処理を実行します:
-
メディアファイルの移動
- 元ファイルを
uploads/年/月/フォルダに移動 - サムネイル画像も同じフォルダに移動
- 元ファイルを
-
データベースの更新
_wp_attached_fileメタデータを更新_wp_attachment_metadataメタデータを更新
-
コンテンツの更新
- 投稿本文(post_content)内のURLを更新
- 固定ページ本文内のURLを更新
- カスタムフィールド(post_meta)内のURLを更新
ログ機能
ログファイルの出力
処理ログをファイルに出力することで、エラーの詳細調査やトラブルシューティングが可能です。
- 保存場所:
wp-content/uploads/wp-media-reclassification-logs/ - ファイル名:
reclassification-YYYY-MM-DD_HH-MM-SS.log(カスタマイズ可能) - セキュリティ:
.htaccessで直接アクセスを制限 - ログレベル: ERROR(エラー)、WARNING(警告)、INFO(情報)、SUCCESS(成功)
- エラーのみモード: エラーと警告のみを記録してログファイルサイズを削減可能
ログに記録される情報
- 添付ファイルが見つからない場合
- ファイルが存在しない場合
- 既に正しいフォルダにある場合(スキップ)
- ディレクトリ作成失敗
- ファイル移動失敗
- データベース更新失敗
- 処理成功(ファイルパス、移動元、移動先)
ログファイルの管理
管理画面の「ログファイル一覧」セクションで以下の操作が可能です:
- ログファイル一覧の表示(ファイル名、サイズ、最終更新日時)
- ログファイルのダウンロード
- 個別ログファイルの削除
- 30日以上前のログファイルを一括削除
エラーハンドリング
- ファイル移動に失敗した場合はログに記録し、次のファイルに進みます
- データベース更新に失敗した場合もログに記録されます
- 管理画面では処理結果とエラーリストが表示されます
- ログ出力を有効にすると、詳細なエラー情報がファイルに記録されます
システム要件
- WordPress 5.0以上
- PHP 7.4以上
- WP-CLI(コマンドライン実行時)
ライセンス
GPL v2 or later
変更履歴
1.1.0
- セキュリティ修正:
$_POST/$_GET処理にwp_unslash()を追加 - セキュリティ修正: バッチサイズのサーバーサイドバリデーション追加(1〜500)
- セキュリティ修正: 日付フォーマットのサーバーサイドバリデーション追加
- セキュリティ修正: ログファイルダウンロード時の
Content-Dispositionヘッダーをrawurlencode()でエンコード - セキュリティ修正:
rename()のエラー抑制演算子(@)を除去 uninstall.phpを追加してプラグイン削除時のクリーンアップを実装
1.0.0
- 初回リリース
- 基本的なメディア再分類機能
- 管理画面UI
- WP-CLIコマンド
- ドライランモード
- バッチ処理
- 処理ログのファイル出力機能
- ログファイルの管理機能(一覧、ダウンロード、削除)
サポート
問題が発生した場合は、以下を確認してください:
- WordPressとPHPのバージョンが要件を満たしているか
- ファイルとディレクトリの書き込み権限が適切か
- ドライランモードでエラーが出ないか
- ログ出力を有効にして詳細なエラー情報を確認
開発者向け情報
ディレクトリ構成
wp-media-reclassification/
├── wp-media-reclassification.php (メインファイル)
├── includes/
│ ├── class-logger.php (ログ出力)
│ ├── class-media-reclassifier.php (コア処理)
│ ├── class-admin-page.php (管理画面)
│ └── class-wp-cli-command.php (WP-CLI)
├── assets/
│ ├── js/
│ │ └── admin.js
│ └── css/
│ └── admin.css
├── spec.md (仕様書)
└── README.md
フィルターフック
現在、カスタムフィルターフックは提供していません。将来のバージョンで追加予定です。
貢献
バグ報告や機能リクエストは、GitHubのIssuesでお願いします。