WordPress по умолчанию складывает все медиафайлы в wp-content/uploads с разбивкой по годам и месяцам. На небольших сайтах этого хватает, но по мере роста папка превращается в хаос: тысячи файлов разных типов свалены в одну корневую директорию. KDA Custom Upload Structure даёт администраторам контроль над тем, где и как хранятся медиафайлы.
Возможности
1. Пользовательская папка загрузки
Укажите относительный путь к любому каталогу вне wp-content/uploads — например, /assets/public/ или /media/. Папка создаётся автоматически при сохранении; в неё помещается index.php-заглушка (защита от просмотра каталога), права нормализуются до 0644. Запрещены пути внутри системных папок (wp-admin, wp-includes, wp-content/plugins, wp-content/themes) — в таких случаях используется безопасный путь по умолчанию.
2. Организация по типу записи
Файлы раскладываются по подпапкам с именами типов записей: assets/public/films/, assets/public/products/, а неприкреплённые — в настраиваемую папку «Другие».
3. Папки Год/месяц
Сохраняется привычная разбивка 2024/08/ внутри кастомной папки. Год и месяц берутся из post_date, поэтому точны даже при переносе записей между датами. Вместе с организацией по типу записи даёт структуру вида assets/public/films/2024/08/.
4. Транслитерация имён
Кириллические и другие нелатинские имена (например, Мой-Отчет-2024.pdf) превращаются в Moj-Otchet-2024.pdf: замена символов на латиницу, удаление небезопасных знаков, схлопывание повторных дефисов. Важно для совместимости с Linux-серверами и CDN, а также для публикации открытых ссылок на файлы.
5. Префикс ID записи
К имени файла можно добавлять ID записи: photo.jpg → 42-photo.jpg. Префикс ставится только при наличии у пользователя права edit_post — это блокирует злоупотребление через поддельный параметр post_id. По умолчанию выключено.
6. Инструмент миграции
Переход на новую структуру не требует ручной перезагрузки. Мигратор (отдельная вкладка) умеет: сухой прогон (показывает объём без фактического перемещения), пакетную миграцию с индикатором прогресса и автовозобновлением (без AJAX-таймаутов), обратную миграцию в wp-content/uploads с обновлением URL в контенте и postmeta, замену URL в сериализованных данных, повторный прогон для неудач, проверку свободного места и откат текущего пакета при ошибке. Перед запуском — обязательный бэкап сайта и БД.
7. Мультисайт
В сетях WordPress опция «Подпапка для каждого сайта» добавляет суффикс вида /blog-2, изолируя загрузки разных сайтов сети.
8. Отключение генерации размеров
Если нужны только оригиналы, плагин отключает создание миниатюр (thumbnail, medium, large) при загрузке — экономия места и ускорение.
Настройка
Все опции — на странице Настройки → Структура загрузки: путь к папке, организация по типу записи, папки год/месяц, транслитерация, префикс ID, отключение миниатюр, мультисайт и название папки «Другие». Там же — превью итоговой иерархии для тестовой записи. Перехват путей работает через фильтр upload_dir и активен только при включённом плагине, что гарантирует безопасный откат.
Безопасность
- Каждая папка загрузки защищена
index.php-заглушкой от просмотра через веб-сервер. - Права на загруженные файлы нормализуются до 0644 (исключает ошибки 403 Forbidden).
- Все AJAX-запросы и действия миграции защищены nonce-проверками.
- Префикс ID записи добавляется только при наличии у пользователя capability
edit_post. - При деинсталляции (
uninstall.php) полностью очищаются все сохранённые опции и транзиенты.
Технические детали
В основе — стандартный WordPress-фильтр:
add_filter( 'upload_dir', [ __CLASS__, 'filter_upload_dir' ], 10, 1 );
Функция filter_upload_dir() модифицирует массив $uploads (basedir, baseurl, path, url, subdir), поэтому wp_upload_dir() и wp_get_attachment_url() работают с новыми путями прозрачно. Мигратор использует WP_Filesystem API (с fallback на нативный rename()), обновляет записи в wp_posts (поля guid и _wp_attachment_metadata) и опционально заменяет URL в содержимом записей с учётом формата сериализации PHP.
Структура плагина:
| Файл | Назначение |
|---|---|
kda-custom-upload-structure.php |
Главный класс: регистрация хуков, вычисление путей, трансформация имён, фильтр upload_dir. |
includes/class-kda-cus-admin.php |
Страница настроек, регистрация опций, разметка полей, JS-интерфейс. |
includes/class-kda-cus-migrator.php |
Мигратор: сканирование, пакетное перемещение, обновление БД, сухой прогон, откат. |
uninstall.php |
Очистка данных при удалении плагина. |
Компоненты строятся вокруг общего класса KDA_Upload_Structure, который инкапсулирует вычисление базового пути (compute_base) и используется и админкой, и мигратором — без дублирования кода.
Установка и первый запуск
- Установите плагин из репозитория WordPress или напрямую через админ-панель.
- Активируйте плагин.
- Откройте Настройки → Структура загрузки, задайте нужные опции и сохраните.
- При необходимости запустите миграцию существующих файлов на вкладке Миграция.
Заключение
KDA Custom Upload Structure — продуманный инструмент для администраторов и разработчиков, которым нужна гибкая организация медиафайлов. Он не навязывает конкретную структуру, а даёт набор связанных опций, из которых собирается конфигурация под проект. Безопасный мигратор с сухим прогоном и откатом снимает главный риск — повредить медиатеку при смене структуры. Поддержка мультисайта, транслитерация, отключение миниатюр и нормализация прав делают плагин универсальным решением для проектов любого масштаба.
Вопросы и ответы
Оставить комментарий